Un cattivo operatore ternario merita un altro


18

Il Daily WTF di oggi riporta la seguente riga di codice ...

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

Scrivi del codice che accetta un valore intero chiamato FailSafe e restituisce la stessa stringa che il codice precedente produrrebbe dallo stesso valore intero.

  • La sfida è riscrivere quella riga, quindi il codice "boilerplate" è gratuito, incluso qualsiasi codice che carica un valore intero e genera la stringa. Conta solo il codice che esegue la trasformazione precedente da un numero intero a una stringa.
  • È possibile utilizzare un nome diverso per "FailSafe" se lo si desidera, purché l'identificatore scelto abbia lo stesso punteggio di golf.
  • Nessuna chiamata di risorse esterne per eseguire la ricerca.
  • Si applicano le normali regole del code-golf.

È consentito memorizzare FailSafe in un'altra variabile (ad esempio f=FailSafeo qualcosa del genere)?
Programma FOX l'

@ProgramFOX Va bene, ma quell'incarico è incluso nel conteggio. Solo la piastra della caldaia che conduce al punto in cui esiste una variabile denominata FailSafe è gratuita.
billpg,

Potresti per favore stampare il codice per noi? Oppure la sfida è capire la sfida?
John Dvorak,

3
@JanDvorak Non sono sicuro di poter ...
Billpg

2
Lo spero: pastebin.com/jzXt4fsp è più bello da leggere
eithed

Risposte:


5

Rubino, 210 caratteri

Simile alla soluzione di @Jan Dvorak ma un po 'più funzionale e un po' più breve.

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 caratteri

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

Il codice assume il valore in variabile FailSafee inserisce il risultato nello stack (ovvero genera la stringa se eseguito come programma autonomo). Puoi testare il codice online .

Il codice genera fondamentalmente un array di tutti e 16 i possibili risultati, seleziona il messaggio di errore in base ai quattro bit più bassi di FailSafe. Il più esterno ifquindi gestisce il caso zero.


Penso che orinvece di ifsalvarti il .. Ma ammetto di non aver provato a decifrare il codice originale.
Peter Taylor,

4

Rebol / Red: 208 caratteri

Non sono interessato a giocare a golf come a concordare sul fatto che gli operatori ternari nidificati siano fastidiosi ... e menzionare questo è in realtà un buon esempio per il CASO di Rebol / Red . È legato a SWITCH e aiuta davvero ad appiattire cose come questa:

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'è una variante chiamata CASE / ALL che eseguirà effettivamente tutte le condizioni, ma il valore predefinito si interrompe appena dopo il primo vero.

Lo "golf" un po 'a 208:

x: func [y] [y <(f: FailSafe) e ++ y] append case [x 0 ["Zone di rilevamento che si trovano in un determinato stato"] x 1 ["Visibilità errata"] x 3 ["Inizializzazione"] y 7 ["Configurazione errata"] f> 0 ["Sconosciuto"] 1 ["Nessun allarme tecnico"]] ";"


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

Spiegazione:

  • {... }FailSafe: genera le stringhe
    • ⍵=0:⊂'No technical alarms': il 0caso
    • 0=16|⍵:⊂'Unknown': il Unknowncaso (FailSafe non è 0 ma i primi quattro bit sono)
    • 'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2: ottiene i 4 bit più bassi nell'argomento ( ⍵⊤⍨4/2), reverse ( ) e seleziona le stringhe per i bit che sono su ( /⍨).
  • '; '∘,¨: aggiungi '; 'all'inizio di ogni stringa restituita,
  • ⊃,/: unisci tutte le stringhe insieme,
  • 2↓: e rimuovi i primi due personaggi (perché c'è un extra '; 'in primo piano).

Salva due byte cambiando ⊃,/in .
Adám,

3

Rubino, 183 caratteri

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

Ancora un'altra soluzione di Ruby, ma un po 'più corta delle altre. Questa è una singola espressione che utilizza la costante FailSafe(in Ruby, tutti gli identificatori maiuscoli sono costanti) per creare la stringa di output.


in ruby ​​dovresti dichiarare costante (come FailSafe) prima dell'uso. E il tuo codice aumentauninitialized constant FailSafe

4
@ Зелёный Come afferma la domanda: "Scrivi del codice che accetta un valore intero chiamato FailSafe" - quindi il mio codice (come tutte le altre risposte qui) presume FailSafesia già definito. Quando vuoi eseguire il codice, devi prima definire la costante.
Ventero,

2

JavaScript, 197 195 caratteri

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'

formattato:

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

Potrebbe essere ulteriormente ridotto utilizzando le espressioni di funzione ES6 o Coffeescript.


cosa succede se FailSafe ha 18 anni? (in realtà, il codice di sfida originale esamina solo i 4 bit inferiori, quindi il caso Unknown non viene mai effettivamente rilevato!) Quindi la domanda è, se dovremmo davvero occuparcene o fornire un algoritmo "fisso".
blabla999,

@ blabla999: ritornerà "Bad visibility"perché è impostato il 2 bit e nessuno degli altri 4 bit inferiori. Il Unknowncaso si verifica quando nessuno dei 4 bit inferiori è impostato, ma lo FailSafeè != 0- proprio come nel codice originale (provare con 16). Se dovremmo "risolvere" questo, dovresti chiedere al PO (in un commento sulla domanda), non a me ...
Bergi,

hai ragione - io stupido. Sono stato così confuso da quel pezzo di codice. Scusa per quello.
blabla999,

2

Rubino, 213 caratteri

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

Funzionerà perfettamente in un corpo di funzione ( def transform failSafe; ...; end). Può anche essere usato come una singola espressione (racchiudere tra parentesi perché un punto e virgola / newline ha la priorità più bassa) o come una sequenza di istruzioni con l'ultima espressione ( e.join"; ") utilizzata all'interno di un'espressione.


Aggiungerò una regola per consentire un nome diverso.
billpg

e+=["Initialization"]if f&4>3Lo voglio in Python.
Julıʇǝɥʇuʎs l'

@ ɐɔıʇǝɥʇuʎs non sei impressionato []||=?
John Dvorak,

Non sono sicuro di cosa faccia ... Inoltre: since FailSafe must be a constant in RubyEh. L'atteggiamento di Python è più simile a "Sì, puoi rompere le cose, ma non aspettarti che ripulisca il casino"
Julıʇǝɥʇuʎs,

1
@ ɐɔıʇǝɥʇuʎs ||=è come +=ma con ||- a ||= bè equivalente a a = a || b. È comunemente usato per default una variabile quando è falsa.
Aaron Dufour,

1

VBScript, 204 234 232 caratteri

(modifica: migliorato il punteggio di 2 usando array () invece di split (). 232 ora.)

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

(modifica: ho dimenticato la parte "sconosciuta". 234 caratteri adesso.)

f = fail-safe: per b = da 0 a 3: s = s & split (",; Zone di rilevamento che si trovano in un dato stato ,; Visibilità errata ,,; Inizializzazione ,,,,; Configurazione errata", ",") (f e 2 ^ b): successivo: split ("Nessun allarme tecnico, Sconosciuto" e metà (s, 3), ",") (2+ (f = 0) + (len (s) = 0))

(originale, 230)

per b = da 0 a 3: s = s & split (",; Zone di rilevamento che si trovano in un determinato stato ,; Visibilità errata ,,; Inizializzazione ,,,,; Configurazione errata", ",") (FailSafe e 2 ^ b): successivo : array (mid (s, 3), "Nessun allarme tecnico") (- (len (s) = 0))

Certo, questa è solo una parte di una sceneggiatura. per provarlo, prova qualcosa del genere:

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

anch'io ho dimenticato il caso Unknown ;-)
blabla999

@ blabla999 In effetti. Fisso. Grazie!
JesterBLUE,

1

Smalltalk, 243 caratteri

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

formattato per la leggibilità:

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

Grazie a Bergi, per aver indicato il bug nella prima versione.

Questo fa venire in mente un'idea: se associo il valore FailSafe in una maschera a 6 bit, (mappando 0 -> 16 e maggiore di 15 -> 32), posso liberarmi dei test finali. La mappatura sulla maschera 6bit m può essere effettuata con:

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

vale a dire, m sarà 16 per un FailSafe zero e 32 per i valori fuori limite. Quindi selezionare e raccogliere le stringhe come sopra. Questo dà il nuovo codice:

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

(Ho anche sostituito asStringWith: da joinWithAll :, che è un alias).

Anche se questa sembra essere una buona idea, ha lo stesso conteggio dei personaggi - sospiro. Forse alcuni altri linguaggi di programmazione con nomi di operatori più densi ottengono risultati migliori qui!

Potrei salvare alcuni caratteri non usando una variabile temporanea per m, ma ricalcolo nel ciclo e non usando un array letterale per il vettore stringa, per ottenere un conteggio leggermente inferiore a 240 caratteri.

Infine, la maschera m potrebbe anche essere calcolata da m:={32},(1 to: 16) at:(FailSafe+1 min:17) , che potrebbe essere più corta in APL. Quindi scambia le ultime due stringhe nel vettore.

PS: la prima versione presuppone che FailSafe non sia negativo, come alcune altre soluzioni qui. Il secondo può gestire qualsiasi cosa, anche zero o altri non numeri.


2
E la Unknownconfigurazione?
Bergi,

ahi scusa - devo ripararlo.
blabla999,

0

CoffeeScript, 161 160 221 caratteri

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'

Che cosa è successo Unknowne No technical alarms?
Bergi,

3
Merda. Avrei dovuto essere sospettoso quando ho battuto la risposta GolfScript ...
Ryan Kennedy l'

Come sempre, ho dimenticato i casi limite ...
Ryan Kennedy l'

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

Modifica: migliore entrata

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 personaggi

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

Con codice boilerplate per farlo funzionare:

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

Rileggi il codice: non esiste un controllo dei limiti.
titanofold

0

Java 275 caratteri (senza contare gli spazi bianchi non necessari )

    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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.