หนึ่งในผู้ประกอบการที่ไม่ดีควรได้รับอีก


18

WTF รายวันของวันนี้เสนอราคาของรหัสต่อไปนี้ ...

FailSafe==0?'No technical alarms':((FailSafe&1)!=0&&(FailSafe&2)!=0&&(FailSafe&4)!=0&&(FailSafe&8)!=0?'Detection zones staying in a given state; Bad visibility;
Initialization; Bad configuration':((FailSafe&1)!=0&&(FailSafe&2)!=0&&(FailSafe&4)!=0?'Detection zones staying in a given state; Bad visibility; Initialization':
((FailSafe&1)!=0&&(FailSafe&2)!=0&&(FailSafe&8)!=0?'Detection zones staying in a given state; Bad visibility; Bad configuration':((FailSafe&1)!=0&&(FailSafe&4)!=0&&
(FailSafe&8)!=0?'Detection zones staying in a given state; Initialization; Bad configuration':((FailSafe&2)!=0&&(FailSafe&4)!=0&&(FailSafe&8)!=0?'Bad visibility;
Initialization; Bad configuration':((FailSafe&1)!=0&&(FailSafe&2)!=0?'Detection zones staying in a given state; Bad visibility':((FailSafe&1)!=0&&(FailSafe&4)!=0?'Detection 
zones staying in a given state; Initialization':((FailSafe&1)!=0&&(FailSafe&8)!=0?'Detection zones staying in a given state; Bad configuration':((FailSafe&2)!=0&&
(FailSafe&4)!=0?'Bad visibility; Initialization':((FailSafe&2)!=0&&(FailSafe&8)!=0?'Bad visibility; Bad configuration':((FailSafe&4)!=0&&(FailSafe&8)!=0?'Initialization; Bad 
configuration':((FailSafe&1)!=0?'Detection zones staying in a given state':((FailSafe&2)!=0?'Bad visibility':((FailSafe&4)!=0?'Initialization':((FailSafe&8)!=0?'Bad 
configuration':'Unknown')))))))))))))))

เขียนโค้ดบางอย่างที่รับค่าจำนวนเต็มชื่อ FailSafe และส่งคืนสตริงเดียวกันกับที่โค้ดข้างต้นจะสร้างจากค่าจำนวนเต็มเดียวกัน

  • ความท้าทายคือการเขียนบรรทัดนั้นใหม่ดังนั้นโค้ด "สำเร็จรูป" ฟรีรวมถึงโค้ดใด ๆ ที่โหลดค่าจำนวนเต็มและส่งออกสตริง เฉพาะรหัสที่ดำเนินการแปลงข้างต้นจากจำนวนเต็มเป็นจำนวนสตริง
  • คุณอาจใช้ชื่ออื่นในการ "FailSafe" หากคุณต้องการตราบใดที่ตัวระบุที่คุณเลือกมีคะแนนกอล์ฟเดียวกัน
  • ไม่มีการเรียกทรัพยากรภายนอกเพื่อทำการค้นหา
  • มีการใช้กฎของสนามกอล์ฟรหัสปกติ

เราได้รับอนุญาตให้เก็บ FailSafe ในตัวแปรอื่น (เช่นf=FailSafeหรืออะไรทำนองนั้น) หรือไม่
ProgramFOX

@ProgramFOX ไม่เป็นไร แต่การมอบหมายนั้นรวมอยู่ในการนับ เฉพาะสำเร็จรูปที่นำคุณไปสู่จุดที่มีตัวแปรชื่อ FailSafe ฟรี
billpg

คุณช่วยพิมพ์รหัสให้เราได้ไหม หรือความท้าทายที่จะเข้าใจความท้าทายคืออะไร?
John Dvorak

3
@JanDvorak ฉันไม่แน่ใจว่าฉันสามารถ ...
billpg

2
ฉันหวังว่าสิ่งนี้: pastebin.com/jzXt4fspดีกว่าที่จะอ่าน
eithed

คำตอบ:


5

Ruby, 210 ตัวอักษร

คล้ายกับโซลูชันของ @Jan Dvorak แต่ใช้งานได้มากกว่าและสั้นกว่าเล็กน้อย

f=FailSafe
e=[f&1,f&2,f&4,f&8,1-f].zip(["Detection zones staying in a given state","Bad visibility","Initialization","Bad configuration","No technical alarms"]).map{|a,b|a>0&&b}-[!0]
e[0]||="Unknown"
e.join"; "

5

GolfScript 167 ตัวอักษร

FailSafe.15&["Unknown"][""]"Bad configuration
Initialization
Bad visibility
Detection zones staying in a given state"
n/{`{n+1$+}+%}/1>+=n%"; "*"No technical alarms"if

รหัสจะถือว่าค่าในตัวแปรFailSafeและผลักดันผลลัพธ์ในสแต็ก (เช่นเอาท์พุทสตริงถ้าเรียกใช้เป็นโปรแกรมแบบสแตนด์อโลน) คุณสามารถทดสอบโค้ดออนไลน์

รหัสพื้นสร้างอาร์เรย์ของทั้งหมด 16 FailSafeผลลัพธ์ที่เป็นไปได้เลือกเกิดข้อผิดพลาดขึ้นอยู่กับสี่บิตต่ำสุดของ ด้านนอกสุดifจะจัดการกับตัวพิมพ์ใหญ่เป็นศูนย์


ผมคิดorแทนจะช่วยให้คุณประหยัดif .แต่ฉันยอมรับว่าฉันไม่ได้พยายามถอดรหัสรหัสต้นฉบับ
Peter Taylor

4

Rebol / Red: 208 ตัวอักษร

ฉันไม่ได้เป็นที่สนใจในการเล่นกอล์ฟนี้ในขณะที่ยอมรับว่าผู้ประกอบการ ternary ซ้อนกันเป็นที่น่ารำคาญ ... และกล่าวขวัญนี้เป็นจริงตัวอย่างที่ดีสำหรับ REBOL / แดงกรณี เกี่ยวข้องกับสวิทช์และช่วยให้สิ่งต่าง ๆ แผ่ออกไปเช่นนี้

f: FailSafe
append case [
    0 < f and 1 ["Detection zones staying in a given state"]
    1 < f and 2 ["Bad visibility"]
    3 < f and 4 ["Initialization"]
    7 < f and 8 ["Bad configuration"]
    f > 0 ["Unknown"]
    true ["No technical alarms"]
] "; "

มีตัวแปรที่เรียกว่า CASE / ALL ซึ่งจริง ๆ แล้วจะเรียกใช้เงื่อนไขทั้งหมด แต่ค่าเริ่มต้นจะหยุดหลังจากตัวจริงตัวแรก

ฉันจะ "เล่นกอล์ฟ" มันถึง 208:

x: func [y] [y <(f: FailSafe) และ ++ y] ต่อท้ายกรณี [x 0 ["โซนตรวจจับอยู่ในสถานะที่กำหนด"] x 1 ["การมองเห็นไม่ดี"] x 3 ["การเริ่มต้น"] y 7 ["การตั้งค่าไม่ดี"] f> 0 ["ไม่ทราบ"] 1 ["ไม่มีสัญญาณเตือนทางเทคนิค"]] ";"


4

APL (172)

2↓⊃,/'; '∘,¨{⍵=0:⊂'No technical alarms'⋄0=16|⍵:⊂'Unknown'⋄'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2}FailSafe

คำอธิบาย:

  • {... }FailSafe: สร้างสตริง
    • ⍵=0:⊂'No technical alarms': 0กรณี
    • 0=16|⍵:⊂'Unknown': Unknownเคส (FailSafe ไม่ใช่ 0 แต่สี่บิตแรกเป็น)
    • 'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2: รับบิตต่ำสุด 4 ในอาร์กิวเมนต์ ( ⍵⊤⍨4/2), reverse ( ) และเลือกสตริงสำหรับบิตที่อยู่บน ( /⍨)
  • '; '∘,¨: เพิ่ม'; 'ที่ด้านหน้าของแต่ละสตริงที่ส่งคืน
  • ⊃,/: เข้าร่วมสตริงทั้งหมดเข้าด้วยกัน
  • 2↓: และลบอักขระสองตัวแรก (เนื่องจากมีส่วนเกิน'; 'ที่ด้านหน้า)

บันทึกไบต์ที่สองโดยการเปลี่ยนไป⊃,/
อดัม

3

Ruby, อักขระ 183 ตัว

[(f=FailSafe)<1?"No technical alarms":f&15<1?:Unknown:["Detection zones staying in a given state"*f[0],"Bad visibility"*f[1],"Initialization"*f[2],"Bad configuration"*f[3]]-[""]]*"; "

อีกวิธีหนึ่งของ Ruby แต่จะสั้นกว่าโซลูชันอื่นเล็กน้อย นี่เป็นนิพจน์เดียวที่ใช้ค่าคงที่FailSafe(ใน Ruby ตัวระบุตัวพิมพ์ใหญ่ทั้งหมดเป็นค่าคงที่) เพื่อสร้างสตริงเอาต์พุต


ในทับทิมคุณควรประกาศค่าคงที่ (เช่นFailSafe) ก่อนใช้ และคุณเพิ่มรหัสuninitialized constant FailSafe

4
@ Зелёныйตามที่คำถามระบุ: "เขียนโค้ดบางอย่างที่รับค่าจำนวนเต็มชื่อ FailSafe" - ดังนั้นรหัสของฉัน (เช่นคำตอบอื่น ๆ ทั้งหมดที่นี่) จะถือว่าFailSafeเรียบร้อยแล้ว เมื่อคุณต้องการเรียกใช้รหัสคุณจะต้องกำหนดค่าคงที่ตัวเองก่อน
Ventero

2

จาวาสคริปต์, 197 195 ตัวอักษร

FailSafe?['Detection zones staying in a given state','Bad visibility','Initialization','Bad configuration'].filter(function(_,i){return FailSafe&1<<i}).join('; ')||'Unknown':'No technical alarms'

จัดรูปแบบ:

FailSafe
  ? [ 'Detection zones staying in a given state',
      'Bad visibility',
      'Initialization',
      'Bad configuration'
    ].filter(function(_, i) {
      return FailSafe & 1<<i;
    }).join('; ') || 'Unknown'
  : 'No technical alarms';

อาจลดลงอีกโดยใช้การแสดงออกของฟังก์ชั่น ES6 หรือ Coffeescript


เกิดอะไรขึ้นถ้า FailSafe คือ 18 (ที่จริงแล้วรหัสการท้าทายเดิมจะดูที่ 4 บิตที่ต่ำกว่าดังนั้นกรณีที่ไม่รู้จักจะไม่ถูกตรวจพบ!) ดังนั้นคำถามคือถ้าเราควรสนใจมันจริง ๆ หรือให้อัลกอริทึม "คงที่"
blabla999

@ blabla999: มันจะกลับมา"Bad visibility"เพราะการตั้งค่าแบบ 2 บิตและไม่มีบิตอื่น ๆ ที่ต่ำกว่า 4 บิต Unknownกรณีที่เกิดขึ้นเมื่อไม่มีต่ำกว่า 4 บิตถูกตั้งค่า แต่FailSafeเป็น!= 0- เช่นเดียวกับในรหัสเดิม (ลอง16) ไม่ว่าเราควรจะ "แก้ไข" สิ่งนี้คุณควรถาม OP (ในความคิดเห็นในคำถาม) ไม่ใช่ฉัน ...
Bergi

คุณก็ถูกแล้ว - ฉันโง่ ฉันสับสนมากกับโค้ดนั้น ขอโทษสำหรับสิ่งนั้น.
blabla999

2

Ruby, 213 ตัวอักษร

f=failSafe
e=f&1>0?["Detection zones staying in a given state"]:[]
e+=["Bad visibility"]if f&2>1
e+=["Initialization"]if f&4>3
e+=["Bad configuration"]if f&8>7
e[0]||=f>0?"Unknown":"No technical alarms"
e.join"; "

วิธีนี้จะใช้งานได้ดีเมื่ออยู่ในฟังก์ชันของตัวdef transform failSafe; ...; endเครื่อง นอกจากนี้ยังสามารถใช้เป็นนิพจน์เดียว (ล้อมรอบในวงเล็บเนื่องจากเซมิโคลอน / ขึ้นบรรทัดใหม่มีลำดับความสำคัญต่ำสุด) หรือเป็นลำดับของข้อความสั่งที่มีนิพจน์สุดท้าย ( e.join"; ") ที่ใช้ภายในนิพจน์


ฉันจะเพิ่มกฎเพื่อให้ชื่ออื่น
billpg

e+=["Initialization"]if f&4>3ฉันต้องการสิ่งนี้ใน Python
Julıʇǝɥʇuʎs

@ ɐɔıʇǝɥʇuʎsคุณไม่ประทับใจ[]||=ใช่มั้ย
John Dvorak

ไม่แน่ใจว่าสิ่งที่มันไม่ ... นอกจากนี้: since FailSafe must be a constant in Rubyอืมมม ทัศนคติของงูใหญ่มีมากขึ้นเช่น "ใช่คุณสามารถทำลายสิ่ง แต่ไม่ได้คาดหวังว่าฉันจะทำความสะอาดเป็นระเบียบ"
ɐɔıʇǝɥʇuʎs

1
@ ɐɔıʇǝɥʇuʎs ||=เป็นเหมือน+=แต่ด้วย||- เทียบเท่ากับa ||= b a = a || bมันถูกใช้โดยทั่วไปเพื่อเริ่มต้นตัวแปรเมื่อมันเป็นเท็จ
Aaron Dufour

1

VBScript, 204 234 232 ตัวอักษร

(แก้ไข: ปรับปรุงคะแนน 2 โดยใช้อาร์เรย์ () แทนที่จะแยก (). 232 ทันที)

f=failsafe:for b=0to 3:s=s&split(",; Detection zones staying in a given state,; Bad visibility,,; Initialization,,,,; Bad configuration",",")(f and 2^b):next:array("No technical alarms","Unknown",mid(s,3))(2+(f=0)+(len(s)=0))

(แก้ไข: ลืมส่วน "ไม่ทราบ" ตอนนี้ 234 ตัวอักษร)

f = ล้มเหลว: สำหรับ b = 0 ถึง 3: s = s & แยก (",; โซนตรวจจับที่อยู่ในสถานะที่กำหนด; ทัศนวิสัยไม่ดี ,,; การเริ่มต้น ,,,, การกำหนดค่าไม่ดี", ",") (f และ 2 ^ b): ถัดไป: แยก ("ไม่มีสัญญาณเตือนทางเทคนิค, ไม่ทราบ," & mid (s, 3), ",") (2+ (f = 0) + (len (s) = 0))

(ดั้งเดิม, 230)

สำหรับ b = 0 ถึง 3: s = s & แยก (",; โซนการตรวจจับที่อยู่ในสถานะที่กำหนด," การมองเห็นไม่ดี ,,; การเริ่มต้น ,,,,; การกำหนดค่าไม่ดี ",", ") (FailSafe และ 2 ^ b): ถัดไป : อาร์เรย์ (กลาง (s, 3), "ไม่มีสัญญาณเตือนทางเทคนิค") (- (len (s) = 0))

แน่นอนว่านี่เป็นเพียงส่วนหนึ่งของสคริปต์ เพื่อทดสอบลองสิ่งนี้:

FailSafe=cint(inputbox("Please enter Failsafe as an integer"))
f=failsafe:for b=0to 3:s=s&split(",; Detection zones staying in a given state,; Bad visibility,,; Initialization,,,,; Bad configuration",",")(f and 2^b):next
msgbox array("No technical alarms","Unknown",mid(s,3))(2+(f=0)+(len(s)=0))

ฉันก็ลืมกรณีที่ไม่ทราบ ;-)
blabla999

@ blabla999 แน่นอน แก้ไขแล้ว. ขอบคุณ!
JesterBLUE

1

Smalltalk, 243 ตัวอักษร

FailSave>15ifTrue:'Unknown'ifFalse:[((((1to:4)select:[:b|FailSafe isBitSet:b])collect:[:b|#('Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration')at:b])asStringWith:'; ')ifEmpty:'No technical alarms']     

จัดรูปแบบเพื่อให้อ่านง่าย:

FailSafe > 15 
    ifTrue:'Unknown'
    ifFalse:[
        ((((1 to:4)
            select:[:b | FailSafe isBitSet:b ])
                collect:[:b| 
                    #( 'Detection zones staying in a given state'
                       'Bad visibility'
                       'Initialization'
                       'Bad configuration') at:b ]
                    ) asStringWith:'; ')
                        ifEmpty:'No technical alarms']

ขอบคุณ Bergi สำหรับการชี้ไปที่ข้อบกพร่องในรุ่นแรก

สิ่งนี้ทำให้เกิดแนวคิด: ถ้าฉันแมปค่า FailSafe เป็นมาส์ก 6 บิต (การแมป 0 -> 16 และมากกว่า 15-> 32) ฉันสามารถกำจัดการทดสอบขั้นสุดท้ายได้ การแม็พกับ 6bit mask m สามารถทำได้ด้วย:

m := {16},(1 to: 15) at:FailSafe+1 ifAbsent:32.

นั่นคือ m จะเท่ากับ 16 สำหรับศูนย์ FailSafe และ 32 สำหรับค่านอกขอบเขต จากนั้นเลือกและรวบรวมสตริงดังกล่าว นี่เป็นรหัสใหม่:

m := {16},(1 to:15) at:FailSafe+1 ifAbsent:32.
(((1 to:6) select:[:b | m isBitSet:b ])
        collect:[:b| 
            #( 'Detection zones staying in a given state'
               'Bad visibility'
               'Initialization'
               'Bad configuration'
               'No technical alarms'        
               'Unknown') at:b ]
               ) joinWithAll:'; '

(ฉันยังแทนที่ asStringWith: โดย joinWithAll: ซึ่งเป็นนามแฝง)

แม้ว่านี่จะเป็นความคิดที่ดี แต่ก็มีจำนวนตัวอักษรถอนหายใจเหมือนกัน บางทีภาษาการเขียนโปรแกรมอื่น ๆ ที่มีชื่อตัวดำเนินการหนาแน่นขึ้นจะดีกว่า

ฉันสามารถบันทึกสองสามตัวอักษรโดยไม่ใช้ตัวแปรชั่วคราวสำหรับ m แต่คำนวณใหม่ในลูปและโดยไม่ใช้อาร์เรย์ตัวอักษรสำหรับเวกเตอร์สตริงเพื่อรับนับน้อยกว่า 240 ตัวอักษร

ในที่สุดหน้ากาก m สามารถคำนวณได้ด้วยm:={32},(1 to: 16) at:(FailSafe+1 min:17)ซึ่งอาจจะสั้นกว่าใน APL จากนั้นแลกเปลี่ยนสองสตริงสุดท้ายในเวกเตอร์

PS: รุ่นแรกถือว่า FailSafe ไม่เป็นลบเช่นเดียวกับโซลูชันอื่น ๆ ที่นี่ ที่สองสามารถจัดการกับอะไรก็ได้แม้ไม่มีหรืออื่น ๆ ที่ไม่ใช่ตัวเลข


2
แล้วการUnknownกำหนดค่าล่ะ?
Bergi

อุ๊ยขอโทษ - ฉันต้องแก้ไข
blabla999

0

CoffeeScript, 161 160 221 ตัวอักษร

F = FailSafe;F<16 and (F and [0..3].filter((i)->(1<<i)&F).map((i)->(['Detection zones staying in a given state','Bad visibility','Initialization','Bad configuration'])[i]).join('; ') or 'No technical alarms') or 'Unknown'

เกิดอะไรขึ้นกับUnknownและNo technical alarms?
Bergi

3
อึอึ ฉันควรจะได้รับที่น่าสงสัยเมื่อฉันเอาชนะคำตอบ GolfScript ...
ไรอันเคนเนดี้

และเช่นเคยฉันลืมกรณีขอบ ...
ไรอันเคนเนดี้

0

VB.net

Function StateText(f As FailFlag) As String
  If f=0 Then Return "No Technical Alarm"
  Dim t=""
  If f.HasFlag(f1) Then t &= "Detection zones staying in a given state; "
  If f.HasFlag(f2) Then t &= "Bad visibility; "
  If f.HasFlag(f4) Then t &= "Initialization; "
  If f.HasFlag(f8) Then t &= "Bad configuration; "
  Return If( t<>"", t.TrimEnd("; "),"Unknown")
End Function

<Flags>
Enum FailFlag
  f1 = 1
  f2 = 2
  f4 = 4
  f8 = 8
End Enum

แก้ไข: รายการที่ดีขึ้น

Function StateText(f As FailFlag) As String
  If f = 0 Then Return "No Technical Alarm"
  Dim t = String.Join("; ",
            From e In [Enum].GetValues(GetType(FailFlag))
            Where f.HasFlag(e)
            Select [Enum].GetName(GetType(FailFlag), e).Replace("_", " "))
  Return If( t<>"", t,"Unknown")
End Function

<Flags>
Enum FailFlag
  Detection_zones_staying_in_a_given_state = 1
  Bad_visibility = 2
  Initialization = 4
  Bad_configuration = 8
End Enum

0

Perl, 208 197 ตัวละคร

$f=$FailSafe;%m=(1,'Detection zones staying in a given state',2,'Bad visibility',4,'Initialization',8,'Bad configuration');($f?join'; ',@m{map{$f&$_?$_:()}1,2,4,8}:'No technical alarms')||'Unknown'

ด้วยรหัสสำเร็จรูปเพื่อให้ทำงาน:

#!/usr/bin/env perl
$FailSafe=17;
print failmsg() . "\n";

sub failmsg {
$f=$FailSafe;%m=(1,'Detection zones staying in a given state',2,'Bad visibility',4,'Initialization',8,'Bad configuration');($f?join'; ',@m{map{$f&$_?$_:()}1,2,4,8}:'No technical alarms')||'Unknown'
}

อ่านรหัสอีกครั้ง: ไม่มีการตรวจสอบขอบเขต
titanofold

0

Java 275 ตัวอักษร (ไม่นับพื้นที่สีขาวที่ไม่จำเป็น )

    String s = "";
    int b = 1;
    for (String m : new String[]{"Detection zones staying in a given state; ","Bad visibility; ", "Initialization; ", "Bad configuration; "}) {
        if ((FailSafe & b) != 0) s = s + m;
        b <<= 1;
    }
    return (s.length() == 0) ? (FailSafe == 0) ? "No technical alarms" : "Unknown" : s.substring(0, s.length() - 2);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.