Continuación de este desafío porque el autor se ha ido y la pregunta está cerrada.
Lo que debe hacer es crear un analizador booleano.
Las expresiones booleanas, en caso de que aún no haya oído hablar de ellas, tienen dos entradas y una salida.
Hay cuatro "puertas" en la aritmética booleana, a saber:
- O (representado por
|
) (operador binario, entre argumentos) - AND (representado por
&
) (operador binario, entre argumentos) - XOR (representado por
^
) (operador binario, entre argumentos) - NOT (representado por
!
) (operador unario, argumento a la derecha)
Estas puertas operan en sus entradas que son verdaderas (representadas por 1
) o falsas (representadas por 0
). Podemos enumerar las posibles entradas ( A
y B
en este caso) y las salidas ( O
) usando una tabla de verdad de la siguiente manera:
XOR
A|B|O
-----
0|0|0
0|1|1
1|0|1
1|1|0
OR
A|B|O
-----
0|0|0
0|1|1
1|0|1
1|1|1
AND
A|B|O
-----
0|0|0
0|1|0
1|0|0
1|1|1
NOT
A|O
---
0|1
1|0
Un ejemplo de entrada sería 1^((1|0&0)^!(1&!0&1))
, que se evaluaría para:
1^((1|0&0)^!(1&!0&1))
=1^(( 1 &0)^!(1&!0&1))
=1^( 0 ^!(1&!0&1))
=1^( 0 ^!(1& 1&1))
=1^( 0 ^!( 1 &1))
=1^( 0 ^! 1 )
=1^( 0 ^ 0 )
=1^0
=1
La salida sería 1
.
Detalles
- Como se ve en el ejemplo, no hay un orden de prevalencia. Todos se evalúan de izquierda a derecha, excepto cuando están entre paréntesis, que deben evaluarse primero.
- La entrada solo contendrá
()!^&|01
. - Puede elegir cualquier carácter de 8 bytes para reemplazar los 8 caracteres anteriores, pero deben tener una asignación de 1 a 1 y deben indicarse.
- Específicamente,
eval
no se permite usar la función en ninguna cadena derivada de la entrada . Específicamente, la funcióninput
(o el equivalente en el lenguaje) y cualquier función que lo llame no puede ser utilizada poreval
. Tampoco puede concatenarinput
en su cadena dentro deeval
.
Puntuación
Este es el código de golf . La solución más corta en bytes gana.
code-golf
parsing
logic-gates
Monja permeable
fuente
fuente
Respuestas:
JavaScript (ES6) 116 bytes
edite thx @ user81655 por 3 bytes guardados y se encontró un error
Probablemente no sea el mejor enfoque, pero no hay operadores eval y no booleanos, solo tablas de verdad.
Carácter usado:
Prueba
fuente
x>7
?r=f(x.replace(/./g,c=>"01!&|^()".indexOf(c)))
0|!0
funciona, pero ahora sí, tengo mi voto a favor.Retina, 49 bytes
No tengo idea de cómo salió tan corto.
Mapeo de personajes:
1
,0
y no!
se modifican.Esto funciona mediante la sustitución de todas las expresiones Truthy (solo
1
entre paréntesis,!0
,1&1
,1^0
,0|1
, etc.) con1
, y todos los demás (single0
paréntesis,!1
,1&0
,1^1
,0|0
, etc.) con0
.Pruébalo en línea!
¡Pruébelo en línea con el mapeo automático de caracteres!
fuente
grep + utilidades de shell, 131 bytes
Los siguientes caracteres cambian de nombre:
Comencé a tratar de escribir una solución grep, pero descubrí que no funcionaba bien con los operadores de infijo asociativo a la izquierda. Necesitaba tener un patrón como (cadena de operadores) = (cadena de operadores) (binario op) (operando único), pero esto contiene una posible recursión infinita, por lo que grep se niega a ejecutarlo. Pero noté que podía analizar operadores asociativos correctos. Esto hizo que el
!
operador fuera un dolor, pero aún era posible. Así que hice una expresión regular para calcular expresiones booleanas hacia atrás y envié la entradarev
. La expresión regular en sí, que coincide con expresiones verdaderas, es de 116 bytes.TODO: elija diferentes caracteres para la entrada para que pueda distinguir todos los grupos de operadores utilizados con clases de caracteres incorporadas.
fuente
(?9)
significa\9
lo que significaría hacer coincidir lo que coincidió con el noveno grupo de captura). Entonces, por ejemplo,(\d)\1
coincide con el mismo dígito dos veces, mientras que(\d)(\?1)
coincide con cualquiera de los dos dígitos.Python, 210 bytes
Descenso recursivo realmente malo, espero que esto sea superado en un instante.
fuente
Mathematica,
139129 bytesUna solución simple de reemplazo de cadenas tiene un puntaje mucho mejor de lo que esperaba.
fuente
JavaScript ES6, 223 bytes
Utiliza un algoritmo de patio de maniobras.
Usos
+
para OR,!
para negación,^
para XOR y&
para y.0
y1
se usan para sus respectivos valores. Claro, podría jugar golf haciendo los números de los operadores, pero no estoy ganando el premio JavaScript, incluso si lo hago, así que pensé que sería al menos algo legible y correcto.fuente
C, 247
Golfizado:
Sin golf, con
main()
(toma la expresión como 1er argumento). La versión de golf no tiene printfs de depuración y utiliza códigos ascii de 2 dígitos en lugar de literales char (40 == '('
). Podría haber guardado algunos caracteres asignándolos()|^&!
a234567
- esto habría facilitado muchas manipulaciones y pruebas después de restar48
de cada una.fuente
for(j=i=1;i+=s[++j]==')'?-1:s[j]=='('?1:0,i;);
.Java, 459 bytes
AND
es&
OR
esl
(L minúscula)XOR
esx
(o cualquier otro personaje que juegue bien conString
métodos comoString.replaceAll(...)
)NOT
es!
(
esa
)
esb
Aquí hay una versión más legible:
pruébalo en línea
fuente
Java, 218
Utiliza la coincidencia de patrones, pero evita los reemplazos fuera de orden de mi intento fallido de Java anterior (¡ojos agudos allí, @Kenny Lau !).
Golfizado:
Ungolfed, lee la entrada de argumentos y aplica el mapeo
oaxn
para|&^!
y<>
para()
:Java
m.group(i)
te dice qué grupo coincidió; el primer grupo es para sustituciones verdaderas y el segundo para falsas. Esto se repite en estricto orden de izquierda a derecha hasta que no se realicen sustituciones.fuente