Это словесная загадка.
Ваша программа должна принимать два слова на стандартном вводе.
Слово одно - это начальное слово. Слово два - это последнее слово.
От начального слова вы должны достичь конечного слова, меняя / добавляя / удаляя одну букву за раз. После каждой модификации должно образовываться новое действительное слово. Добавленные буквы добавляются в начало или конец. Вы можете удалить буквы из любого места (но слово не должно опускаться ниже трех букв в длину). Примечание: вы не можете переставить буквы в одно слово.
Выходные данные программы - это последовательность слов, которые нужно получить от начального слова до конечного слова.
Пример:
Input:
Post Shot
Output:
Post
cost
coat
goat
got
hot
shot
Победитель:
- Программа должна быть запущена за разумное время (менее 10 секунд).
- Программа, которая может генерировать кратчайшие выходные последовательности призовых слов.
- Цинк -> Кремний
- Если более одной программы получает самую короткую последовательность, то самая короткая программа в символах (игнорируя пробелы).
- Если у нас все еще есть более чем одна дата / время представления программы, должны использоваться.
Ноты:
- Капитализация не актуальна.
- Код для построения словаря не учитывается в стоимости кода.
- Призовые слова и последовательность будут сгенерированы по адресу :
http://dl.packetstormsecurity.net/Crackers/wordlists/dictionaries/websters-dictionary.gz
- Призовые слова и последовательность будут сгенерированы по адресу :
code-golf
word-puzzle
Мартин Йорк
источник
источник
Ответы:
Python, 288 символов
(не считая строки чтения словаря)
за вызов
zink
наsilicon
:В этом словаре есть несколько странных слов ...
источник
guester overturn
(занимает некоторое время) илиregatta gyrally
(не возвращается) ;-)traceroute - 10 символов
подробно
Маршрутизаторы предварительно настроены с включенным OSPF и расположены таким образом.
И да, мне нужно 233614 маршрутизаторов, чтобы полностью поддерживать все слова. :-)
источник
zink->pink->pank->pani->panic->pinic->sinic->sinico->silico->silicon
я действительно пытаюсь использовать алгоритм Dijkstra (который используется в OSPF), и он может найти этот путь около 1 с, я буду опубликовать его в отдельном сообщении позже, как только я играю в гольф.PHP -
886689644612Загрузка словаря:
Фактический код (просто конкатат оба):
Применение:
Результат:
Это должно выполняться менее чем за 0,5 секунды для «Zink Silicon» и менее чем за 1 секунду в большинстве случаев (иногда дольше, когда решения не существует, но оно все равно возвращается).
При этом используется алгоритм A * с расстоянием Левенштейна для оценки нижних границ расстояний.
Некоторые интересные тесты:
vas arm
->vas bas bar barm arm
(со словом длиннее, чем начало и конец)oxy pom
->oxy poxy poy pom
regatta gyrally
-> (нет, но скрипт корректно завершается)aal presolution
-> +8 символовlenticulated aal
-> -9 символовacarology lowness
-> 46 прыжковcaniniform lowness
-> 51 хмельcauliform lowness
-> 52 прыжковoverfoul lowness
-> 54 прыжковdance facia
-> некоторые слова в пути имеют на 4 символа больше, чем оба начала / концаисточник
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes)
php -dmemory_limit=256M
.had->hand
не является правильным ходом, вы можете только добавить письмо в начало или конец. То же самое дляvest->verst
:-)питон
Так как я не мог сжать коды dijkstra, чтобы сжать их до нескольких сотен байтов, вот моя версия без загадок.
тесты
Добавлены тесты user300
Еще немного
источник
3 <= len(x) <= max(map(len, [nodea, nodeb]))
гарантируется ли, что путь никогда не пройдет через слово длиннее, чем начальное и конечное слова?oxy pom
; кратчайший путьoxy->poxy->poy->pom
. Также кажется, что вы разрешаете перестановки и вставки в любом месте, что недопустимо :-)