Фон
Три года назад этот парень Том Мерфи задумал распространить идею портманто на все слова в языке и назвал это portmantout ( portmanteau plus tout [Французский для всех ]). Определив английский как список из 108 709 слов, он сумел найти последовательность из 611 820 букв со следующими двумя свойствами:
- Каждое английское слово содержится в строке.
- Некоторая окрестность, содержащая любые две соседние буквы в строке, является английским словом.
Вот ссылка на страницу, на которой можно найти этот portmantout (вместе с объяснением видео).
Portmantout
Первое из двух свойств portmantout легко понять. Второе может потребовать некоторого объяснения.
По сути, слова должны совпадать. "golfcode" никогда не появится в portmantout английского языка, так как там нет слова, содержащего "fc". Тем не менее, вы можете найти «codegolf» в portmantout, поскольку «эго» устраняет пробел (а все остальные пары букв находятся либо в «коде», либо в «гольфе»).
Твое задание:
Напишите программу или функцию, которая принимает список строк и возвращает любой портмантут из списка.
Этот код Python 3 проверит вывод порта.
Контрольные примеры
Все списки неупорядочены; то есть,
{"code", "ego", "golf"} -> "codegolf"
{"more", "elm", "maniac"} -> "morelmaniac" or "morelmorelmaniac" or "morelmorelmorelmaniac" or...
Would a morelmaniac be some sort of mycologist?
{"ab", "bc", "cd", "de", "ef", "fg", "gh", "hi", "ij", "jk", "kl", "lm", "mn", "no", "op", "pq", "qr", "rs", "st", "tu", "uv", "vw", "wx", "xy", "yz", "za"} -> "abcdefghijklmnopqrstuvwxyza" or "rstuvwxyzabcdefghijklmnopqrstuvwxyzabcdef" or any 27+ letters in order
И почему бы нет? Огромный на сайте Мерфи, если ваш код выполняется в разумные сроки.
правила
- Ваш код должен остановиться.
- Вам не нужно возвращать один и тот же portmantout при каждом выполнении.
- Вы можете предположить , что все строки состоят только из строчных букв
a
черезz
. - Если портмантут не возможен, ваша программа может делать что угодно. Пример:
{"most", "short", "lists"}
- Применяются стандартные правила для ввода / вывода и лазеек .
Это код-гольф , поэтому выигрывает самое короткое решение (в байтах) на каждом языке! Удачного игры в гольф!
источник
{"sic", "bar", "rabbits", "cradle"} -> "barabbitsicradle"
{"mauve", "elated", "cast", "electric", "tame"} -> "mauvelectricastamelated"
(больше тестов)Ответы:
Python 2 ,
204202 байтаПопробуйте онлайн!
Сохраненный
источник
["ab", "ba", "ca"]
. Мое решение имеет ту же ошибку.Pyth, 39 байт
Попробуй здесь
объяснение
источник
Stax ,
3936 байтЗапустите и отладьте его
Запускает все контрольные примеры детерминистически за секунду.
Это рекурсивный алгоритм.
Вот программа распакована, разархивирована и прокомментирована.
Запустите этот
Изменить: Это не работает для класса входов, который имеет цикл, как
["ab", "ba", "ca"]
, как и большинство других опубликованных ответов.источник
JavaScript (ES6),
138130 байтВозвращает ошибку для списков, которые не могут быть полностью портированы.
Ungolfed:
Показать фрагмент кода
Код мучительно медленный на примере полного алфавита (по этой причине не включен в приведенный выше фрагмент).
Это исправляется изменением
map
s наsome
s для потери 2 байтов:Показать фрагмент кода
источник