Вступление
Рассмотрим следующий пример:
CODE
+ GOLF
——————
GREAT
Это уравнение, в котором каждая буква представляет собой десятичную цифру, а слова представляют собой натуральные числа (похожие буквы представляют одинаковые цифры, а разные буквы представляют разные цифры). Задача состоит в том, чтобы сопоставить каждую букву с ее цифровым значением, чтобы уравнение было правильным. Одно решение для уравнения выше:
9265
+ 1278
——————
10543
Твое задание
Ваша задача - написать программу или функцию, которая может решать такие уравнения, как показано выше.
вход
Входные данные представляют собой строку в следующем формате:
[A-Z]+\+[A-Z]+=[A-Z]+
Пример:
CODE+GOLF=GREAT
AA+BB=CC
Пробелы опущены, и будут использоваться только буквы между заглавными буквами A и Z (без специальных или строчных букв).
Эта строка может быть прочитана из стандартного ввода, из файла или как параметр функции.
Выход
У вас есть следующие две опции для выходного формата:
- исходное уравнение с заменой цифр
- список букв и их значений
Если существует несколько решений, любое (но только одно) из них должно быть возвращено. Если решений нет, программа должна вернуть пустую строку или ноль. Вывод может быть возвращен в виде строки, может быть записан в стандартный вывод или файл.
Пример:
9265+1278=10543
A=1 B=2 C=3
(вы можете использовать любой разделитель)
правила
- Чтобы упростить задачу, числа принимаются начинаться с 0, но вы можете обрабатывать числа, начинающиеся с 0, как недействительные решения, решать вам
- Одинаковые буквы обозначают одинаковые цифры, а разные буквы обозначают разные цифры.
- Вы можете использовать любой язык и стандартную библиотеку выбранного языка (без внешних библиотек)
- Вы не можете подключиться к каким-либо ресурсам в Интернете (почему бы вам все равно?)
- Это кодовое задание по гольфу, выигрывает самый короткий код. Последовательные пробельные символы считаются одним символом. (Так что любая программа, написанная в пробеле, автоматически побеждает)
У меня есть несколько хакерских решений с использованием 179 символов. Если что-то не понятно, пожалуйста, спросите меня в комментариях.
источник
If there are no solutions, the program should return an empty string or null.
Бесконечные циклы по-прежнему ничего не выводят ... можно?Ответы:
Python - 48 символов
Злоупотребление правилом пробелов.
Сначала я преобразовал каждый символ в ответе CaesiumLifeJacket в его значение ASCII (я мог бы написать свой собственный, но я ленивый, и это не повлияло бы на окончательный счет в любом случае). Длинная строка в моем решении - это один пробел для каждого из этих значений ASCII и вкладок, разделяющих их. Разделить на вкладки, найти длину, преобразовать обратно в символы и выполнить.
SE преобразует вкладки в 4 пробела каждая, поэтому копирование не будет работать. Вы просто должны верить мне :)
источник
Ruby 2.0, 122 символа
Грубая сила перетасовки + Eval!
Это еще не соответствует критерию возврата пустой / пустой строки, когда нет решения; это просто бесконечно.Если он не может найти результат после ~ 300 миллионов итераций, он вернет ноль. Достаточно близко?Он находит все уникальные буквы на входе, затем несколько раз перемешивает цифры 0-9 и пытается сопоставить их с буквами, пока не найдет работающую конфигурацию.
Код представлен в виде вызываемой функции,
f
которая возвращает строку с замещенными числами, как в варианте вывода 1 выше. Пример использования:Время выполнения
CODE+GOLF=GREAT
примера на моей машине варьируется от мгновенного до примерно 6 секунд - зависит от того, насколько вам повезло с шаффлами!Я особенно недоволен
gsub(/\b0/,'')
битом для удаления начальных нулей, но это было единственное, что я мог помешатьeval
интерпретировать числа как восьмеричные целые.( БОНУС : Поскольку он использует eval, он работает для произвольных выражений Ruby, а не только для сложения!)
источник
permutation
, но, как вы говорите, меня в первую очередь интересовала длина кода.LiveScript (179 символов)
Он имеет детерминированное и относительно быстрое время работы и работает также с другими операторами (+, -, *).
источник
Python,
256213 символовУжасное время работы, постараюсь улучшить еще:
источник
JavaScript 138
Случайный перебор.
Может занять некоторое время (мой лучший выстрел
CODE+GOLF=GREAT
- 3 секунды, мой худший - 3 минуты).Попробуйте это с простым выражением, как
A+B=C
источник
Хаскелл, 222
Грубая сила. Пробует каждое возможное совпадение, пока не найдет его или не попробует все. Я растянул правила вывода: печатает что-то наподобие
[[('C','3'),('O','8'),('D','6'),('E','7'),('G','0'),('L','5'),('F','2'),('R','4'),('A','1'),('T','9')]]
решения, а если ничего не существует, печатает[]
. Дайте мне знать, если мне нужно изменить это.источник
CJam - 17
Всего 975 символов, но 960 из них являются пробелами в 2 последовательностях, поэтому они считаются 2 символами, и вместе с другими 15, мы получаем 17.
975 может показаться большим, но обратите внимание, что решение Python подземного монорельса имеет 18862 символа, они всего на одной строчке :)
Вы можете запустить его на http://cjam.aditsu.net/ для коротких слов, но вам, вероятно, следует использовать интерпретатор java для более длинных. С Java на моем ноутбуке,
SEND+MORE=MONEY
работает в течение 30-40 секунд иCODE+GOLF=GREAT
почти 3 минуты. Он не принимает числа, начинающиеся с 0 (потому что это не круто).Вот программа, которая генерирует программу выше (также помогает, если StackExchange не отображает пробелы правильно):
Первые 11 строк содержат исходную программу (на самом деле не в гольфе) в строке, а последняя строка выполняет преобразование и добавляет часть декодирования.
источник
Powershell, 137 байт
порт LiveScript
Неуправляемый тестовый скрипт:
Выход:
источник
PHP,
118113 байтпечатает цифры ниже букв и выходит из программы; циклы бесконечно, если они неразрешимы. Беги как труба с
-nr
.сломать
источник
PHP, 145 байт
рекурсивная функция, выводит решенное уравнение и выходит из программы; возвращается,
NULL
когда неразрешим.Попробуйте онлайн
сломать
источник