Если вы читали книгу « Контакт Карла Сагана», этот вызов может показаться вам знакомым.
Учитывая ввод набора математических уравнений, состоящих из числа, неизвестного оператора, другого числа и результата, определите, какие операторы представляют сложение, вычитание, умножение или деление.
Каждое входное уравнение всегда будет состоять из
- неотрицательное целое число
- одна из букв
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/
источник
Ответы:
MATL , 53 байта
Использует текущую версию (10.1.0)
РЕДАКТИРОВАТЬ (12 июня 2016 г.): чтобы адаптироваться к изменениям языка, заменить
Y}
наg
и1L3$)
наY)
. Ссылка ниже включает эти модификацииПопробуйте онлайн!
объяснение
Это проверяет все возможные перестановки четырех операторов в цикле, пока одна перестановка не сделает все уравнения верными.
Чтобы проверить, являются ли уравнения истинными, применяется регулярное выражение для замены четырех букв операторами (в порядке, определяемом текущей перестановкой), и строка преобразуется в числа (оцененные). Это дает массив с таким количеством чисел, что и уравнения, в которых становятся истинные
1
уравнения и ложные уравнения0
. Если этот вектор содержит только1
значения, все готово.Найденное решение назначает операторы четырем буквам, но не все из них обязательно появляются во входных данных. Таким образом, последний тест проводится для удаления неиспользуемых букв (и их соответствующих операторов).
источник
Python, 278 символов
Мой первый ответ по коду гольфа ...
Это просто функция, реализующая алгоритм перебора, вы называете его передачей в качестве аргумента строку уравнений.
источник
["A","B","C","D"]
наlist("ABCD")
?=
в определенииl
.4A2=2 4B3=1
).JavaScript (ES6),
213208 байтобъяснение
Вход и выход являются строками.
Определяет функцию,
f
которая удваивается как рекурсивная функция для генерации всех перестановок операторов и тестирует полные перестановки с использованием входных уравненийeval
.Тестовое задание
Тест не использует аргументы по умолчанию для совместимости браузера.
Показать фрагмент кода
источник