Основная система представляет собой мнемоническое устройство для преобразования чисел в слова , чтобы они могли быть сохранены более легко.
Он основан на том, как слова звучат фонетически, но чтобы не усложнять задачу, мы будем интересоваться только тем, как пишутся слова. Это означает, что будут некоторые неправильные преобразования, но это нормально.
Чтобы преобразовать число в слово, используя нашу упрощенную основную систему:
- Замените каждый
0
наs
илиz
. (Некоторые могут быть,s
а некоторые могут бытьz
. То же самое ниже.)- Замените каждый
1
наt
илиd
илиth
.- Заменить каждый
2
наn
.- Заменить каждый
3
наm
.- Заменить каждый
4
наr
.- Заменить каждый
5
наl
.- Замените каждый
6
наj
илиsh
илиch
.- Замените каждый
7
наk
илиc
илиg
или илиq
.- Замените каждый
8
наf
илиv
.- Замените каждый
9
наp
илиb
.- Добавляйте буквы
aehiouwxy
где угодно в любых количествах, чтобы сделать реальное английское слово, если это возможно .
Единственным исключением является то, чтоh
не может быть вставлен послеs
илиc
.Число может фактически быть любой строкой цифр 0-9 (без десятичных знаков, запятых или знаков).
Слово может содержать только строчные буквы az.
Примеры
Число 32
должно быть преобразовано как ?m?n?
, где ?
представляет любую конечную строку, составленную из букв aehiouwxy
(строку из свободного моноида, если вы предпочитаете). Есть много способов , которыми это может быть сделано в режиме реального английского слова: mane
, moon
, yeoman
и т.д.
Число 05
может быть преобразовано в ?s?l?
или ?z?l?
. Некоторые возможности easily
, hassle
и hazel
. Слово shawl
не допускается, потому что h
не может быть помещено после s
; это было бы неправильно прочитано как 65
.
Вызов
Напишите программу или функцию, которая принимает строку цифр 0-9 и находит все слова, в которые она может быть преобразована, используя упрощенную системную мнемонику.
Ваша программа имеет доступ к текстовому файлу со списком слов, который определяет, каковы все "настоящие" английские слова. В каждой строке этого файла есть одно строчное z-слово, и вы можете при желании предположить, что в нем есть завершающий символ новой строки. Вот список реальных слов, которые вы можете использовать для тестирования. Вы можете предположить, что этот файл списка слов называется f
(или что-то более длинное) и находится в любом удобном каталоге.
Для штрафа в 35 байт (прибавьте 35 к вашему счету) вы можете предположить, что список слов уже загружен в переменную в виде списка строк. Это в основном для языков, которые не могут читать файлы, но любая отправка может воспользоваться этим.
Ваша программа должна вывести все слова в списке слов, в которые можно преобразовать введенное число. Они должны быть напечатаны в стандартный вывод (или аналогичный), по одному на строку (с необязательным завершающим символом новой строки), или они могут быть возвращены в виде списка строк, если вы решили написать функцию. Список слов не обязательно находится в алфавитном порядке, и вывод не должен быть либо.
Если нет возможных слов, то вывод (или список) будет пустым. Вывод также пуст, если вводится пустая строка.
Возьмите ввод через stdin, командную строку или как строковый аргумент функции. Список слов или имя его файла не должны быть частью ввода, только цифра.
Вы соответствуете только отдельным словам в списке слов, а не последовательности слов. Слово noon
, вероятно, будет одним из результатов для 22
, но последовательность слов no one
не будет.
Тестовые случаи
Предположим, это список слов:
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
zdnmrlshchvb
sthnmrlchgvb
shthnmrlchgvb
bob
pop
bop
bopy
boppy
Вход 0123456789
должен дать все длинные слова , кроме zdnmrlshchvb
и shthnmrlchgvb
:
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
sthnmrlchgvb
Вход 99
должен дать:
bob
pop
bop
bopy
(Выходные слова могут быть в любом порядке.)
счет
Самая короткая подача в байтах побеждает. Tiebreaker переходит к представлению, опубликованному первым.
Отличный связанный сайт: numzi.com .
Ответы:
Perl,
8784Принимает ввод в качестве параметра командной строки:
Можно сделать несколько короче, если список слов будет разрешен для стандартного ввода:
источник
A
значит вopen A,f
?<A>
).Python 2,
215208 байтЭто решение Python создает регулярное выражение из частей, проиндексированных аргументом командной строки, а затем проверяет каждое слово с помощью этого (довольно большого) регулярного выражения.
Первоисточник перед минификатором:
Например, регулярное выражение для теста
99
:Этот
(?<![sc])h
бит является компонентом «поиска за отрицательным утверждением», который следит за тем, чтобы ah
не следовало заs
илиc
в общих частях наполнителя.Спасибо, Кальвин. Этот вызов побудил меня освежить свои ржавые навыки регулярных выражений.
источник
b=c='((?<![sc])h|[aeiouwxy])*'
сэкономит два байта.t|th -> th?
сохраняет байтПитон 3, 170
Читаемая версия:
В коде используется тот факт, что он
th
является избыточным (поскольку он отображается на тот же номерt
, что иh
дополнительный символ).Статическая
maketrans
функция создает таблицу, в которой символы первого аргумента сопоставляются символам второго аргумента, а символы третьего аргумента -None
(что приведет к удалению этих символов).Окончательный код можно сделать на несколько байтов короче, создав таблицу в качестве прямого аргумента
translate
.источник
input()
, что его можно использовать, потому что он вызывается внутри цикла. Кроме того, предложенное вами регулярное выражение имеет ту же длину, что и то, которое я уже использую (5 байт).sed, paste, grep, cut - 109
Принимает файл "w", преобразует каждое слово в его число, вставляет обратно в оригинал, grep для числа и возвращает найденное слово. Обратите внимание, что пробел после кавычки после grep является вкладкой, вставьте разделитель по умолчанию.
Я знаю, что Perl далеко впереди, просто хотел иметь лучшую версию оболочки в качестве примера.
О да, часть $ 1 означает, что она должна быть запущена из сценария оболочки (большинство оболочек должно работать), поэтому она принимает аргумент командной строки.
источник
sed
чтобы избежать открытых и@ARGV
накладных расходов Perl , но отсутствие диапазонов и удаление функцийy///
нарушает его. Удивительно, хотя, хотя нет переменных, вы можете выразить саму логику непосредственно вsed
. Вот мое решение 92:sed -e'h;s/[sc]h/6/g;y/sztdnmrljkcqgfvpb/00112345677778899/;s/[^0-9]*//g;T;s/^$1$//;x;t;d' f
Bash + coreutils, 216
w
sed
заменяет цифры с их возможными заменамиeval printf
использовании оболочка фигурных скобок разложения расширить все возможные заменыsed
в 1-й строке удаляетaeiouwxy
иh
(если не предшествует[sc]
) из списка словaeiouwxy
иh
из списка слов, последнееsed
превращает результаты grep (номера строк каждого соответствия) в другоеsed
выражение, которое обрабатывается самым внешним,sed
чтобы выявить все возможные слова из списка слов.Выход:
Файл списка слов указывается в виде аргумента командной строки, за которым следует мнемонизация:
источник
tr, sed, grep, xargs, sh, 77
Ожидается, что число в stdin и список слов должны храниться в файле
f
.Не использует все замены (1 всегда будет z, 7 всегда будет k), поэтому его можно назвать ленивым решением, но он находит по крайней мере одну мнемонику для 95 чисел в [1-100].
источник
1
всегда бытьz
или7
всегдаk
. Это недействительно.