Этот вопрос основан на вопросе, который я задал на испанском языке . Да, я попросил алгоритм на испанском языке. :)
В Испании нынешние номерные знаки имеют такую схему:
1234 XYZ
где XYZ - три согласных, взятых из полного набора испанских согласных (я думаю, кроме «С»).
Иногда, путешествуя с моей женой, мы играем в игру. Когда мы видим номерной знак, мы берем три его согласные и пытаемся сформировать слово, содержащее эти три согласных, которые появляются в том же порядке, что и номерной знак. Примеры (на испанском):
BCD
BoCaDo (valid)
CaBezaDa (not valid)
FTL
FaTaL (valid)
FLeTar (not valid)
FTR
FleTaR (valid, wins)
caFeTeRa (valid, loses)
Победителем становится тот, кто использует наименьшее количество символов, как вы можете видеть в последнем примере.
Соревнование
Напишите самую короткую программу или функцию, которая получает список слов и набор из трех согласных и находит самое короткое слово в списке, который содержит три согласных в том же порядке. Для целей этой игры случай не имеет значения.
- Ввод для списка слов (первый параметр) будет массив вашего
string
типа языка . Второй параметр (три согласные) будет другимstring
. Если это лучше для вашего языка, рассмотритеstring
с тремя согласными последний пункт всего списка параметров. Выходной будет другойstring
. - Слова в списке слов не будут выдуманными или бесконечными словами, они будут словами, которые появляются в любом стандартном словаре. Если вам нужен предел, предположим, что ни одно слово в списке не будет длиннее 50 символов.
- Если есть несколько слов с одинаковой длиной, которые могут быть правильным ответом, вы можете вернуть любое из них. Просто убедитесь, что вы возвращаете только одно слово или пустую строку, если никакие слова не соответствуют шаблону трех согласных.
- Вы можете повторять согласные в группе, поэтому допустимыми значениями для этих трех согласных являются
FLR
иGGG
. - Испанские согласные точно такие же, как английские, с добавлением "С". Гласные совпадают с добавлением ударных гласных: «áéíóúü». Никаких других отметок, таких как "-" или "'", не будет.
- Вы можете предположить, что регистр всегда будет одинаковым как в списке слов, так и в трех согласных.
Если вы хотите проверить свой алгоритм на реальной коллекции испанских слов, вы можете загрузить файл (15,9 МБ) из Dropbox с более чем миллионом слов.
Контрольные примеры
Input: 'psr', {'hola' 'repasar' 'pasarais' 'de' 'caída' 'pequeñísimo' 'agüeros'}
Output: 'repasar'
Input: 'dsd', {'dedos' 'deseado' 'desde' 'sedado'}
Output: 'desde'
Input: 'hst', {'hastío' 'chest'}
Output: 'chest'
Это код-гольф , поэтому, может быть, победит самая короткая программа, которая всегда побеждает мою жену! :)
Ответы:
05AB1E ,
108 байтСохранено 2 байта благодаря Лео
Попробуйте онлайн!
объяснение
В
head
конце я бы использовал сохранение байта, но это вывело бы пустой список, если совпадения нет.источник
3ù #keep only those of length 3
зачем вам это?MATL ,
3029 байтПопробуйте онлайн!
объяснение
источник
PHP , 111 байт
Попробуйте онлайн!
источник
You can suppose the case will always be the same in both the word list and the three consonants.
- нет необходимости в модификаторе регулярных выражений. Вы пробовалиwordwrap
вместоjoin(str_split())
?Желе ,
12 1110 байтПолная программа, которая принимает список списков строчных букв (слов) и список строчных букв (букв) и печатает первое из самых коротких слов, которые содержат подпоследовательность, равную буквам (или ничего, если их нет) ).
Попробуйте онлайн!
Как?
источник
Pyth -
2221191211 байт-1 Спасибо Малтысену.
Принимает 2 строки в качестве ввода. 1-й - это трехбуквенная строка (строчные буквы), а 2-й - строчный список слов.
Попробуй здесь
Объяснение:
Старое 19-байтовое решение:
источник
Brachylog v2, 11 байт
Попробуйте онлайн!
Функция представления. (Ссылка TIO имеет аргумент командной строки для запуска функции, как если бы она была полной программой.)
объяснение
Просто прямой перевод спецификации снова ...
На самом деле вы можете почти ответить с помощью
h⊆.&t∋
- замена порядка оценки означает, что Brachylog выберет самый короткий ответ по умолчанию (как первое ограничение, которое он видит⊆
, который имеет довольно удобный «самый короткий» как разрыв связи по умолчанию) - но в этом случае Brachylog Алгоритм оценки, к сожалению, может зайти в бесконечный цикл, если ответ не найден. Таким образом, почти половина ответа посвящена рассмотрению случая отсутствия надлежащего ответа. Даже тогдаlᵒ
переопределение тай-брейка (что технически является своего рода, используя∋
привязка по умолчанию предпочтительных элементов ближе к началу списка) составляет всего два байта; остальные три возникают из-за необходимости выводить пустую строку, в частности, когда вывод не найден, в отличие от значения по умолчанию в брахилоге «без решений» (потому что финал.
будет неявным, если мы не будем следовать за ним∨
).Интересно, что в Brachylog ранее была реализована функция, которая бы сохраняла здесь байт. В какой -то момент, вы можете извлечь элементы из входного аргумента , используя
?₁
,?₂
и т.д. синтаксис; это позволит вам переставить программуtlᵒ∋.⊇?₁∨Ẹ
, что составляет всего 10 байт. К сожалению, используемая реализация на самом деле не работала (и приводила к сбою многих других работающих программ), поэтому она была отменена. Вы можете думать о программе как о «концептуально» длиной 10 байт.источник
Haskell
12912574 байтаКРЕДИТ @nimi
источник
map
иfilter
с пониманием списка. Как у вас уже естьData.List
в области, вы можете использоватьsortOn length
и выбрать голову, чтобы найти элемент с минимальной длиной. Наконец, создайтеy
инфиксную функцию. Все это делаетf
иk
лишнимl#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0
.Data.Lists
, вы можете использоватьargmin
вместоsortOn
и сохранить!!0
:l#w=argmin length[...]
.Data.Lists
имеет много приятных функцийPerl, 53 байта
Код 48 байтов + 5 для
-paF
.Это имеет преимущество того факта , что списки интерполированные в
m//
оператора использовать$"
переменные , которая изменяет исходную строку ввода отpsr
до ,p.*s.*r
который затем соответствуют для каждого дополнительного слова и сортируются наlength
.Попробуйте онлайн!
источник
<<<
оператор добавляет это для меня в командной строке!JavaScript (ES6),
777572 байтаПринимает 3 согласных
c
и список словl
в карри синтаксиса(c)(l)
. Оба входа ожидаются в одном и том же случае.Контрольные примеры
Показать фрагмент кода
источник
c=>l=>l.sort((a,b)=>a[b.length]&&1).find(w=>w.match(c.split``.join`.*`))
за 72, я думаюR 101 байт
Первый раз в гольф! Я уверен, что это может быть сжато как-то
Принимает строку x и символьный вектор y возможных входных данных
Попробуйте онлайн!
Изменить: Моя версия была 135, спасибо Scrooble за -34!
источник
Сетчатка , 58 байт
Попробуйте онлайн! Принимает три согласных в одной строке, а затем список слов во всех последующих строках. Объяснение:
O
сортирует список,¶.+
исключая первую строку с#
числовым$
вводом по$.&
длине. Затем ищется совпадение для строки, которая включает три согласных по порядку. Если подходящая строка существует, чем последняя, т.е. самая короткая, такая строка становится выходной, в противном случае выходные данные являются пустыми.?-s:
Временно выключает эффект ,s`
так что только одна линия соответствует.источник
Пип , 17 байт
Принимает список слов в качестве аргументов командной строки и согласные от stdin. Попробуйте онлайн!
объяснение
источник
Java 8,
132126 байт-6 байт благодаря @Nevay .
Объяснение:
Попробуйте онлайн.
источник
s->a->{String r="";for(String x:a)r=(x.length()<r.length()|r.isEmpty())&x.matches(r.format(".*%s.*%s.*%s.*",s))?x:r;return r;}
Python, 77 байт
Попробуйте онлайн!
источник
MATL ,
282726 байтПопробуйте онлайн!
x
- Неявно взять первый ввод (строка с тремя буквами) и удалить его. Автоматически копируется в буфер обмена G, уровень 1 (эта часть была вдохновлена ответом @Luis Mendo )."
- Неявно взять второй вход (массив слов слов), итерировать по нему.l
- Нажмите 1, чтобы использовать позже1G
- Нажмите первый ввод (скажем, «PSR»)@g
- выдвинуть текущее слово как массив3XN
-nchoosek
- Получить все комбинации из 3 букв из словаXm
- Проверьте, является ли код номерного знака «psr» одной из этих комбинаций. Возвращает 0 для false и 1 для true./
- Деление 1 (что мы выдвинули ранее) на этот результат. Изменяет 0Inf
с на@gn
- получить длину текущего слова*
- Умножьте длину на результат деления. Возвращает длину как она есть, когда слово содержит 3 символа, в противном случае возвращаетInf
v
- вертикально объединить эти результаты в один массив]
- замкнутый цикл&X<
- получить индекс минимального значения из этого массива, т. е. индекс, в котором было найдено слово, содержащее буквы минимальной длины2G
- Нажмите второй вход сноваw
- вернуть индекс min на вершину стека)
- Индекс в массив слов с индексом min, возвращая правильное слово с минимальной длиной(Неявный вывод.)
Старшая:
источник