Si ha leído el libro Contacto de Carl Sagan, este desafío puede parecerle familiar.
Dada una entrada de un conjunto de ecuaciones matemáticas que consisten en un número, un operador desconocido, otro número y un resultado, deduce qué operadores representan la suma, resta, multiplicación o división.
Cada ecuación de entrada siempre consistirá en
- un entero no negativo
- una de las cartas
A
,B
,C
, oD
- otro entero no negativo
- el personaje
=
- un entero final no negativo
concatenados juntos Por ejemplo, una posible entrada es 1A2=3
, a partir de la cual puede deducir que A
representa la suma. Cada uno de los enteros satisfará 0 ≤ x ≤ 1,000
.
Sin embargo, no siempre es tan simple como eso. Es posible que haya ambigüedad entre:
5A0=5
: suma resta1A1=1
: multiplicación / división0A5=0
: multiplicación / división2A2=4
: suma / multiplicación4A2=2
: resta / división0A0=0
: suma / resta / multiplicación
y así. El desafío es utilizar esta capacidad para reducir las opciones, combinadas con el proceso de eliminación, para determinar qué operador representa cada letra. (Siempre habrá al menos una ecuación de entrada, y siempre será posible hacer coincidir inequívocamente y de manera única cada letra utilizada en la entrada con un solo operador).
Por ejemplo, supongamos que la entrada es las siguientes ecuaciones:
0A0=0
: esto reduce A a la suma, resta o multiplicación (no se puede dividir por 0).10B0=10
: B tiene que ser suma o resta.5C5=10
: C es obviamente la suma, lo que hace que la resta B, que hace la multiplicación A.
Por lo tanto, la salida para estas ecuaciones de entrada debe coincidir A
con *
, B
con -
y C
con +
.
La entrada puede darse como una sola cadena delimitada por espacios en blanco / coma o una matriz de cadenas, cada una representando una ecuación. La salida puede ser una sola cadena ( "A*B-C+"
), una matriz ( ["A*", "B-", "C+"]
) o una matriz 2D tipo diccionario / diccionario ( {"A": "*", ...}
o [["A", "*"], ...]
).
Puede suponer que un número nunca se dividirá por otro número por el que no sea divisible (por lo tanto, no debe preocuparse por si la división debe ser de punto flotante o truncada).
Como se trata de código golf , gana el código más corto en bytes.
Casos de prueba:
In Out
-------------------------------
0A0=0 10B0=10 5C5=10 A*B-C+
100D100=10000 D*
4A2=2 4B2=2 0A0=0 A-B/
15A0=15 4B2=2 2C2=0 A+B/C-
1A1=1 0A0=0 A*
0A0=0 2A2=4 5B0=5 2B2=4 A*B+
2A2=4 0C0=0 5B0=5 5A0=5 A+B-C*
0A1000=0 4A2=2 A/
fuente
Respuestas:
MATL , 53 bytes
Utiliza la versión actual (10.1.0)
EDITAR (12 de junio de 2016): para adaptarse a los cambios en el idioma, reemplazar
Y}
porg
y1L3$)
porY)
. El siguiente enlace incorpora esas modificacionesPruébalo en línea!
Explicación
Esto prueba todas las permutaciones posibles de los cuatro operadores en un bucle hasta que una permutación hace que todas las ecuaciones sean verdaderas.
Para probar si las ecuaciones son verdaderas, se aplica una expresión regular para reemplazar las cuatro letras por los operadores (en el orden dictado por la permutación actual), y la cadena se convierte en números (evaluado). Esto proporciona una matriz con tantos números como ecuaciones, en la que se convierten las
1
ecuaciones verdaderas y las ecuaciones falsas0
. Si este vector solo contiene1
valores, hemos terminado.La solución encontrada asigna operadores a las cuatro letras, pero no todas aparecen necesariamente en la entrada. Entonces, se realiza una prueba final para descartar las letras no utilizadas (y sus operadores coincidentes).
fuente
Python, 278 caracteres
Mi primera respuesta en el código de golf ...
Es solo una función que implementa un algoritmo de fuerza bruta, lo llama pasar como argumento la cadena de ecuaciones.
fuente
["A","B","C","D"]
conlist("ABCD")
?=
en la definición del
.4A2=2 4B3=1
).JavaScript (ES6),
213208bytesExplicación
La entrada y la salida son cadenas.
Define una función
f
que también funciona como una función recursiva para generar todas las permutaciones de los operadores y prueba permutaciones completas con las ecuaciones de entrada usandoeval
.Prueba
La prueba no utiliza argumentos predeterminados para la compatibilidad del navegador.
Mostrar fragmento de código
fuente