Крупнейший форум в Интернете под названием postcount ++ решил создать новую форумную игру. В этой игре цель состоит в том, чтобы опубликовать слово, но слово должно быть добавлено, удалено или изменено. Ваш босс хотел, чтобы вы написали программу, которая получит слово, и словарь UNIX, поскольку вы работаете в компании, которая имеет более интеллектуальный форум с более интеллектуальными играми на форумах и хочет уничтожить конкурентов (эй, это ваш босс, не надо обсудить с ним, вы получите много денег с вашей работы в любом случае).
Ваша программа получит два аргумента, слово и словарь. Поскольку пользователь, управляющий программой (да, пользователь, у вашей компании нет ресурсов для запуска ботов) не идеален, вам следует нормализовать ситуацию в обоих случаях. Слова в словаре могут иметь буквы ASCII (как в верхнем, так и в нижнем регистре, но это следует игнорировать при сравнении), тире, апострофы и непоследовательные пробелы в середине. Они не будут длиннее 78 символов. Вы должны вывести список слов, которые будут приняты в игре, чтобы развлечь людей, которые думают о словах вручную.
Это пример вашей ожидаемой программы, проверяющей похожие слова на golf
.
> ./similar golf /usr/share/dict/words
Goff
Wolf
gold
golfs
goof
gulf
wolf
/usr/share/dict/words
Список слов, с разрывом строки после каждого. Вы можете легко прочитать это, например, с помощью fgets ().
Компания, в которой вы работаете, не имеет много перфокарт (да, это 2014, и они все еще используют перфокарты), поэтому не тратьте их впустую. Напишите как можно более короткую программу. О, и вас попросили не использовать встроенную или внешнюю реализацию расстояния Левенштейна или любой подобный алгоритм. Что-то о не изобретенном здесь или бэкдорах, которые, по-видимому, продавец вставил в язык (у вас нет доказательств этого, но вы не обсуждаете это со своим боссом). Так что, если вам нужно расстояние, вам придется реализовать его самостоятельно.
Вы можете свободно использовать любой язык. Даже с перфокартами у компании есть доступ к самым современным языкам программирования, таким как Cobol Ruby или Haskell, или что угодно. У них даже есть GolfScript, если вы думаете, что он хорош для манипуляции со строками (я не знаю, возможно ...).
Победитель получает 15 очков репутации от меня и, вероятно, множество других очков от сообщества. Другие хорошие ответы получат 10 баллов, а также баллы от сообщества. Вы слышали, что очки бесполезны, но, скорее всего, они заменят доларов в 2050 году. Однако это не подтвердилось, но в любом случае неплохо получать очки.
Ответы:
GolfScript, 59 символов
Конечно, GolfScript является большим для работы со строками!
В GolfScript не очень хорошо получается обрабатывать файловый ввод / вывод или аргументы командной строки. Таким образом, эта программа ожидает получить весь свой ввод через stdin: первая непустая строка считается целевым словом, а остальные строки должны содержать словарь. В системе Unixish вы можете запустить этот код, например, с помощью:
На моем компьютере с Ubuntu Linux вывод команды выше:
Обратите внимание, что все слова преобразуются в нижний регистр, а любые дубликаты удаляются; Таким образом, в отличие от вашего примера вывода, мой не перечисляет
Wolf
иwolf
отдельно. Исходя из вашего описания вызова, я предполагаю, что это приемлемо.Кроме того, код очень медленный, так как он использует подход довольно грубой силы и не использует даже очевидных оптимизаций, таких как проверка того, что длина слова-кандидата совпадает с длиной целевого слова ± 1. Тем не менее, он действительно может пойти через полный, нефильтрованный
/usr/share/dict/words
список в ... хм ... я дам вам знать, когда он закончится, хорошо?Изменить: ОК, это заняло около 25 минут, но это закончилось.
источник
Bash + coreutils, 99 байт
Либо я полностью неправильно понял вопрос ( ответ @ lambruscoAcido дает совершенно разные результаты ), либо это довольно простое приложение регулярного выражения:
Выход:
источник
${a:b:c}
делать?b
чтобыc
в переменнойa
c
начинающаяся с позицииb
( начиная с нуля) из переменнойa
. Расширение подстроки является одним из расширений параметров bashPython 3, 291 символов
Очень простой и, следовательно, не очень умный. Но с большим вкусным клубком генератора и оптимизированной медлительностью. Потому что вы не хотите оставлять выделенное время вычислений неиспользованным, не так ли?
источник
l=len
иr=range
уменьшить эти функции в дальнейшем.Скала -
403130[Обновлено]: полностью обновлено, поскольку прежнее решение также допускает перестановочные буквы. Не использует регулярные выражения или какие-либо встроенные инструменты.
Ungolfed:
Использование:
источник
atechny
не меняет одну букву. Это решение делает что-то не связанное с вопросом.Python, 174 символа:
Быстро и точно.
Пример:
Выход:
Я предполагаю, что файл слов OS X просто имеет больше записей.
источник
golf'
.golf'
, он будет напечатан.Хаскелл - 219
источник
Реболь - 213
Ungolfed (с некоторыми комментариями):
Пример использования (протестировано в Rebol 3 на OS X Lion):
Ниже приводится
parse
правило, созданное для сопоставления похожих слов с гольфом :источник
Python (103):
Я думаю, довольно эффективно. Кроме того, мне нравится, насколько хорошо это игра в гольф на Python.
источник