Một nhà điều hành Ternary xấu xứng đáng khác


18

WTF hàng ngày hôm nay trích dẫn dòng mã sau đây ...

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')))))))))))))))

Viết một số mã nhận một giá trị số nguyên có tên FailSafe và trả về cùng một chuỗi mà mã trên sẽ tạo ra từ cùng một giá trị số nguyên.

  • Thách thức là viết lại dòng đó, vì vậy mã "soạn sẵn" là miễn phí, bao gồm mọi mã tải giá trị nguyên và xuất chuỗi. Chỉ có mã thực hiện chuyển đổi ở trên từ một số nguyên sang một chuỗi đếm.
  • Bạn có thể sử dụng một tên khác để "FailSafe" nếu bạn muốn, miễn là số nhận dạng bạn chọn có cùng số điểm đánh gôn.
  • Không gọi tài nguyên bên ngoài để thực hiện tra cứu.
  • Quy tắc golf-golf bình thường được áp dụng.

Chúng tôi có được phép lưu trữ FailSafe trong một biến khác không (ví dụ, f=FailSafehoặc một cái gì đó tương tự)?
Chương trìnhFOX

@ProgramFOX Điều đó tốt, nhưng sự phân công đó được bao gồm trong số đếm. Chỉ có bản tóm tắt dẫn bạn đến điểm có một biến có tên FailSafe là miễn phí.
billpg

Bạn có thể vui lòng in mã cho chúng tôi? Hay là thử thách để hiểu thử thách?
John Dvorak

3
@JanDvorak Tôi không chắc mình có thể ...
billpg

2
Tôi hy vọng điều này: pastebin.com/jzXt4fsp sẽ dễ đọc hơn
vào

Câu trả lời:


5

Ruby, 210 ký tự

Tương tự như giải pháp của @Jan Dvorak nhưng có nhiều chức năng hơn và ngắn hơn một chút.

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 ký tự

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

Mã giả định giá trị trong biến FailSafevà đẩy kết quả trên ngăn xếp (tức là xuất chuỗi nếu chạy dưới dạng chương trình độc lập). Bạn có thể kiểm tra mã trực tuyến .

Mã về cơ bản tạo ra một mảng của tất cả 16 kết quả có thể xảy ra, chọn thông báo lỗi tùy thuộc vào bốn bit thấp nhất của FailSafe. Ngoài cùng ifsau đó xử lý các trường hợp không.


Tôi nghĩ orthay vì ifsẽ cứu bạn .. Nhưng tôi thừa nhận rằng tôi đã không cố giải mã mã gốc.
Peter Taylor

4

Rebol / Đỏ: 208 ký tự

Tôi không hứng thú với việc chơi golf này vì đồng ý rằng các nhà điều hành ternary lồng nhau gây phiền nhiễu ... và đề cập đến điều này thực sự là một ví dụ hay cho CASE của Rebol / Red . Nó liên quan đến SWITCH và thực sự giúp làm phẳng những thứ như thế này:

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"]
] "; "

Có một biến thể gọi là CASE / ALL sẽ thực sự chạy tất cả các điều kiện, nhưng mặc định chỉ dừng lại sau biến thể đầu tiên.

Tôi sẽ "đánh gôn" một chút đến 208:

x: func [y] [y <(f: FailSafe) và ++ y] nối thêm trường hợp [x 0 ["Vùng phát hiện ở trong một trạng thái nhất định"] x 1 ["Tầm nhìn kém"] x 3 ["Khởi tạo"] y 7 ["Cấu hình xấu"] f> 0 ["Không xác định"] 1 ["Không có báo động kỹ thuật"]] ";"


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

Giải trình:

  • {...}FailSafe : Tạo chuỗi
    • ⍵=0:⊂'No technical alarms': các 0 vụ án
    • 0=16|⍵:⊂'Unknown': các Unknown trường hợp (FailSafe không phải là 0 nhưng bốn bit đầu tiên là)
    • 'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2: lấy 4 bit thấp nhất trong đối số ( ⍵⊤⍨4/2), Reverse ( ) và chọn chuỗi cho các bit nằm trên ( /⍨).
  • '; '∘,¨: thêm vào '; ' vào phía trước của mỗi chuỗi trả về,
  • ⊃,/: nối tất cả các chuỗi với nhau,
  • 2↓: và xóa hai ký tự đầu tiên (vì có thêm '; 'ở phía trước.)

Lưu hai byte bằng cách thay đổi ⊃,/thành .
Adám

3

Ruby, 183 ký tự

[(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]]-[""]]*"; "

Một giải pháp Ruby khác, nhưng ngắn hơn một chút so với các giải pháp khác. Đây là một biểu thức sử dụng hằng số FailSafe(trong Ruby, tất cả các định danh chữ hoa là hằng số) để tạo chuỗi đầu ra.


trong ruby ​​bạn nên khai báo hằng (thích FailSafe) trước khi sử dụng. Và bạn tăng mãuninitialized constant FailSafe

4
@ Елёный Như câu hỏi nêu: "Viết một số mã lấy giá trị nguyên có tên FailSafe" - vì vậy, mã của tôi (giống như tất cả các câu trả lời khác ở đây) FailSafeđã được xác định. Khi bạn muốn chạy mã, trước tiên bạn sẽ phải xác định hằng số.
Ventero

2

JavaScript, 197 195 ký tự

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'

định dạng:

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';

Có thể được giảm thêm bằng cách sử dụng các biểu thức hàm ES6 hoặc Coffeescript.


Nếu FailSafe là 18 thì sao? (thực ra, mã thách thức ban đầu chỉ nhìn vào 4 bit thấp hơn, vì vậy trường hợp Unknown thực sự không bao giờ được phát hiện!) Vì vậy, câu hỏi là, liệu chúng ta có thực sự quan tâm đến nó hay cung cấp thuật toán "cố định".
blabla999

@ blabla999: Nó sẽ trả về "Bad visibility"vì 2 bit được đặt và không có 4 bit nào khác thấp hơn. Các Unknowntrường hợp xảy ra khi không có thấp hơn 4 bit được thiết lập, nhưng FailSafe!= 0- cũng giống như trong mã gốc (thử với 16). Liệu chúng ta có nên "sửa" điều này hay không, bạn nên hỏi OP (trong một bình luận về câu hỏi), không phải là tôi
Bergi

bạn đúng - tôi ngu ngốc. Tôi đã rất bối rối bởi đoạn mã đó. Xin lỗi vì điều đó.
blabla999

2

Ruby, 213 ký tự

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"; "

Điều này sẽ làm việc tốt chỉ được bọc trong một cơ thể chức năng ( def transform failSafe; ...; end). Nó cũng có thể được sử dụng như một biểu thức đơn (bao trong ngoặc đơn vì dấu chấm phẩy / dòng mới có mức ưu tiên thấp nhất) hoặc như một chuỗi các câu lệnh có biểu thức cuối cùng ( e.join"; ") được sử dụng trong một biểu thức.


Tôi sẽ thêm một quy tắc để cho phép một tên khác.
billpg

e+=["Initialization"]if f&4>3Tôi muốn điều này trong Python.
ɐɔıʇǝɥʇuʎs

Bạn không ấn tượng bởi []||=?
John Dvorak

Không chắc nó làm gì ... Ngoài ra: since FailSafe must be a constant in RubyHuh. Thái độ của Python giống như "Vâng, bạn có thể phá vỡ mọi thứ, nhưng đừng mong tôi dọn dẹp mớ hỗn độn"
14

1
@ ɐɔıʇǝɥʇuʎs ||=là như thế +=nhưng với ||- a ||= btương đương với a = a || b. Nó thường được sử dụng để mặc định một biến khi nó là giả.
Aaron Dufour

1

VBScript, 204 234 232 ký tự

(chỉnh sửa: cải thiện điểm số bằng 2 bằng cách sử dụng mảng () thay vì chia (). 232 ngay bây giờ.)

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))

(chỉnh sửa: quên phần "không xác định". Bây giờ là 234 ký tự.)

f = failafe: for b = 0to 3: s = s & split (",; Các khu vực phát hiện ở trong một trạng thái nhất định,; Khả năng hiển thị kém ,,; Khởi tạo ,,,,; Cấu hình xấu", ",") (f và 2 ^ b): next: split ("Không có báo động kỹ thuật, Không xác định", & mid (s, 3), ",") (2+ (f = 0) + (len (s) = 0))

(bản gốc, 230)

cho b = 0 đến 3: s = s & split (",; Vùng phát hiện ở trạng thái nhất định,; Khả năng hiển thị kém ,,; Khởi tạo ,,,,; Cấu hình xấu", ",") (FailSafe và 2 ^ b): tiếp theo : mảng (mid (s, 3), "Không có báo động kỹ thuật") (- (len (s) = 0))

Tất nhiên, đây chỉ là một phần của kịch bản. để kiểm tra nó, hãy thử một cái gì đó như thế này:

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))

tôi cũng quên trường hợp chưa biết ;-)
blabla999

@ blabla999 Thật vậy. Đã sửa. Cảm ơn!
JesterBLUE

1

Smalltalk, 243 ký tự

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']     

được định dạng để dễ đọc:

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']

Cảm ơn Bergi, vì đã chỉ ra lỗi trong phiên bản đầu tiên.

Điều này đưa ra một ý tưởng: nếu tôi ánh xạ giá trị FailSafe vào mặt nạ 6 bit, (ánh xạ 0 -> 16 và lớn hơn 15 -> 32), tôi có thể thoát khỏi các thử nghiệm cuối cùng. Việc ánh xạ tới mặt nạ 6 bit m có thể được thực hiện với:

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

nghĩa là, m sẽ là 16 đối với FailSafe bằng 0 và 32 đối với các giá trị ngoài giới hạn. Sau đó chọn và thu thập các chuỗi như trên. Điều này cung cấp mã mới:

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:'; '

(Tôi cũng đã thay thế asStringWith: bởi tham giaWith ALL:, là bí danh).

Mặc dù đây có vẻ là một ý tưởng hay, nhưng điều này có cùng số lượng nhân vật - thở dài. Có thể một số ngôn ngữ lập trình khác với tên toán tử dày đặc hơn ở đây!

Tôi có thể lưu một vài ký tự bằng cách không sử dụng biến tạm thời cho m, nhưng tính toán lại nó trong vòng lặp và không sử dụng một mảng bằng chữ cho vectơ chuỗi, để có được số đếm nhỏ hơn 240 ký tự.

Cuối cùng, mặt nạ m cũng có thể được tính bằng m:={32},(1 to: 16) at:(FailSafe+1 min:17), có thể ngắn hơn trong APL. Sau đó trao đổi hai chuỗi cuối cùng trong vector.

PS: Phiên bản đầu tiên giả định FailSafe là không âm, giống như một số giải pháp khác ở đây. Thứ hai có thể đối phó với bất cứ điều gì, thậm chí không hoặc không số khác.


2
Còn Unknowncấu hình thì sao?
Bergi

Xin lỗi - Tôi phải sửa nó.
blabla999

0

CoffeeScript, 161 160 221 ký tự

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'

Điều gì đã xảy ra UnknownNo technical alarms?
Bergi

3
Tào lao. Đáng lẽ tôi nên nghi ngờ khi đánh bại câu trả lời của GolfScript ...
Ryan Kennedy

Như mọi khi, tôi quên các trường hợp cạnh ...
Ryan Kennedy

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

Chỉnh sửa: Mục nhập tốt hơn

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 ký tự

$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'

Với mã soạn sẵn để làm cho nó hoạt động:

#!/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'
}

Đọc lại mã: Không có kiểm tra giới hạn.
titanofold

0

Java 275 ký tự (không tính khoảng trắng không cần thiết )

    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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.