Если вы читали книгу « Контакт Карла Сагана», этот вызов может показаться вам знакомым.
Учитывая ввод набора математических уравнений, состоящих из числа, неизвестного оператора, другого числа и результата, определите, какие операторы представляют сложение, вычитание, умножение или деление.
Каждое входное уравнение всегда будет состоять из
- неотрицательное целое число
- одна из букв
A
,B
,C
илиD
- другое неотрицательное целое число
- персонаж
=
- окончательное неотрицательное целое число
соединены вместе. Например, возможный ввод 1A2=3
, из которого вы можете вывести, что A
представляет сложение. Каждое из целых чисел будет удовлетворять 0 ≤ x ≤ 1,000
.
Однако это не всегда так просто. Возможна неясность между:
5A0=5
: сложение / вычитание1A1=1
: умножение / деление0A5=0
: умножение / деление2A2=4
: сложение / умножение4A2=2
: вычитание / деление0A0=0
: сложение / вычитание / умножение
и так далее. Задача состоит в том, чтобы использовать эту возможность, чтобы сузить выбор в сочетании с процессом исключения, чтобы выяснить, какого оператора представляет каждая буква. (Всегда будет хотя бы одно входное уравнение, и всегда можно будет однозначно, однозначно сопоставить каждую букву, использованную во вводе, с одним оператором.)
Например, предположим, что входными данными являются следующие уравнения:
0A0=0
: это сужает A до сложения, вычитания или умножения (не может делиться на 0).10B0=10
: B должно быть либо сложением, либо вычитанием.5C5=10
: C, очевидно, сложение, которое делает B вычитанием, которое делает A умножением.
Следовательно, выходные данные для этих входных уравнений должны совпадать A
с *
, B
с -
и C
с +
.
Входные данные могут быть представлены в виде одной строки с пробелами / запятыми или массива строк, каждая из которых представляет одно уравнение. Выходными данными может быть либо одиночная строка ( "A*B-C+"
), array ( ["A*", "B-", "C+"]
), либо словарь / dict-подобный 2D-массив ( {"A": "*", ...}
или [["A", "*"], ...]
).
Вы можете предположить, что число никогда не будет разделено на другое число, на которое оно не делится (поэтому вам не нужно беспокоиться о том, должно ли деление быть плавающим или усеченным).
Поскольку это код-гольф , выигрывает самый короткий код в байтах.
Тестовые случаи:
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/