Jeden zły operator trójskładnikowy zasługuje na inny

18

Dzisiejszy Daily WTF cytuje następujący wiersz kodu ...

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

Napisz kod, który przyjmuje wartość całkowitą o nazwie FailSafe i zwraca ten sam ciąg, który powyższy kod wygenerowałby z tej samej wartości całkowitej.

  • Wyzwanie polega na przepisaniu tego wiersza, aby kod „kocioł” był wolny, w tym każdy kod, który ładuje wartość całkowitą i wysyła ciąg. Liczy się tylko kod, który wykonuje powyższą transformację z liczby całkowitej na ciąg.
  • Jeśli chcesz, możesz użyć innej nazwy niż „FailSafe”, o ile wybrany identyfikator ma taki sam wynik golfowy.
  • Brak wywoływania zewnętrznych zasobów w celu wykonania wyszukiwania.
  • Obowiązują normalne zasady gry w golfa.
billpg
źródło
Czy wolno nam przechowywać FailSafe w innej zmiennej (na przykład f=FailSafeczy coś takiego)?
ProgramFOX
@ProgramFOX W porządku, ale to zadanie jest uwzględnione w liczbie. Tylko płyta kotłowa, która prowadzi do punktu, w którym znajduje się zmienna FailSafe, jest bezpłatna.
billpg
Czy możesz proszę wydrukować dla nas ładny kod? Czy wyzwanie stanowi wyzwanie?
John Dvorak,
3
@JanDvorak Nie jestem pewien, czy potrafię ...
billpg
2
Mam nadzieję, że: pastebin.com/jzXt4fsp jest ładniejszy do czytania
wyszedł

Odpowiedzi:

5

Ruby, 210 znaków

Podobne do rozwiązania @Jana Dvoraka, ale nieco bardziej funkcjonalne i nieco krótsze.

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"; "
Howard
źródło
5

GolfScript, 167 znaków

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 przyjmuje wartość w zmiennej FailSafei wypycha wynik na stos (tzn. Wyprowadza ciąg znaków, jeśli działa jako samodzielny program). Możesz przetestować kod online .

Kod w zasadzie generuje tablicę wszystkich 16 możliwych wyników, wybiera komunikat błędu w zależności od czterech najniższych bitów FailSafe. Zewnętrzny ifobsługuje wtedy zerową wielkość liter.

Howard
źródło
Myślę, że orzamiast ifocaliłbym cię .. Przyznaję jednak, że nie próbowałem odszyfrować oryginalnego kodu.
Peter Taylor
4

Rebol / Red: 208 znaków

Nie jestem tak zainteresowany w golfa to jak w zgadzając się, że operatorzy zagnieżdżonych trójskładnikowych są irytujące ... i wspomnieć, to jest rzeczywiście ładny przykład dla REBOL / czerwony za CASE . Jest powiązany z SWITCH i naprawdę pomaga spłaszczyć takie rzeczy:

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

Istnieje wariant o nazwie CASE / ALL, który faktycznie uruchomi wszystkie warunki, ale domyślnie zatrzymuje się po pierwszym prawdziwym.

„Gra w golfa” trochę do 208:

x: func [y] [y <(f: FailSafe) i ++ y] dopisz przypadek [x 0 [„Strefy wykrywania pozostają w danym stanie”] x 1 [„Zła widoczność”] x 3 [„Inicjalizacja”] y 7 [„Zła konfiguracja”] f> 0 [„Nieznany”] 1 [„Brak alarmów technicznych”]] „;

Dr. Rebmu
źródło
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

Wyjaśnienie:

  • {... }FailSafe: generuj ciągi
    • ⍵=0:⊂'No technical alarms': 0sprawa
    • 0=16|⍵:⊂'Unknown': Unknownprzypadek (FailSafe nie jest równy 0, ale pierwsze cztery bity są)
    • 'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2: pobierz najniższe 4 bity w argumencie ( ⍵⊤⍨4/2), reverse ( ) i wybierz ciągi bitów, które są włączone ( /⍨).
  • '; '∘,¨: dodaj '; 'z przodu każdego zwracanego ciągu,
  • ⊃,/: połącz wszystkie struny razem,
  • 2↓: i usuń pierwsze dwa znaki (ponieważ jest dodatkowy '; 'z przodu).
marinus
źródło
Zaoszczędź dwa bajty, zmieniając ⊃,/na .
Adám
3

Ruby, 183 znaków

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

Kolejne rozwiązanie Ruby, ale nieco krótsze niż inne. To pojedyncze wyrażenie, które używa stałej FailSafe(w Rubim wszystkie identyfikatory pisane wielkimi literami są stałymi) do utworzenia łańcucha wyjściowego.

Ventero
źródło
w ruby ​​powinieneś zadeklarować stałą (lubię FailSafe) przed użyciem. I uninitialized constant FailSafe
4
@ Зелёный Jak pytanie brzmi: „Napisz kod, który przyjmuje wartość całkowitą o nazwie FailSafe” - więc mój kod (jak wszystkie inne odpowiedzi tutaj) zakłada, że FailSafejest już zdefiniowany. Kiedy chcesz uruchomić kod, musisz najpierw zdefiniować stałą.
Ventero,
2

JavaScript, 197 195 znaków

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'

sformatowany:

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

Można jeszcze bardziej zmniejszyć, używając wyrażeń funkcji ES6 lub Coffeescript.

Bergi
źródło
co jeśli FailSafe ma 18 lat? (w rzeczywistości oryginalny kod wyzwania patrzy tylko na 4 niższe bity, więc nieznany przypadek tak naprawdę nigdy nie jest wykrywany!) Tak więc pytanie brzmi, czy powinniśmy się tym zająć lub podać „ustalony” algorytm.
blabla999
@ blabla999: Zwróci, "Bad visibility"ponieważ 2-bit jest ustawiony i żaden z pozostałych niższych 4 bitów. UnknownSprawa dzieje się, gdy żaden z dolnych 4 bitów jest ustawiony, ale FailSafejest != 0- podobnie jak w oryginalnym kodzie (spróbuj 16). Czy powinniśmy to „naprawić”, należy zapytać OP (w komentarzu do pytania), a nie ja…
Bergi,
masz rację - ja głupi. Byłem tak zdezorientowany tym fragmentem kodu. Przepraszam za to.
blabla999
2

Ruby, 213 znaków

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

Będzie to działać dobrze opakowane w funkcję body ( def transform failSafe; ...; end). Może być również używany jako pojedyncze wyrażenie (zawijanie w nawiasach, ponieważ średnik / znak nowej linii ma najniższy priorytet) lub jako sekwencja instrukcji z ostatnim wyrażeniem ( e.join"; ") użytym w wyrażeniu.

John Dvorak
źródło
Dodam regułę, aby zezwolić na inną nazwę.
billpg
e+=["Initialization"]if f&4>3Chcę tego w Pythonie.
8ıʇǝɥʇuʎs
@ ɐɔıʇǝɥʇuʎs nie jesteś pod wrażeniem []||=?
John Dvorak
Nie jestem pewien, co robi ... Także: since FailSafe must be a constant in RubyHuh. Postawa Pythona jest bardziej jak „Tak, może złamać rzeczy, ale nie należy się spodziewać mi posprzątać ten bałagan”
ɐɔıʇǝɥʇuʎs
1
@ isıʇǝɥʇuʎs ||=jest jak, +=ale z ||- a ||= bjest równoważne a = a || b. Jest powszechnie używany do domyślnej zmiennej, gdy jest ona fałszywa.
Aaron Dufour,
1

VBScript, 204 234 232 znaki

(edycja: poprawiono wynik o 2 za pomocą array () zamiast split (). 232 teraz.)

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

(edytuj: zapomniałem części „nieznana”. 234 znaków).

f = bezpieczne: dla b = 0 do 3: s = s i podział (",; Strefy detekcji pozostają w danym stanie ;; Zła widoczność ,,; Inicjalizacja ,,,,; Zła konfiguracja", ",") (f i 2 ^ b): next: split („Brak alarmów technicznych, nieznane” i mid (s, 3), „,”) (2+ (f = 0) + (len (s) = 0))

(oryginał, 230)

dla b = 0 do 3: s = s & split (",; Strefy detekcji pozostają w danym stanie ;; Zła widoczność ,,; Inicjalizacja ,,,,; Zła konfiguracja", ",") (FailSafe i 2 ^ b): dalej : array (mid (s, 3), „No alarms technicznych”) (- (len (s) = 0))

Oczywiście jest to tylko część skryptu. aby to przetestować, spróbuj czegoś takiego:

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))
JesterBLUE
źródło
ja też zapomniałem o nieznanej sprawie ;-)
blabla999
@ blabla999 Rzeczywiście. Naprawiony. Dzięki!
JesterBLUE
1

Smalltalk, 243 znaków

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

sformatowane dla czytelności:

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

Dzięki Bergi za wskazanie błędu w pierwszej wersji.

To nasuwa pomysł: jeśli zamapuję wartość FailSafe na maskę 6-bitową (mapowanie 0 -> 16 i więcej niż 15 -> 32), mogę pozbyć się ostatecznych testów. Mapowanie do 6-bitowej maski m można wykonać za pomocą:

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

to znaczy, m będzie 16 dla zerowego FailSafe i 32 dla wartości poza granicami. Następnie wybierz i zbierz ciągi jak wyżej. To daje nowy kod:

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

(Zastąpiłem również asStringWith: przez joinWithAll :, który jest aliasem).

Chociaż wydaje się to fajny pomysł, ma on tę samą liczbę znaków - westchnienie. Może lepszy jest tutaj inny język programowania z gęstszymi nazwami operatorów!

Mógłbym zapisać kilka znaków, nie używając tymczasowej zmiennej dla m, ale ponownie obliczyć ją w pętli i nie używając literalnej tablicy dla wektora łańcucha, aby uzyskać liczbę nieznacznie poniżej 240 znaków.

Na koniec można również obliczyć maskę m m:={32},(1 to: 16) at:(FailSafe+1 min:17), która może być krótsza w APL. Następnie zamień dwa ostatnie ciągi w wektorze.

PS: Pierwsza wersja zakłada, że ​​FailSafe jest nieujemny, podobnie jak niektóre inne rozwiązania tutaj. Drugi może poradzić sobie ze wszystkim, nawet zerowym lub innymi nieliczbami.

blabla999
źródło
2
Co z Unknownkonfiguracją?
Bergi
ouch przepraszam - muszę to naprawić.
blabla999
0

CoffeeScript, 161 160 221 znaków

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'
Ryan Kennedy
źródło
Co się stało z Unknown i No technical alarms?
Bergi
3
O cholera. Powinienem być podejrzliwy, kiedy pokonałem odpowiedź GolfScript ...
Ryan Kennedy
Jak zawsze zapomniałem o krawędziach ...
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

Edycja: lepszy wpis

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
Adam Speight
źródło
0

Perl, 208 197 znaków

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

Z kodem płyty kotła, aby działał:

#!/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
źródło
Przeczytaj ponownie kod: Nie ma kontroli granic.
titanofold
0

Java 275 znaków (nie licząc niepotrzebnych białych znaków )

    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);
Jeff Grigg
źródło