El Daily WTF de hoy cita la siguiente línea de código ...
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')))))))))))))))
Escriba un código que tome un valor entero llamado FailSafe y devuelva la misma cadena que produciría el código anterior a partir del mismo valor entero.
- El desafío es reescribir esa línea, de modo que el código "repetitivo" sea gratuito, incluido cualquier código que cargue un valor entero y genere la cadena. Solo cuenta el código que realiza la transformación anterior de un entero a una cadena.
- Puede usar un nombre diferente para "FailSafe" si lo desea, siempre que su identificador elegido tenga el mismo puntaje de golf.
- No se requieren recursos externos para realizar la búsqueda.
- Se aplican las reglas normales de código de golf.
f=FailSafe
o algo así)?Respuestas:
Ruby, 210 caracteres.
Similar a la solución de @Jan Dvorak pero un poco más funcional y un poco más corta.
fuente
GolfScript, 167 caracteres
El código asume el valor en variable
FailSafe
y empuja el resultado en la pila (es decir, genera la cadena si se ejecuta como programa independiente). Puede probar el código en línea .El código básicamente genera una matriz de los 16 resultados posibles, selecciona el mensaje de error en función de los cuatro bits más bajos de
FailSafe
. El más externoif
entonces maneja el caso cero.fuente
or
lugar deif
salvarte el.
. Pero admito que no he intentado descifrar el código original.Rebol / Rojo: 208 caracteres
No estoy tan interesado en jugar golf como en aceptar que los operadores ternarios anidados son molestos ... y mencionar que en realidad es una buena instancia para CASO de Rebol / Red . Está relacionado con SWITCH y realmente ayuda a aplanar cosas como esta:
Hay una variante llamada CASE / ALL que realmente ejecutará todas las condiciones, pero la predeterminada solo se detiene después de la primera verdadera.
Lo "golfé" un poco a 208:
fuente
APL (172)
Explicación:
{
...}FailSafe
: generar las cadenas⍵=0:⊂'No technical alarms'
: el0
caso0=16|⍵:⊂'Unknown'
: elUnknown
caso (FailSafe no es 0 pero los primeros cuatro bits sí lo son)'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2
: obtenga los 4 bits más bajos en el argumento (⍵⊤⍨4/2
), reverse (⌽
), y seleccione las cadenas para los bits que están en (/⍨
).'; '∘,¨
: agregar'; '
al frente de cada cadena devuelta,⊃,/
: une todas las cuerdas juntas,2↓
: y elimine los dos primeros caracteres (porque hay un extra'; '
en el frente).fuente
⊃,/
a∊
.Ruby, 183 caracteres
Otra solución más de Ruby, pero un poco más corta que las otras. Esta es una expresión única que usa la constante
FailSafe
(en Ruby, todos los identificadores en mayúsculas son constantes) para crear la cadena de salida.fuente
FailSafe
) antes de usar. Y tu código subeuninitialized constant FailSafe
FailSafe
que ya está definido. Cuando desee ejecutar el código, primero deberá definir la constante usted mismo.JavaScript,
197195 caracteresformateado:
Podría reducirse aún más mediante el uso de expresiones de función ES6 o Coffeescript.
fuente
"Bad visibility"
porque el 2 bits está configurado y ninguno de los otros 4 bits más bajos. ElUnknown
caso ocurre cuando ninguno de los 4 bits inferiores está configurado, peroFailSafe
es!= 0
así, como en el código original (intente con16
). Si deberíamos "arreglar" esto, debería preguntarle al OP (en un comentario sobre la pregunta), no a mí ...Ruby, 213 caracteres
Esto funcionará bien envuelto en un cuerpo de función (
def transform failSafe; ...; end
). También se puede usar como una sola expresión (entre paréntesis porque un punto y coma / nueva línea tiene la prioridad más baja) o como una secuencia de declaraciones con la última expresión (e.join"; "
) utilizada dentro de una expresión.fuente
e+=["Initialization"]if f&4>3
Quiero esto en Python.[]||=
?since FailSafe must be a constant in Ruby
Huh. La actitud de Python es más como "Sí, se puede romper cosas, pero no espere que yo a limpiar el lío"||=
es como+=
pero con||
-a ||= b
es equivalente aa = a || b
. Se usa comúnmente para predeterminar una variable cuando es falsa.VBScript,
204 234232 caracteres(editar: puntuación mejorada en 2 usando array () en lugar de split (). 232 ahora.)
(editar: olvidé la parte "desconocida". 234 caracteres ahora).
f = failsafe: for b = 0to 3: s = s & split (",; Zonas de detección que permanecen en un estado dado ,; Mala visibilidad ,,; Inicialización ,,,,; Mala configuración", ",") (f y 2 ^ b): siguiente: división ("Sin alarmas técnicas, Desconocido", y medio (s, 3), ",") (2+ (f = 0) + (len (s) = 0))(original, 230)
para b = 0 a 3: s = s & split (",; Zonas de detección que permanecen en un estado dado ;; Mala visibilidad ,,; Inicialización ,,,,; Mala configuración", ",") (FailSafe y 2 ^ b): siguiente : array (mid (s, 3), "Sin alarmas técnicas") (- (len (s) = 0))Por supuesto, esto es solo parte de un guión. para probarlo, intente algo como esto:
fuente
Smalltalk, 243 caracteres
formateado para facilitar la lectura:
Gracias a Bergi, por señalar el error en la primera versión.
Esto trae una idea: si mapeo el valor FailSafe en una máscara de 6 bits (mapeo 0 -> 16 y mayor que 15 -> 32), puedo deshacerme de las pruebas finales. La asignación a la máscara m de 6 bits se puede hacer con:
m := {16},(1 to: 15) at:FailSafe+1 ifAbsent:32.
es decir, m será 16 para un FailSafe cero y 32 para valores fuera de límites. Luego seleccione y recolecte cadenas como se indica arriba. Esto le da el nuevo código:
(También reemplacé asStringWith: por joinWithAll :, que es un alias).
Aunque esto parece ser una buena idea, tiene el mismo número de personajes: suspiro. ¡Tal vez algún otro lenguaje de programación con nombres de operadores más densos tenga mejores puntajes aquí!
Podría guardar algunos caracteres al no usar una variable temporal para m, pero volver a calcularlo en el bucle y al no usar una matriz literal para el vector de cadena, para obtener un recuento ligeramente inferior a 240 caracteres.
Finalmente, la máscara m también podría ser calculada por
m:={32},(1 to: 16) at:(FailSafe+1 min:17)
, que podría ser más corta en APL. Luego intercambie las dos últimas cadenas en el vector.PD: La primera versión supone que FailSafe no es negativo, como algunas otras soluciones aquí. El segundo puede tratar con cualquier cosa, incluso nulo u otros no números.
fuente
Unknown
configuración?CoffeeScript,
161 160221 caracteresfuente
Unknown
yNo technical alarms
?VB.net
Editar: Mejor entrada
fuente
Perl,
208197 caracteresCon código repetitivo para que funcione:
fuente
Java 275 caracteres (sin contar espacios en blanco innecesarios )
fuente