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:gsignifica 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/ 1o 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
0o1. 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
1st match en lugar del-1st?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:xspatrón. Esto es lo quefestá haciendo la función . Luego, básicamente aplicamosfa 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
\xffpara0y\x00para1. 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
\xfepara0y\xffpara1, 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:scomienza 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 sea0o1). Ladcelda tiene la profundidad (negativa) en caso de que estemos en el medio de a0?, de lo contrario0. Elcva a ser?o:o nueva línea o EOF.Después de actualizar
syc, manejamos el0?caso actualizando endconsecuencia y ajustando el puntero, de lo contrario, usamos el valor actual deccomo el valor deden 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
0o1seguida 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
1para entradas verdaderas y0falsas. 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,aes siempre una0o1, 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
evalfunción atraviesa el árbol implícito de las expresiones.y devuelve una tupla del formulario
(result, rest).El primer patrón
(x:'?':r1)coincidexcon'1'yr1para"0?0:1:0?1:0". La aplicación recursivaevalar1evalúa la subexpresión0?0:1y devuelve(0,":0?1:0"). Al hacer coincidir esto con los(a,':':r2)rendimientos del patróna=0yr2=0?1:0. Esta sub-fórmula también se evalúa recursivamente para queb='0'yr3="". Compruebe sixes'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 .. elseconlast$e s:[a:tail(e s)|x>'0'].JavaScript (ES6), 53 bytes
Devoluciones
0o1para 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 (
-pbandera) = 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
-pbandera, así como-M5.010o-Epara correr. Por ejemplo :Explicaciones : Básicamente, reduce los bloques de
a?b:c(comenzando desde el final para asegurarse de que no?sigue) enbocdependiendo de la veracidad dea, una y otra vez hasta que la cadena solo contiene1o0.fuente
-No cuenta para su puntaje? Hrm. Interesante ... Buena respuesta!perl -e '<code>'por lo tanto, agregar unpsolo costo de 1 byteperl -pe '<code>'.?, pude reducir esto a 34 bytes de esta manera.s/.*\K(1\?(.)..|0\?..)/\2/&&redoPython 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.\3lugar de\2. Además, puede unir las líneas con;para obtener:;s/(.*)(1\?(.):.|0\?.:)/\1\3/;t.\3eso 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
0caso, eso le ahorra 5 bytes.