Considere una gramática sobre el alfabeto { 0
, 1
, ?
, :
} definido por la regla de producción
s →
0
┃1
┃0
?
s:
s ┃1
?
s:
s
Dada una cadena generada a partir de s , analícela como una expresión donde ?:
sea asociativa a la derecha (por ejemplo, a?B?X:Y:c?d:e?f:g
significa a?(B?X:Y):(c?d:(e?f:g))
) y evalúela con la siguiente semántica:
eval(0) = 0
eval(1) = 1
eval(0?a:b) = eval(b)
eval(1?a:b) = eval(a)
Si el resultado es 0 , genera un valor fijo; si la salida es 1 , genera un valor fijo diferente. Especificar sus valores de salida elegidos (por ejemplo, 0
/ 1
o False
/ True
) en su respuesta.
Casos de prueba
0 -> 0
1 -> 1
0?0:1 -> 1
0?1:0 -> 0
1?0:1 -> 0
1?1:0 -> 1
0?1?0:1:1 -> 1
1?0?1:1:1 -> 1
1?0:1?0:1?1:1 -> 0
1?1?1:0?1?0:0:0:0 -> 1
1?0:1?0?1:1?1:0:1?1?1:1:1?0:1 -> 0
1?1?1:0?0?1:1:0?1:0:1?1?0?0:0:1?1:0:0?1?0:1:1?0:1 -> 1
0?0?1?0?0:1:0?0:0:0?0?1:1:1?0:1:0?0?0?1:0:0?1:1:1?1?0:1:1 -> 0
Reglas
- No puede utilizar el lenguaje incorporado que interpreta cadenas como código en algún lenguaje de programación y ejecutarlo (como JavaScript / Perl / Ruby / Python
eval
). - Dicho esto, su código en realidad no tiene que analizar y luego evaluar la cadena de entrada. Puede adoptar cualquier enfoque que logre resultados equivalentes y no viole la regla anterior.
- Su programa será verificado contra
perl -le 'print eval<>'
. - El código más corto (en bytes) gana.
S → T | T ? S : S
,T → 0 | 1
, la eliminación de la necesidad de hablar de asociatividad?Respuestas:
GolfScript, 21 bytes
Esto produce
0
o1
. Se supone que la entrada tiene una nueva línea final. El uso~
(que evalúa las cadenas) guardaría un byte:Esto se basa en http://golf.shinh.org/reveal.rb?The+B+Programming+Language/tails_1462638030&gs .
fuente
Retina , 23 bytes
Pruébalo en línea! (La primera línea habilita un conjunto de pruebas separado por salto de línea).
Explicación
Es bastante simple en realidad. La entrada se reduce al resultado
+
evaluando repetidamente ( ) ternaries que contienen solo literales. Para asegurarnos de que esto se haga de forma asociativa a la derecha, buscamos coincidencias de derecha a izquierda (r
) y reemplazamos solo la última coincidencia que encontramos (-1=
).La expresión regular en sí coincide
0\?.:
o la elimina (dejando solo las cosas después:
) o la1\?.:.
reemplaza con el valor después de?
.fuente
1
st match en lugar del-1
st?Haskell,
106101100 9083 bytesEsto depende en gran medida de las capacidades de coincidencia de patrones de Haskell. En primer lugar, invertimos la cadena de modo que podamos buscar la primera ocurrencia de
b:a?x
(que normalmente se leería comox?a:b
) y reemplazarla por su valor. Esto proporciona automáticamente la asociatividad correcta . Aquí hacemos uso delx:xs
patrón. Esto es lo quef
está haciendo la función . Luego, básicamente aplicamosf
a su salida una y otra vez, hasta que nos quede un solo número (0 o 1).¡Gracias @Lynn por 12 bytes!
fuente
Brainfuck,
826463 bytesLa salida es
\xff
para0
y\x00
para1
. La implementación de brainfuck debe permitir ir a la izquierda de la celda inicial.Esto utiliza esencialmente el mismo enfoque que la respuesta de Python de xsot , pero la ramificación es probablemente más difícil de seguir en comparación con mi envío inicial de 82 bytes:
(Para esta solución, la salida es
\xfe
para0
y\xff
para1
, y se logra una compatibilidad más amplia cuando la entrada termina con una nueva línea).Si no puede molestarse en analizar la solución de xsot, la idea es la siguiente: proceder de izquierda a derecha. Si ve
1?
, deseche con avidez. Si ve0?
, descarte todo lo que se encuentre entre eso y el correspondiente:
. Cuando?
no aparece como el segundo carácter, deje de recorrer e imprima el primer carácter de la cadena restante.Entonces, la solución de 82 bytes en realidad refleja ese esquema bastante de cerca. El bucle interno se maneja
0?
, al igual que el bucle interno de xsot. Se debe tener cuidado para ingresar al bucle principal sin verificar ningún carácter de entrada; es decir, queremos verificar si el segundo carácter está?
solo una vez al final del ciclo principal, y no también al principio antes de ingresar al ciclo principal.La solución de 63 bytes combina esencialmente los bucles interno y externo en uno, lo que sospechaba que era posible dada la similitud entre esos bucles. El diseño de la memoria en el bucle principal podría describirse como:
donde
[x]
significa celda actual:s
comienza como un valor ficticio distinto de cero que solo indica que todavía estamos en bucle e inmediatamente se sobrescribe con un carácter de entrada (ya sea0
o1
). Lad
celda tiene la profundidad (negativa) en caso de que estemos en el medio de a0?
, de lo contrario0
. Elc
va a ser?
o:
o nueva línea o EOF.Después de actualizar
s
yc
, manejamos el0?
caso actualizando end
consecuencia y ajustando el puntero, de lo contrario, usamos el valor actual dec
como el valor ded
en la próxima iteración, o nos detenemos si hemos terminado.fuente
Python 2,
76747372 bytesCon entrada como cadena literal para evitar
raw_
.La salida es
0
o1
seguida de<built-in function id>
.fuente
3>>int(c)
`id`
truco ...! Bien hecho :)Python 2, 89 bytes
La entrada se toma como un literal de cadena.
fuente
Grime ,
3431 bytesImprime
1
para entradas verdaderas y0
falsas. Pruébalo en línea! Desafortunadamente, el último caso de prueba se queda sin memoria en TIO.Explicación
La asociatividad correcta significa esencialmente que en
a?b:c
,a
es siempre una0
o1
, nunca, una expresión más larga. Definiré recursivamente un patrón que coincida con una expresión veraz como esa, y comprobaré la entrada contra él. También es necesario comprobar que cada:
es realmente una:
, si los?
s son todos verificado: hay un número igual de?
s y:
S en la entrada, y si alguna?
se clasifica incorrectamente como:
, los correspondientes:
no se adapte, y la coincidencia de Grime El motor retrocederá.fuente
Haskell,
79 71 70 62 6056 bytesEditar: ¡ Gracias a @Zgarb por 3 bytes y a @nimi por 4 bytes!
Este es un enfoque recursivo
que de alguna manera abusa de la regla de salida de "algún valor fijo". Editar: deshacerse de las tuplas no solo ahorra 8 bytes, sino que también produce una salida más agradable:"0"
o"1"
.Versión sin golf:
¿Como funciona?
La
eval
función atraviesa el árbol implícito de las expresiones.y devuelve una tupla del formulario
(result, rest)
.El primer patrón
(x:'?':r1)
coincidex
con'1'
yr1
para"0?0:1:0?1:0"
. La aplicación recursivaeval
ar1
evalúa la subexpresión0?0:1
y devuelve(0,":0?1:0")
. Al hacer coincidir esto con los(a,':':r2)
rendimientos del patróna=0
yr2=0?1:0
. Esta sub-fórmula también se evalúa recursivamente para queb='0'
yr3=""
. Compruebe six
es'1'
o'0'
y devuelva(a, r3)
o(b, r3)
.fuente
x>'0'
Funcionaría en lugar dex=='1'
?':'
por_
.:
. ¡Gracias de nuevo!if .. then .. else
conlast$e s:[a:tail(e s)|x>'0']
.JavaScript (ES6), 53 bytes
Devoluciones
0
o1
para entrada válida; se bloquea por entrada no válida. Explicación: debido a que revertir una cadena es incómodo en JavaScript, mi primer intento de 71 bytes funcionó usando una búsqueda anticipada negativa de una?
que de otro modo perturbaría la asociatividad:Como esto fue algo largo, me pregunté si podría mejorar las cosas incorporando la toma de decisiones en la expresión regular. Al final resultó que no fue un éxito inmediato, ya que también tomó 71 bytes:
Entonces se me ocurrió eso
0?0:
y0?1:
siempre son no-ops, sin preocupación por la asociatividad. Esto me ahorró casi el 25%.fuente
f=
. No he comprobado si tu recuento de bytes lo tiene en cuenta o no.Perl, 32 + 1 (
-p
bandera) = 33 bytes¡Crédito total a @Mitch Swartch , ya que su solución fue 14 bytes más corta que la mía!
Gracias también a @Neil que sugirió una solución 1 byte más larga que Mitch.
Necesita
-p
bandera, así como-M5.010
o-E
para correr. Por ejemplo :Explicaciones : Básicamente, reduce los bloques de
a?b:c
(comenzando desde el final para asegurarse de que no?
sigue) enb
oc
dependiendo de la veracidad dea
, una y otra vez hasta que la cadena solo contiene1
o0
.fuente
-
No cuenta para su puntaje? Hrm. Interesante ... Buena respuesta!perl -e '<code>'
por lo tanto, agregar unp
solo costo de 1 byteperl -pe '<code>'
.?
, pude reducir esto a 34 bytes de esta manera.s/.*\K(1\?(.)..|0\?..)/\2/&&redo
Python 3,
9369 bytesLa entrada es la cadena como una lista de caracteres, la salida es
"0"
o"1"
Versión sin golf:
Otro intento, pero con considerablemente más bytes:
fuente
def f(s):x=s.pop(0);return[]<s<s.pop(0)>'>'and(f(s),f(s))[x<'1']or x
, y para Python 3 con una pequeña distancia de edición a la suya, existedef f(s):z=s.pop;r=z(0);return s and':'<z(0)and(f(s),f(s))[r<'1']or r
.SED,
75 74 68(40 + 1 para -r) 41fuente
(.*)
y agregar un término de reemplazo adicional.\3
lugar de\2
. Además, puede unir las líneas con;
para obtener:;s/(.*)(1\?(.):.|0\?.:)/\1\3/;t
.\3
eso significa que accidentalmente copié una versión anterior. Sé sobre punto y coma. Pero qué asco, ¿por qué quieres usar punto y coma?Bash + GNU utilidades, 42
Idea similar a la mayoría de las otras respuestas de coincidencia de patrones.
Ideone .
fuente
0
caso, eso le ahorra 5 bytes.