Bir Kötü Üçlü Operatör Bir diğerini hak ediyor


18

Bugünün Günlük WTF kod satırı aşağıdaki ...

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 adlı bir tamsayı değeri alan ve yukarıdaki kodun aynı tamsayı değerinden üreteceği dizeyi döndüren bir kod yazın.

  • Zorluk bu satırı yeniden yazmaktır, bu nedenle bir tamsayı değeri yükleyen ve dizeyi çıkaran kodlar da dahil olmak üzere "boilerplate" kodu ücretsizdir. Yalnızca bir tamsayıdan bir dizeye yukarıdaki dönüşümü gerçekleştiren kod sayılır.
  • Seçtiğiniz tanımlayıcı aynı golf skoruna sahip olduğu sürece, "FailSafe" için farklı bir ad kullanabilirsiniz.
  • Aramayı gerçekleştirmek için harici kaynak çağırma yok.
  • Normal kod golf kuralları geçerlidir.

FailSafe'i başka bir değişkente (örneğin f=FailSafeveya bunun gibi bir şey) saklayabilir miyiz ?
ProgramFOX

@ProgramFOX Sorun değil, ancak bu atama sayıma dahil edilmiştir. Sadece size FailSafe adında bir değişkenin bulunduğu noktayı yönlendiren ortak plaka ücretsizdir.
billpg

Lütfen kodu güzel bir şekilde yazdırabilir misiniz? Yoksa meydan okumayı anlamak zor mudur?
John Dvorak

3
@JanDvorak Yapabileceğimden emin değilim ...
billpg

2
Umarım bu: pastebin.com/jzXt4fsp okumak daha güzel
eithed

Yanıtlar:


5

Ruby, 210 karakter

@Jan Dvorak'ın çözümüne benzer, ancak biraz daha işlevsel ve biraz daha kısa.

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 karakter

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

Kod, değişkendeki değeri varsayar ve FailSafesonucu yığına iletir (yani bağımsız program olarak çalıştırılırsa dizeyi çıktılar). Kodu çevrimiçi olarak test edebilirsiniz .

Kod temel olarak 16 olası sonucun bir dizisini oluşturur, en düşük dört bitine bağlı olarak hata mesajını seçer FailSafe. En dıştaki ifsıfır durumunu ele alır.


Bence oryerine ifkurtaracak olacaktır .. Ancak orijinal kodu deşifre etmeye çalışmadığımı itiraf ediyorum.
Peter Taylor

4

Rebol / Kırmızı: 208 karakter

İç içe üçlü operatörlerin sinir bozucu olduğunu kabul etmek gibi bunu golf oynamakla ilgilenmiyorum ... ve bundan bahsetmek aslında Rebol / Red's CASE için güzel bir örnek . SWITCH ile ilgilidir ve bunun gibi şeyleri düzleştirmeye gerçekten yardımcı olur:

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

Tüm koşulları çalıştıracak olan CASE / ALL adlı bir varyant var, ancak varsayılan sadece ilk doğru olandan sonra duruyor.

Ben 208 golf biraz ":":

x: işlev [y] [y <(f: HataSafe) ve ++ y] durum ekler [x 0 ["Belirli bir durumda kalan algılama bölgeleri"] x 1 ["Kötü görünürlük"] x 3 ["Başlatma"] y 7 ["Hatalı yapılandırma"] f> 0 ["Bilinmeyen"] 1 ["Teknik alarm yok"]] ";"


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

Açıklama:

  • {... }FailSafe: dizeleri oluşturur
    • ⍵=0:⊂'No technical alarms': 0dava
    • 0=16|⍵:⊂'Unknown': Unknowndurum (FailSafe 0 değildir, ancak ilk dört bit vardır)
    • 'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2: ( ⍵⊤⍨4/2), reverse ( ) argümanında en düşük 4 biti alın ve açık ( /⍨) bitler için dizeleri seçin .
  • '; '∘,¨: '; 'döndürülen her dizenin önüne ekle ,
  • ⊃,/: tüm dizeleri birleştirin,
  • 2↓: ve ilk iki karakteri kaldırın (çünkü '; 'ön tarafta fazladan bir karakter vardır .)

Değiştirerek iki bayt kaydet ⊃,/için .
Adam

3

Ruby, 183 karakter

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

Yine başka bir Ruby çözümü, ancak diğerlerinden biraz daha kısa. Bu, FailSafeçıktı dizesini oluşturmak için sabiti (Ruby'de tüm büyük harf tanımlayıcıları sabittir) kullanan tek bir ifadedir .


yakut FailSafekullanmadan önce sabit (gibi ) beyan etmelisiniz . Ve kod yükseltmekuninitialized constant FailSafe

4
@ Зелёный Sorunun belirttiği gibi: "FailSafe adında bir tamsayı değeri alan bir kod yazın" - böylece kodum (burada diğer tüm cevaplar gibi) FailSafezaten tanımlanmış demektir. Kodu çalıştırmak istediğinizde, önce sabiti kendiniz tanımlamanız gerekir.
Ventero

2

JavaScript, 197195 karakter

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'

biçimlendirilmiş:

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 veya Coffeescript işlev ifadeleri kullanılarak daha da azaltılabilir.


Ya FailSafe 18 ise? (aslında, orijinal meydan okuma kodu sadece daha düşük 4 bite bakar, bu yüzden Bilinmeyen durum aslında hiçbir zaman algılanmaz!) Yani soru, eğer gerçekten ilgilenirsek veya "sabit" bir algoritma sağlamalıysak.
blabla999

@ blabla999: "Bad visibility"2 bit ayarlandığı ve diğer düşük 4 bitin hiçbiri olmadığından geri dönecektir . UnknownVaka alt 4 bit hiçbiri ayarlandığında olur, ancak FailSafeolduğu != 0- sadece orijinal kod (deneyin olduğu gibi 16). Bunu "düzeltmeliyiz", OP'ye sormalısınız (soru üzerine bir yorumda), ben değil…
Bergi

haklısın - aptal beni. Bu kod parçasıyla kafam çok karıştı. Bunun için özür dilerim.
blabla999

2

Ruby, 213 karakter

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

Bu, işlev gövdesine ( def transform failSafe; ...; end) sarılmış şekilde iyi çalışır . Tek bir ifade olarak (noktalı virgül / satırsonu en düşük önceliğe sahip olduğu için parantez içinde sarın) veya e.join"; "bir ifadede kullanılan son ifadeye ( ) sahip bir ifade dizisi olarak da kullanılabilir.


Farklı bir isme izin vermek için bir kural ekleyeceğim.
billpg

e+=["Initialization"]if f&4>3Bunu Python'da istiyorum.
ɐɔıʇǝɥʇuʎs

@ ɐɔıʇǝɥʇuʎs bundan etkilenmiyor []||=musunuz?
John Dvorak

Ne yaptığından emin değilim ... Ayrıca: since FailSafe must be a constant in RubyHa. Python'un tavrı daha "Evet, gibi olabilir şeyler kırmak ama beklemeyin beni pisliği temizlemek için"
ɐɔıʇǝɥʇuʎs

1
@ ɐɔıʇǝɥʇuʎs ||=gibidir +=ama ||- a ||= bile eşdeğerdir a = a || b. Bir değişken, sahte olduğunda varsayılan olarak varsayılan olarak kullanılır.
Aaron Dufour

1

VBScript, 204234 232 karakter

(değiştir: split () yerine array () kullanarak puanı 2 arttırdı. 232 şimdi.)

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

(değiştir: "bilinmeyen" bölümü unuttum. 234 karakter şimdi.)

f = başarısız güvenlik: b = 0 ila 3 için: s = s & split (",; Belirli bir durumda kalan algılama bölgeleri ;; Kötü görünürlük ,,; Başlatma ,,,,; Kötü yapılandırma", ",") (f ve 2 ^ b): sonraki: bölünmüş ("Teknik alarm yok, Bilinmiyor" & orta (s, 3), ",") (2+ (f = 0) + (len (s) = 0))

(orijinal, 230)

b = 0 ila 3 için: s = s & split (",; Belirli bir durumda kalan algılama bölgeleri ;; Kötü görünürlük ,,; Başlatma ,,,,; Kötü yapılandırma", ",") (FailSafe ve 2 ^ b): sonraki : dizi (orta (s, 3), "Teknik alarm yok") (- (len (s) = 0))

Tabii ki, bu sadece bir senaryonun bir parçası. test etmek için şöyle bir şey deneyin:

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

Beni de Bilinmeyen davayı unuttum ;-)
blabla999

@ blabla999 Gerçekten. Sabit. Teşekkürler!
JesterBLUE

1

Smalltalk, 243 karakter

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

okunabilirlik için biçimlendirilmiş:

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

İlk versiyondaki hataya işaret ettiği için Bergi'ye teşekkürler.

Bu bir fikir getirir: FailSafe değerini 6 bitlik bir maskeye eşlersem (0 -> 16 ve 15'ten büyük -> 32), son testlerden kurtulabilirim. 6 bit maske m ile eşleme şu şekilde yapılabilir:

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

diğer bir deyişle, sıfır FailSafe için m 16 ve sınırların dışında değerler için 32 olacaktır. Ardından yukarıdaki gibi dizeleri seçin ve toplayın. Bu yeni kodu verir:

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

(Ben de bir takma ad olan joinWithAll :, ile asStringWith: yerine).

Bu güzel bir fikir gibi görünse de, bu aynı karakter sayısına sahiptir - iç çeker. Belki daha yoğun operatör isimleri ile başka bir programlama dili burada daha iyi puan!

M için geçici bir değişken kullanarak birkaç karakter kaydedebilir, ancak döngü içinde yeniden hesaplayın ve dize vektörü için bir literal dizi kullanarak, 240 karakter biraz altında bir sayı elde etmek için.

Son olarak, maske m de m:={32},(1 to: 16) at:(FailSafe+1 min:17)APL'de daha kısa olabilen hesaplanabilir . Sonra vektördeki son iki dizgiyi değiştirin.

Not: İlk sürüm FailSafe'in buradaki diğer çözümlerin yaptığı gibi negatif olmadığını varsayar. İkincisi, herhangi bir şeyle, nil veya diğer sayı olmayanlarla bile başa çıkabilir.


2
UnknownYapılandırma ne olacak ?
Bergi

ah üzgünüm - düzeltmek zorundayım.
blabla999

0

CoffeeScript, 161 160 221 karakter

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'

Ne oldu Unknownve No technical alarms?
Bergi

3
Hata! GolfScript cevabını yendiğimde şüphelenmeliydim ...
Ryan Kennedy

Her zaman olduğu gibi, uç vakaları unuttum ...
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

Düzenleme: Daha İyi Giriş

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 Karakterler

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

Çalıştırmak için demirbaş kodu ile:

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

Kodu yeniden okuyun: Sınır kontrolü yoktur.
titanofold

0

Java 275 karakterleri ( gereksiz boşluk saymaz )

    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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.