Se você leu o livro Contato de Carl Sagan, esse desafio pode lhe parecer familiar.
Dada a entrada de um conjunto de equações matemáticas que consiste em um número, um operador desconhecido, outro número e um resultado, deduza quais operadores representam adição, subtração, multiplicação ou divisão.
Cada equação de entrada sempre consistirá em
- um número inteiro não negativo
- uma das cartas
A
,B
,C
, ouD
- outro inteiro não negativo
- o personagem
=
- um número inteiro não negativo final
concatenados juntos. Por exemplo, uma entrada possível é 1A2=3
, da qual você pode deduzir que A
representa adição. Cada um dos números inteiros irá satisfazer 0 ≤ x ≤ 1,000
.
No entanto, nem sempre é tão simples assim. É possível que exista ambiguidade entre:
5A0=5
: adição subtração1A1=1
: multiplicação / divisão0A5=0
: multiplicação / divisão2A2=4
: adição / multiplicação4A2=2
: subtração / divisão0A0=0
: adição / subtração / multiplicação
e assim por diante. O desafio é usar essa capacidade para restringir as opções, combinadas com o processo de eliminação, para descobrir qual operador cada letra representa. (Sempre haverá pelo menos uma equação de entrada e sempre será possível corresponder inequivocamente a cada letra usada na entrada com um único operador.)
Por exemplo, digamos que a entrada seja as seguintes equações:
0A0=0
: reduz A a adição, subtração ou multiplicação (não é possível dividir por 0).10B0=10
: B deve ser adição ou subtração.5C5=10
: C é obviamente adição, que faz subtração B, que faz multiplicação A.
Portanto, a saída para essas equações de entrada deve corresponder A
a *
, B
com -
e C
com +
.
A entrada pode ser fornecida como uma única string delimitada por espaço em branco / vírgula ou uma matriz de strings, cada uma representando uma equação. A saída pode ser uma única string ( "A*B-C+"
), uma matriz ( ["A*", "B-", "C+"]
) ou uma matriz 2D do tipo dicionário / ditado ( {"A": "*", ...}
ou [["A", "*"], ...]
).
Você pode assumir que um número nunca será dividido por outro número pelo qual não é divisível (portanto, não é necessário se preocupar se a divisão deve ser ponto flutuante ou truncado).
Como esse é o código-golfe , o código mais curto em bytes vence.
Casos de teste:
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/