Su tarea en este desafío es analizar una determinada "Ecuación de Matchstick" como esta ...
... y para averiguar si se puede convertir en una ecuación válida reorganizando las coincidencias. Si es así, debe generar el menor número de movimientos para hacerlo y la ecuación resultante.
Entrada
La entrada es una cadena que puede leerse desde STDIN, tomarse como un argumento de función o incluso almacenarse en un archivo. Es una ecuación que representa una disposición de fósforo y se puede describir usando el siguiente EBNF:
input = term, "=", term ;
term = number | (term, ("+" | "-"), term) ;
number = "0" | (numeralExceptZero , {numeral}) ;
numeralExceptZero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
numeral = "0" | numeralExceptZero ;
Un ejemplo para una entrada válida sería 3+6-201=0+0+8
.
Tarea
Considere la siguiente ilustración donde cada cerilla tiene un número asignado:
Ahora asignamos cada símbolo de entrada a las posiciones de los fósforos correspondientes de la siguiente manera:
0 ↦ 1,2,3,4,5,6
1 ↦ 4,5
2 ↦ 2,3,5,6,8
3 ↦ 3,4,5,6,8
4 ↦ 1,4,5,8
5 ↦ 1,3,4,6,8
6 ↦ 1,2,3,4,6,8
7 ↦ 4,5,6
8 ↦ 1,2,3,4,5,6,8
9 ↦ 1,3,4,5,6,8
- ↦ 8
+ ↦ 8,10
= ↦ 7,9
Cada fórmula de entrada se puede convertir en una disposición de fósforo. Por ejemplo, la ecuación "45 + 6 = 92" se convierte en
donde los fósforos no utilizados están en gris. Su tarea es encontrar el menor número de fósforos que deben reorganizarse para que la ecuación sea válida.
Salida
Distinguimos entre tres posibles casos:
- Si la entrada no es válida (es decir, no satisface el EBNF anterior), envíe lo que desee.
- De lo contrario, si hay formas de convertir la ecuación en una válida reorganizando las coincidencias, debe generar tanto el número mínimo de reordenamientos como la ecuación correspondiente. Al igual que la entrada, la ecuación de salida también debe satisfacer el EBNF dado. En el ejemplo anterior, la salida correcta sería
1
y46+6=52
. Si existen múltiples posibilidades para la ecuación resultante, envíe cualquiera de ellas. - De lo contrario (si la entrada es válida pero no hay forma de hacer que la ecuación sea verdadera), tiene que dar salida
-1
.
Detalles
- No está permitido eliminar ni agregar coincidencias. Eso significa que, si la entrada está construida con
n
fósforos, la salida también debe consistir exactamente enn
fósforos. - Los bloques de fósforos "vacíos" solo se permiten al final y al comienzo de una ecuación, no en el medio. Así, por ejemplo, convirtiendo
7-1=6
en7 =6-1
por la simple eliminación-1
no está permitido desde el lado izquierdo y añadiéndolo en el lado derecho con sólo 3 reordenamientos cerillas. Como realmente no veo el mapeo de números a posiciones de palillos como una parte interesante de este desafío, por un plus de 20 bytes , puede
- acceder a un archivo en el que la asignación
(number/operation ↦ matchstick positions)
se almacena de manera razonable, o - si su lenguaje de programación admite un
Map
tipo de datos, suponga que tiene acceso a un mapa preinicializado con el mapa(number/operation ↦ matchstick positions)
. Este mapa puede, por ejemplo, verse así:{(0,{1,2,3,4,5,6}),(1,{4,5}),(2,{2,3,5,6,8}),(3,{3,4,5,6,8}), ..., (-,{8}),(+,{8,10}),(=,{7,9})}
- acceder a un archivo en el que la asignación
Ejemplos
Entrada: 1+1=3
↦ Salida: 1
y1+1=2
Entrada: 15+6=21
↦ Salida: 0
y15+6=21
Entrada: 1=7
↦ Salida: -1
Entrada: 950-250=750
↦ Salida: 2
y990-240=750
Entrada: 1-2=9
↦ Salida: 1
y1+2=3
Entrada: 20 + 3=04
↦ Salida: cualquier cosa
Ganador
Este es el código de golf , por lo que gana la respuesta correcta más corta (en bytes). El ganador será elegido una semana después de que se publique la primera respuesta correcta.
0: 1, 2, 3, 4, 5, 6
por coherencia=
(2 fósforos) y-
(1 fósforo) y dejar todos los números donde están. Sin embargo, si el 2 tuviera que moverse hacia la izquierda, también tendría que contar los movimientos requeridos.1+1+2=3-6+10
? Y la misma pregunta sobre la salida.Respuestas:
Javascript, 1069 bytes
Lo he probado con bastantes ecuaciones de prueba y parece que funciona todo el tiempo ahora ...
Bueno, esta es la primera vez que envío una respuesta, así que no me veo ganando. Este es básicamente un método de fuerza bruta para calcular todas las respuestas y luego toma y devuelve las más pequeñas en una matriz. siendo el primer argumento la longitud y el segundo una matriz con las salidas.
si la entrada es "1-2 = 9", la salida es [1, ["1 + 2 = 3", "7-2 = 5"]]
y aquí está el código sin comprimir:
Advertencia: No haga ecuaciones como 950-250 = 750, usa ~ 45 Matchsticks y, dado que este código usa fuerza bruta, hará que se bloquee JavaScript.
fuente
var k
en los bucles, como parámetros no utilizados para la función, ahorrando 3 bytes para cada declaración.08=8
para80=8
es incorrecto.Perl, 334
Bastante rápido siempre que la solución sea accesible en 1 o 2 movimientos. Cuando no hay solución, puede esperar mucho tiempo incluso en el caso más pequeño de
1=7
.Ejemplo:
Esto no encontrará soluciones que cambien la longitud de la ecuación como
11=4
->2 11=11
, pero no estoy seguro de que esto esté permitido.fuente