Se hai letto il libro Contact di Carl Sagan, questa sfida potrebbe sembrarti familiare.
Dato un input di un insieme di equazioni matematiche costituito da un numero, un operatore sconosciuto, un altro numero e un risultato, dedurre quali operatori rappresentano addizione, sottrazione, moltiplicazione o divisione.
Ogni equazione di input sarà sempre composta da
- un numero intero non negativo
- una delle lettere
A
,B
,C
, oD
- un altro numero intero non negativo
- il personaggio
=
- un numero intero non negativo finale
concatenati insieme. Ad esempio, un possibile input è 1A2=3
, dal quale è possibile dedurre che A
rappresenta l'addizione. Ciascuno degli interi soddisferà 0 ≤ x ≤ 1,000
.
Tuttavia, non è sempre così semplice. È possibile che ci sia ambiguità tra:
5A0=5
: addizione / sottrazione1A1=1
: moltiplicazione / divisione0A5=0
: moltiplicazione / divisione2A2=4
: addizione / moltiplicazione4A2=2
: sottrazione / divisione0A0=0
: addizione / sottrazione / moltiplicazione
e così via. La sfida è usare questa capacità per restringere le scelte, combinate con il processo di eliminazione, per capire quale operatore rappresenta ogni lettera. (Ci sarà sempre almeno un'equazione di input e sarà sempre possibile abbinare in modo univoco e in modo univoco ogni lettera utilizzata nell'input con un singolo operatore.)
Ad esempio, supponiamo che l'input sia le seguenti equazioni:
0A0=0
: questo restringe A fino ad addizione, sottrazione o moltiplicazione (non può dividere per 0).10B0=10
: B deve essere addizione o sottrazione.5C5=10
: C è ovviamente un'aggiunta, che fa la sottrazione di B, che fa una moltiplicazione.
Pertanto, l'output per queste equazioni di input deve corrispondere A
a *
, B
con -
e C
con +
.
L'input può essere dato come una singola stringa delimitata da spazi bianchi / virgola o una matrice di stringhe, ognuna delle quali rappresenta un'equazione. L'output può essere una stringa singola ( "A*B-C+"
), un array ( ["A*", "B-", "C+"]
) o un array 2D dizionario / dict ( {"A": "*", ...}
o [["A", "*"], ...]
).
Si può presumere che un numero non verrà mai diviso per un altro numero per il quale non è divisibile (quindi, non è necessario preoccuparsi se la divisione debba essere in virgola mobile o troncata).
Dato che si tratta di code-golf , vince il codice più breve in byte.
Casi test:
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/