Você quer abrir um novo zoológico. Vai ser incrível. Mas, sendo o preço mais baixo que você é, você só quer pagar animais de três letras (todo mundo sabe que o custo de um animal é proporcional ao tamanho do nome). Lá vai o seu sonho de fazer as pessoas pagarem para ver um elephant
. Mas de repente você tem uma ideia brilhante. Se você colocar os animais corretamente na caneta, poderá criar a ilusão de ótica de um elephant
! Aqui está uma visão de cima para baixo do seu novo "composto de elefantes":
elk
eel
pig
hog
ant
-------- (fence)
^
| viewing direction
Haha, esses visitantes crédulos!
Sim, é assim que a percepção funciona.
O desafio
Dada uma palavra não vazia que consiste apenas em letras minúsculas em inglês, determine se ela pode ser formada sobrepondo as seguintes 30 palavras animais de três letras:
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
Sim, existem mais de 30, mas esse é um bom número redondo.
Opcionalmente, você pode receber esta lista como entrada (em qualquer formato razoável de lista ou sequência, desde que não seja pré-processado). Você provavelmente desejará fazer isso, a menos que ler e processar essa lista de entrada seja muito mais caro que codificá-la e compactá-la no seu idioma preferido. Observe que, mesmo que você tome a lista como entrada, você pode assumir que sempre será exatamente essa lista; portanto, se o seu código se basear na lista passada com 30 elementos e sem conter uma palavra z
, tudo bem.
Cada palavra pode ser usada várias vezes. Os animais não podem ser cortados nas extremidades, apenas parcialmente escondidos por outros animais. Portanto, ox
não é uma string possível, mesmo que tenhamos fox
.
A saída deve ser verdadeira, se isso for possível, e falsificar o contrário.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
Seu código deve lidar com qualquer um dos casos de teste em alguns segundos.
Aplicam-se as regras padrão de código de golfe .
Mais exemplos
- Qualquer palavra de uma ou duas letras é obviamente falsa.
- O mesmo ocorre com qualquer palavra de três letras que não esteja na lista acima.
- Mesmo que temos
gnu
erat
,gnat
é Falsas já que não há maneira de organizá-los de tal forma que você só vê duas cartas de cada um (que não quer cortar animais em terços).
Alguns exemplos verdadeiros:
pigment
ant
bee
olm
pig
antioxidant
fox
koi ide
ant ant
Casos de teste
A maioria dos casos de teste foi retirada da execução de uma implementação de referência em um dicionário. As últimas "palavras" foram geradas aleatoriamente e existem apenas para garantir que os envios sejam suficientemente eficientes.
Verdade:
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
fonte
You may optionally receive this list as input
- isso significa que não conta para o placar, enquanto que o código seria?Respostas:
Japt,
514845363319 bytesGuardado 9 bytes graças a @PeterTaylor
Teste online!
Recebe a entrada como a sequência a ser testada, seguida pela lista de palavras de três letras, delimitada por
|
. Nota: isso não funciona na versão mais recente do intérprete, portanto, use o link em vez de copiar e colar o código.Como funciona
A idéia básica é pegar a sequência de entrada e substituir repetidamente qualquer uma das 30 palavras nela por dois caracteres de preenchimento. Eu uso um espaço como caractere de preenchimento. Além disso, queremos substituir o
ant
inelephant
, oa
inela
, ont
ine nt
etc. Então, o que queremos fazer é alterar a sequência de 30 palavras para um regex que corresponda a qualquer uma dessas combinações:Podemos fazer isso facilmente:
No entanto, isso tem o efeito indesejável de combinar também três espaços, o que não afeta o resultado e, portanto, encerra a substituição recursiva. Podemos contornar isso substituindo a partida por dois espaços em vez de três:
Aqui está uma demonstração básica de como e por que isso funciona (usando
.
no lugar de um espaço):Para casos de teste de verdade, isso nos deixa com uma sequência de todos os espaços. Para casos de teste falsos, ainda temos algumas letras na mistura. Isso pode ser traduzido para verdadeiro / falso da seguinte forma:
E é isso! Um bônus desse método é que mesmo os maiores casos de teste terminam em menos de 5 milissegundos. ( Testado aqui )
fonte
(?!,,,)
?GNU grep, 62 + 1 = 63 bytes
Isso requer a
P
opção Espera-se que a entrada seja o animal a ser sintetizado, seguido por um espaço, seguido pela lista de animais de três letras abertos, fechados e delimitados por pontos de exclamação. Exemplo de uso (assumindo que o programa foi salvo comozoo
):Para uma entrada verdadeira, a linha de entrada é repetida. Para uma entrada falsa, não há saída.
Agradeço a Martin por detectar um bug e me alertar sobre a existência de
\B
palavras não-limite.fonte
\B
para que você possa se livrar da última aparência? (Se isso não acontecer, a mudança para Retina iria economizar alguns bytes Na verdade eu acho que ele iria salvar um byte de qualquer maneira, porque ele não precisa do.P
Opção.)grep: exceeded PCRE's backtracking limit
.ES6,
122121119104 bytesEu havia descoberto como fazer isso na resposta da ETHproduction, mas não conseguia pensar em como lidar com o
,,,
problema *, tão naturalmente quando vi o comentário de Peter Taylor, tudo ficou claro. Em seguida, a ETHproductions conseguiu encontrar uma maneira melhor de lidar com o problema, que economiza 15 bytes.Entrada é a palavra alvo e uma matriz de palavras animais.
Edit: Salvo
1 byte3 bytes graças a @ETHproductions.* Exceto que eu usei o & s porque parece melhor no meu
replace
.fonte
(`(?!&&&)(${a.map...})`)
como string, 2) removendo os parênteses depois de fazer isso, 3) usandoeval`/(?!&&&).../`
?()
que não funcionam; com o()
que funciona e me salva um byte.eval
também precisa de()
s para que não salve mais nada, desculpe.a.replace(...)
.s=s.replace(RegExp(a.map(a=>a.replace(/./g,"[&$&]")).join`|`),'&&')
Substituir por dois caracteres em vez de três remove a possibilidade de ficar preso substituindo os mesmos três caracteres repetidamente.JS ES6, 77 bytes
(isto é anônimo fn)
Entrada é igual à entrada de exemplo grep acima
fonte
prompt()
, não deve usar usandoalert()
? (Alternativamente apenas fazer esta função a.)