Для данного файла словаря (текстовый файл, содержащий слово или фразу в каждой строке, с возможной пунктуацией, но без цифр; строки располагаются в алфавитном порядке), вы должны вывести каждую комбинацию слов, где одна буква может быть удалена из слова для создания другой; удаленное письмо должно быть заключено в скобки.
Например, вход
cat
cart
code
golf
ode
verify
versify
должен дать вывод
ca(r)t
(c)ode
ver(s)ify
Несколько способов получить одну и ту же пару должны отображаться только один раз. Вы можете вывести scra(p)ped
или scrap(p)ed
, но не оба.
Вывод должен быть упорядочен в алфавитном порядке по более длинной записи;
mart
mar
mat
ma
должен иметь выход
ma(r)
ma(t)
ma(r)t
mar(t)
и последние два могут быть в любом порядке.
Файл словаря может содержать заглавные буквы, пробелы, дефисы или апострофы; это следует игнорировать. Например,
inlay
in-play
должен производить in(p)lay
. Ваш вывод должен быть в одном и том же случае. Дополнительные пробелы разрешены.
Ввод может быть STDIN или из файла; это разделено новыми строками. Вывод может быть возвращаемым значением функции или STDOUT (или записываться в файл, если вы хотите).
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
(Это мой первый вызов на PPCG - дайте мне знать, если я сделал что-то не так, и я это исправлю.)
mart mar mat ma
? Это будетmar(t) ma(r)t ma(r) ma(t)
?Ответы:
Perl -an0, 101 + 3 байта
где
@F
это словарь, хранящийся в массиве, предоставленный волшебным флагом времени выполнения. (b-oost, BoO # @% @ # $% $ # @ T)map{s/\W//g;lc}@F
удаляет все символы из слов и превращает все в строчные. (буст, загрузка)sort{length$b<=>length$a}
сортирует по длине. (загрузка, повышение)map{ (...) while/(.)(?!\1)/g}@F
соответствует всем символам, за которыми не следует один и тот же символ ([b] oot, bo [o] t, boo [t], ...)print"$`($1)$'\n"
печатает части, которые предшествуют, ставят круглые скобки и следуют за соответствием ... (boo (s) t)if $`.$'~~@F
... если объединение всего до и после совпадения есть в словаре. ([увеличение])источник
JavaScript (ES6), 225
Функция со строковым параметром, без ввода из файла. Я спросил OP, если это может быть действительным.
Тестовый запуск фрагмента в браузере, совместимом с EcmaScript 6 (реализация функций стрелок, строки шаблона, оператора распространения - Firefox, возможно, Safari или MS Edge, а не Chrome)
источник
Руби, 173
Проверьте это здесь: http://ideone.com/86avbe
Читаемая версия здесь: http://ideone.com/ynFItB
источник
['jacklantern','jackslantern','jack-o-lantern']
dict.The output should be ordered by the longer entry;
...and the latter two could be in either order.
Руби, 211
Я решил использовать другой подход, чтобы решить эту проблему, используя регулярные выражения.
источник
Perl 5, 210
Код загружает входные данные в отсортированный массив и проверяет каждое значение по всем значениям в массиве, которые на 1 байт длиннее.
Тестовое задание
источник
Haskell, 201 байт
Я не уверен, какой формат ввода разрешен.
f
занимает список строк. Если разрешена только одна строка (с nl разделенными словами), добавьте.lines
кf
(+6 байт).Пример использования:
Как это работает: превращайте каждое слово в строчные и оставляйте только буквы. Разбейте каждое слово
x
на две части в каждой возможной позиции и сделайте тройки,(i,j,k)
гдеi
первая часть,j
первый символ второй части иk
хвост второй части. Держите тройки, гдеi++k
также появляется в списке слов. Если этот список не пуст, возьмите первый элемент, вызовите его(l,m,n)
. Включите все эти список головок в требуемый формат вывода, окруживm
с()
и положить его междуl
иn
.источник