Su desafío es interpretar un diagrama de circuito, completo con puertas lógicas.
Puertas lógicas (en realidad no necesita saber qué hacen / son para completar este desafío):
- y puerta:
a
- o puerta:
o
- puerta nand:
A
- ni puerta:
O
- puerta xor:
x
- puerta xnor:
X
- no puerta:
~
Cada puerta pero la última toma dos entradas. Las entradas provienen de a .
en las esquinas superior izquierda e inferior izquierda del cuadrado de 3 por 3 centrado en la puerta. Para no, la entrada está directamente a su izquierda. La salida es a .
directamente a la derecha.
Los cables están representados por -|\/.=
-
contacta dos cables, uno a la derecha y otro a la izquierda:c-c
|
contacta dos cables, uno arriba y otro abajo:c | c
/
y\
trabajar de la siguiente manera:c c \ / c c
.
contacta cada cable circundante:ccc c.c ccc
=
es especial; conecta cables adyacentes a través de él:-=-
conecta los dos cables En el siguiente
\|/ -=- /|\
cada cable opuesto está conectado entre sí, pero no con los demás (aquí es donde difiere
.
).- Para que la corriente fluya, dos cables deben estar conectados al otro, por lo tanto
|-
, la corriente no fluye.
Ejemplo de cableado:
.-.
= \
.--. .---=---
-. = .--
.--. .-------
la entrada se divide en dos cables y luego se divide en tres. En esta división, el cable inferior se mueve hacia el centro, y la división hacia abajo del cable superior aparece en la parte inferior. A continuación, la parte superior de los tres cables se mueve hacia el centro.
Ejemplo de cableado con puertas:
--.
o..~..
--. o.---
a.---.
--.
Formato de entrada:
- cada cable de entrada se etiquetará con un dígito. Al final (justo antes de salto de línea), cada salida será etiquetado con
:
(y el cable siempre irá derecho en él, es decir,-:
o.:
o=:
) - la entrada siempre será válida; No habrá bucles ni cables que se unan sin una puerta. Tenga en cuenta que puede haber cables con extremos sueltos.
=
se usará solo cuando sea necesario.
Formato de salida:
- cada entrada se referencia con el número correspondiente.
- Se emite una expresión. Por ejemplo, si los cables calculan la entrada 1 y la entrada 2, la salida es
1a2
. - cualesquiera funciones que se generen deben corresponder a las puertas lógicas al principio.
- para mostrar no, ponga el
~
antes del lugar correcto. para múltiples funciones, use paréntesis para mostrar el orden de ejecución. Los paréntesis también se pueden usar cuando hay una sola función. Por ejemplo,
1-.~.-. A.~.-: . 2-. / x. 3-.
tiene una salida posible de
~((2x3)A(~1))
- las salidas múltiples deben estar separadas por una nueva línea (o equivalente)
Entrada de muestra:
1--.---.
x. \
2--. x.-=---------.
. .~. X.--.
3---. . a.----. /
O.~.-. \ /
. =
4-. / / .-:
X. .----:
5-.
Una posible salida correspondiente:
(~1)a(~(3O(4X5))
((1x2)x3)X((~1)a(~(3O(4X5))))
Respuestas:
Python
24881567806706697657653Yay para gzip + exec!
Limitaciones y suposiciones.
Tal como está, solo se admiten hasta 9 entradas: varios dígitos no se manejan correctamente. Como la especificación indica que las entradas están etiquetadas con un dígito , no un número , esto está permitido.
Entrada y salida
La entrada se toma a través de la entrada estándar y la salida se realiza a través de la salida estándar.
Pruebas
Muestra de entrada y salida:
Probado aquí: http://ideone.com/gP4CIq
El algoritmo
Es básicamente un DFS bastante ingenuo de las salidas. Para cada salida, comienza desde el carácter uno a su izquierda y traza el cable, bifurcando (y agregando a la expresión) en cada puerta. Cuando llega a una entrada, la agrega a la expresión y retrocede hasta el último punto en el que se bifurcó, ya que podemos estar seguros de que la bifurcación no es posible sin una puerta. Y, por supuesto, se descartan todos los casos no válidos. Nada realmente especial, y por lo tanto es probable que sea más largo de lo que podría haber sido.
Notas
El tamaño probablemente podría reducirse un poco con cierta reestructuración, pero he dedicado suficiente tiempo a esto por hoy. La versión de golf manual fue la comprimida.
La compresión gzip hace que el golf sea interesante, porque cierto almacenamiento en caché (por ejemplo
d=(-1,0,1)
) en realidad ocupa más espacio que dejar que el algoritmo de compresión se encargue de ello. Sin embargo, opté por jugar al golf la versión manual en la medida de lo posible en lugar de optimizar la compresión.Golf manual (
909895840803):Completo sin golf (2488):
fuente
0
como un dígito? ¿Qué hay de cambiar los pedidos para que eso2
ocurra antes1
, etc..isdigit()
, que es efectivamente equivalente a la expresión regular[0-9]
por lo que puedo decir. ¿Es correcto de acuerdo con sus especificaciones? ¿Qué quiere decir con pedidos intercambiados? La forma en que se implementa, se dirigirá primero a la rama ascendente de cualquier puerta lógica, pero no hay garantía de ordenar las entradas.isdigit()
es consistente. El orden intercambiado significa algo así2
como la primera entrada y1
como la segunda entrada (ordenada verticalmente).Java:
15231512 caracteresDa esta salida para la entrada de muestra:
Para exprimir su tamaño:
r
, sin ninguna extensión de archivo en el nombre.Estoy seguro de que debería ser posible reducirlo más, pero solo un poco.
El intérprete se implementa en forma de algún tipo de autómata celular. Escanea todos los valores de configuración del campo, repitiéndolo tantas veces como sea necesario hasta que no se detecten cambios.
Aquí hay una versión sin golf:
fuente
try{}catch(Exception e){}
que dosthrows Exception
. Probablemente haya otras cosas, pero no tengo idea de cómo jugar al golf en Java.