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/