Вы хотите открыть новый зоопарк. Это будет потрясающе. Но, будучи дешевым скейтбордом, вы хотите позволить себе только трехбуквенных животных (все знают, что стоимость животного пропорциональна длине его имени). Там идет ваша мечта заставить людей заплатить, чтобы увидеть elephant
. Но вдруг у вас есть блестящая идея. Если вы просто поместите животных правильно в загон, вы можете создать оптическую иллюзию elephant
! Вот вид сверху вашего нового "комплекса слонов":
elk
eel
pig
hog
ant
-------- (fence)
^
| viewing direction
Ха-ха, эти доверчивые посетители!
Да, так работает восприятие.
Соревнование
Если дано непустое слово, состоящее только из строчных букв английского алфавита, определите, может ли оно быть образовано наложением следующих 30 трехбуквенных слов животных:
ant ape asp ass bat bee boa cat cod cow
dab dog eel elk emu fly fox gnu hog ide
jay kea kob koi olm owl pig rat ray yak
Да, их более 30, но это хорошее круглое число.
При желании вы можете получить этот список в качестве входных данных (в любом приемлемом формате списка или строки, если он не был предварительно обработан). Вы, вероятно, захотите это сделать, если только чтение и обработка этого списка ввода не обходятся намного дороже, чем жесткое кодирование и сжатие на выбранном вами языке. Обратите внимание, что даже если вы возьмете список в качестве входных данных, вы можете предположить, что он всегда будет именно этим списком, поэтому, если ваш код опирается на переданный список длиной 30 элементов и не содержащий слова с z
, это нормально.
Каждое слово может быть использовано несколько раз. Животные не могут быть отрезаны на концах, только частично скрыты другими животными. Так что ox
это не возможная строка, хотя у нас есть fox
.
Вывод должен быть правдивым, если это возможно, и ложным в противном случае.
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Ваш код должен обработать любой из тестовых случаев за несколько секунд.
Применяются стандартные правила игры в гольф .
Больше примеров
- Любое одно- или двухбуквенное слово явно ложно.
- Как и любое трехбуквенное слово, которого нет в приведенном выше списке.
- Несмотря на то, что у нас есть
gnu
иrat
,gnat
это ложно, так как нет способа расположить их так, чтобы вы видели только две буквы каждого (мы не хотим разделять животных на трети).
Несколько правдивых примеров:
pigment
ant
bee
olm
pig
antioxidant
fox
koi ide
ant ant
Тестовые случаи
Большинство тестовых случаев были взяты из запуска эталонной реализации со словарем. Последние несколько «слов» были сгенерированы случайным образом и предназначены только для того, чтобы обеспечить достаточную эффективность представлений.
Truthy:
ant
owl
bass
pride
bobcat
peafowl
elephant
hedgehogs
crocodile
antidemocrat
aspidoganoidei
biodegradability
angioelephantiasis
propreantepenultimate
acategnukeaidabeleenaspcodcoidyakwakoasshogattkjaypigkobolcodidaskearaywelkwboaxbeeuflapaspoapemaassaaspeewoglmabiemuwjadogacagnuepigjaycownbatjaemuifoxkeaeekekeagratsseeluejdoghogaolmgpigbeaeelemulasphogjaydabemukgnunueifoasdoglrayyadogpewlayroassasslgnuaspyyakkbokeaodxilopgnuasppigkobelratelkolmakob
koigdgaspslycoyakehrdabowbatdkkeapogkobelrowlyarpidepetlfoxeboaiderbeefoxbgnuapeocowgiecowlkoieeltbategspemuideatdogbeeecatgeaoccattbbeassgnasolkeaflyelkaognubeeabrratoccolmobodoglyelraywelkoxantowleedrayflypeappigogatraoyakccpiganaaspkobabjaspkointantybjbeeanolmuijaylratojaynueidflyjarayabatmmpigtfly
eolmantjkobeeaorayogaowldfoxayeassapibatmflylyraelaspsseolmbelkkaoantlmufodasgnueantaidenthyakcodoxuepigodggnuantatlcatnuuelkpemucbapeeoiahdogplkowletbatdrayarayoaelkgrayodcatgkantewkobeljaybeeyfkobtbdabadoghbatfoxtflygaspdeidogtowlkeaolmyraelfleelejayehogowlccatoxeabiemkobpigolmdkobrcidekyakabboyidep
Falsy:
a
ox
ram
bear
koala
antelope
albatross
zookeeper
salamander
caterpillar
hippopotamus
koigdgaspslycoyakehrdabowbatdkkeapogkobelrowlyarpidepetlfoxeboaiderbeefoxbgnuapeocowgiecowlkoieeltbategspemuideatdogbeezcatgeaoccattbbeassgnasolkeaflyelkaognubeeabrratoccolmobodoglyelraywelkoxantowleedrayflypeappigogatraoyakccpiganaaspkobabjaspkointantybjbeeanolmuijaylratojaynueidflyjarayabatmmpigtfly
koigdgaspslycoyakehrdabowbatdkkeapogkobelrowlyarpidepetlfoxeboaiderbeefoxbgnuapeocowgiecowlkoieeltbategspemuideatdogbeeecatgeaoccattbbeassgnasolkeaflxelkaognubeeabrratoccolmobodoglyelraywelkoxantowleedrayflypeappigogatraoyakccpiganaaspkobabjaspkointantybjbeeanolmuijaylratojaynueidflyjarayabatmmpigtfly
beyeodpgspeclxlkbkaylldnceepkocbdmymsaogsowpbawbauaioluaaagaetdoaoialeoxaagspoelegflpylptylnolnatrjabaorkdteeydloiebbptatdtfdfgoodtbkoafmounbduaffcrfelcnawmxaskgaoenaattbaobgbgabnhkesbgaaaaotafkiiieatworginaeowaehuddegooaalowaoososaksahoimkulbtoadyyelkcmkacbuostadppcuglbnmotedfgfkoleldonknemomnmoutykg
источник
You may optionally receive this list as input
- Значит ли это, что это не засчитывается в счет, в то время как жесткое программирование это будет?Ответы:
Japt,
514845363319 байтСохранено 9 байт благодаря @PeterTaylor
Проверьте это онлайн!
Принимает ввод в качестве строки для проверки, за которой следует список трехбуквенных слов, разделенных символом
|
. Примечание: это не работает в последней версии интерпретатора, поэтому, пожалуйста, используйте ссылку вместо копирования кода.Как это работает
Основная идея состоит в том, чтобы взять входную строку и несколько раз заменить любое из 30 слов в ней двумя символами заполнения. Я использую пробел в качестве заполнителя. Также мы хотим заменить
ant
inelephant
,a
inela
,nt
ine nt
и т. Д. Итак, мы хотим изменить строку из 30 слов на регулярное выражение, соответствующее любой из этих комбинаций:Мы можем сделать это довольно легко:
Однако это также приводит к нежелательному совпадению трех пробелов, что не влияет на результат и, таким образом, завершает рекурсивную замену. Мы можем обойти это, заменив совпадение двумя пробелами вместо трех:
Вот основная демонстрация того, как и почему это работает (используя
.
вместо пробела):Для истинных тестовых случаев это оставляет нам строку всех пробелов. Для ложных тест-кейсов у нас осталось несколько букв. Это может быть переведено в true / false следующим образом:
И это все! Преимуществом этого метода является то, что даже самые большие тестовые случаи заканчиваются менее чем за 5 миллисекунд. ( Проверено здесь )
источник
(?!,,,)
?GNU grep, 62 + 1 = 63 байта
Это требует
P
опции. Предполагается, что вводом будет синтезируемое животное, за которым следует пробел, за которым следует список трехбуквенных животных, открытых, закрытых и разделенных восклицательными знаками. Пример использования (при условии, что программа сохранена какzoo
):Для истинного ввода, строка ввода отражается обратно. Для ложного ввода нет вывода.
Спасибо Мартину за то, что он нашел ошибку и предупредил меня о существовании
\B
слова «non-border».источник
\B
чтобы вы могли избавиться от последнего взгляда? (Если этого не произойдет, переключение на Retina позволит сэкономить несколько байтов. На самом деле я думаю, что это все равно сохранит байт, потому что ему не нужнаP
опция.)grep: exceeded PCRE's backtracking limit
.ES6,
122121119104 байтаЯ разработал, как это сделать, до ответа ETHproduction, но не мог придумать, как справиться с
,,,
проблемой *, поэтому, естественно, когда я увидел комментарий Питера Тейлора, все стало ясно. Тогда ETHproductions удалось найти лучший способ решения проблемы, который помог бы сэкономить 15 байт.Ввод - это целевое слово и массив слов животных.
Редактировать:
1 байтсохранен 3 байта благодаря @ETHproductions.* За исключением того, что я использовал & s, потому что это выглядит лучше в моем
replace
.источник
(`(?!&&&)(${a.map...})`)
в качестве строки, 2) удаление скобок после этого, 3) использованиеeval`/(?!&&&).../`
?()
s, которые не работают; с этим()
он работает и экономит мне байт.eval
также нуждается в()
s, так что он больше ничего не сохраняет, извините.a.replace(...)
.s=s.replace(RegExp(a.map(a=>a.replace(/./g,"[&$&]")).join`|`),'&&')
замена двух символов вместо трех исключает возможность застрять, заменяя одни и те же три символа снова и снова.JS ES6, 77 байт
(это анонимный фн)
Ввод такой же, как в приведенном выше примере с grep
источник
prompt()
Разве вы не должны использоватьalert()
? (Или просто сделайте это функцией.)