Le Daily WTF d'aujourd'hui cite la ligne de code suivante ...
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')))))))))))))))
Écrivez du code qui prend une valeur entière nommée FailSafe et renvoie la même chaîne que le code ci-dessus produirait à partir de la même valeur entière.
- Le défi est de réécrire cette ligne, donc le code "passe-partout" est gratuit, y compris tout code qui charge une valeur entière et sort la chaîne. Seul le code qui effectue la transformation ci-dessus d'un entier à une chaîne compte.
- Vous pouvez utiliser un nom différent de "FailSafe" si vous le souhaitez, tant que votre identifiant choisi a le même score de golf.
- Aucun appel de ressources externes pour effectuer la recherche.
- Les règles normales du code-golf s'appliquent.
f=FailSafe
ou quelque chose comme ça)?Réponses:
Ruby, 210 caractères
Similaire à la solution de @Jan Dvorak mais un peu plus fonctionnel et un peu plus court.
la source
GolfScript, 167 caractères
Le code prend la valeur en variable
FailSafe
et pousse le résultat sur la pile (c'est-à-dire, affiche la chaîne si elle est exécutée en tant que programme autonome). Vous pouvez tester le code en ligne .Le code génère essentiellement un tableau des 16 résultats possibles, sélectionne le message d'erreur en fonction des quatre bits les plus bas de
FailSafe
. Le plus à l'extérieurif
gère alors le cas zéro.la source
or
qu'au lieu deif
vous sauver la.
. Mais j'avoue que je n'ai pas essayé de déchiffrer le code d'origine.Rebol / Red: 208 caractères
Je ne suis pas aussi intéressé par le golf comme ce que les opérateurs en acceptant de ternaires imbriqués sont ennuyeux ... et mentionner c'est en fait une belle instance pour de Rebol / Red CASE . Il est lié à SWITCH et aide vraiment à aplatir des choses comme ça:
Il existe une variante appelée CASE / ALL qui exécutera toutes les conditions, mais la valeur par défaut s'arrête juste après la première vraie.
Je vais "jouer au golf" un peu à 208:
la source
APL (172)
Explication:
{
...}FailSafe
: générer les chaînes⍵=0:⊂'No technical alarms'
: le0
cas0=16|⍵:⊂'Unknown'
: leUnknown
cas (FailSafe n'est pas 0 mais les quatre premiers bits le sont)'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2
: obtenez les 4 bits les plus bas dans l'argument (⍵⊤⍨4/2
), reverse (⌽
), et sélectionnez les chaînes pour les bits qui sont sur (/⍨
).'; '∘,¨
: ajouter'; '
au début de chaque chaîne retournée,⊃,/
: joindre toutes les chaînes ensemble,2↓
: et supprimez les deux premiers caractères (car il y a un extra'; '
à l'avant.)la source
⊃,/
pour∊
.Ruby, 183 caractères
Encore une autre solution Ruby, mais un peu plus courte que les autres. Il s'agit d'une expression unique qui utilise la constante
FailSafe
(dans Ruby, tous les identificateurs en majuscules sont des constantes) pour créer la chaîne de sortie.la source
FailSafe
) avant d'utiliser. Et vous augmentez le codeuninitialized constant FailSafe
FailSafe
est déjà défini. Lorsque vous souhaitez exécuter le code, vous devez d'abord définir la constante vous-même.JavaScript,
197195 caractèresformaté:
Pourrait être encore réduit en utilisant les expressions de fonction ES6 ou Coffeescript.
la source
"Bad visibility"
car le 2 bits est défini et aucun des 4 autres bits inférieurs. LeUnknown
cas se produit lorsqu'aucun des 4 bits inférieurs n'est défini, mais l'FailSafe
est!= 0
- tout comme dans le code d'origine (essayez avec16
). Si nous devons "corriger" cela, vous devriez demander au PO (dans un commentaire sur la question), pas moi…Ruby, 213 caractères
Cela fonctionnera très bien dans un corps de fonction (
def transform failSafe; ...; end
). Il peut également être utilisé comme une expression unique (envelopper entre parenthèses car un point-virgule / nouvelle ligne a la priorité la plus basse) ou comme une séquence d'instructions avec la dernière expression (e.join"; "
) utilisée dans une expression.la source
e+=["Initialization"]if f&4>3
Je veux cela en Python.[]||=
?since FailSafe must be a constant in Ruby
Huh. L'attitude de Python ressemble plus à "Ouais, tu peux casser des trucs, mais ne t'attends pas à ce que je nettoie le bordel"||=
est comme+=
mais avec||
-a ||= b
est équivalent àa = a || b
. Il est couramment utilisé pour définir une variable par défaut lorsqu'elle est fausse.VBScript,
204 234232 caractères(edit: amélioration du score de 2 en utilisant array () au lieu de split (). 232 maintenant.)
(modifier: oublié la partie "inconnu". 234 caractères maintenant.)
f = sécurité intégrée: pour b = 0à 3: s = s & split (",; Zones de détection restant dans un état donné ;; Mauvaise visibilité ,,; Initialisation ,,,,; Mauvaise configuration", ",") (f et 2 ^ b): suivant: split ("Pas d'alarmes techniques, Inconnu", & mid (s, 3), ",") (2+ (f = 0) + (len (s) = 0))(original, 230)
pour b = 0à 3: s = s & split (",; Zones de détection restant dans un état donné ,; Mauvaise visibilité ,,; Initialisation ,,,,; Mauvaise configuration", ",") (FailSafe et 2 ^ b): suivant : tableau (mid (s, 3), "Aucune alarme technique") (- (len (s) = 0))Bien sûr, ce n'est qu'une partie d'un script. pour le tester, essayez quelque chose comme ceci:
la source
Smalltalk, 243 caractères
formaté pour la lisibilité:
Merci à Bergi pour avoir signalé le bug de la première version.
Cela soulève une idée: si je mappe la valeur FailSafe dans un masque 6 bits (mappage 0 -> 16 et supérieur à 15 -> 32), je peux me débarrasser des tests finaux. La mise en correspondance avec le masque 6 bits m peut être effectuée avec:
m := {16},(1 to: 15) at:FailSafe+1 ifAbsent:32.
c'est-à-dire que m sera 16 pour un FailSafe zéro et 32 pour les valeurs hors limites. Ensuite, sélectionnez et collectez les chaînes comme ci-dessus. Cela donne le nouveau code:
(J'ai également remplacé asStringWith: par joinWithAll :, qui est un alias).
Bien que cela semble être une bonne idée, cela a le même nombre de caractères - soupir. Peut-être qu'un autre langage de programmation avec des noms d'opérateurs plus denses obtient de meilleurs résultats ici!
Je pourrais enregistrer quelques caractères en n'utilisant pas de variable temporaire pour m, mais en la recalculant dans la boucle et en n'utilisant pas de tableau littéral pour le vecteur chaîne, pour obtenir un nombre légèrement inférieur à 240 caractères.
Enfin, le masque m pourrait également être calculé par
m:={32},(1 to: 16) at:(FailSafe+1 min:17)
, ce qui pourrait être plus court en APL. Échangez ensuite les deux dernières chaînes du vecteur.PS: La première version suppose que FailSafe n'est pas négatif, comme le font d'autres solutions ici. Le second peut traiter n'importe quoi, même nul ou autre non-nombre.
la source
Unknown
configuration?CoffeeScript,
161 160221 caractèresla source
Unknown
etNo technical alarms
?VB.net
Modifier: meilleure entrée
la source
Perl,
208197 caractèresAvec code passe-partout pour le faire fonctionner:
la source
Java 275 caractères (sans compter les espaces blancs inutiles )
la source