Chcesz otworzyć nowe zoo. To będzie niesamowite. Ale będąc tanią łyżwą, którą jesteś, chcesz pozwolić sobie tylko na trzyliterowe zwierzęta (wszyscy wiedzą, że koszt zwierzęcia jest proporcjonalny do długości jego nazwy). Istnieje marzenie, aby ludzie płacili za oglądanie elephant
. Ale nagle masz genialny pomysł. Jeśli po prostu prawidłowo umieścisz zwierzęta we zagrodzie, możesz stworzyć złudzenie optyczne elephant
! Oto widok z góry nowego „związku słoni”:
elk
eel
pig
hog
ant
-------- (fence)
^
| viewing direction
Haha, ci łatwowierni goście!
Tak, tak działa percepcja.
Wyzwanie
Biorąc pod uwagę niepuste słowo składające się tylko z małych angielskich liter, określ, czy można je utworzyć, nakładając następujące 30 trzyliterowe słowa zwierząt:
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
Tak, jest ich ponad 30, ale to ładna okrągła liczba.
Opcjonalnie możesz otrzymać tę listę jako dane wejściowe (w dowolnym rozsądnym formacie listy lub ciągu, o ile nie jest ona wstępnie przetworzona). Prawdopodobnie zechcesz to zrobić, chyba że czytanie i przetwarzanie tej listy danych wejściowych jest znacznie droższe niż kodowanie i kompresowanie jej w wybranym języku. Zauważ, że nawet jeśli weźmiesz listę jako dane wejściowe, możesz założyć, że zawsze będzie to dokładnie ta lista, więc jeśli twój kod opiera się na przekazywanej liście mającej 30 elementów i nie zawierającej słowa z
, to jest w porządku.
Każde słowo może być użyte wiele razy. Zwierzęta nie mogą być odcięte na końcach, tylko częściowo ukryte przez inne zwierzęta. Więc ox
nie jest możliwy ciąg, nawet jeśli mamy fox
.
Dane wyjściowe powinny być zgodne z prawdą, jeśli jest to możliwe, a fałsz w przeciwnym razie.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Twój kod powinien obsłużyć dowolny z przypadków testowych w ciągu kilku sekund.
Obowiązują standardowe zasady gry w golfa .
Więcej przykładów
- Każde jedno- lub dwuliterowe słowo jest oczywiście fałszem.
- Podobnie jak każde trzyliterowe słowo, którego nie ma na powyższej liście.
- Nawet jeśli mamy
gnu
irat
,gnat
jest falsy ponieważ nie ma sposobu, aby zorganizować je tak, że widać tylko dwa listy każda (nie chcemy wyciąć zwierząt na trzy części).
Kilka prawdziwych przykładów:
pigment
ant
bee
olm
pig
antioxidant
fox
koi ide
ant ant
Przypadki testowe
Większość przypadków testowych została zaczerpnięta z uruchomienia implementacji referencyjnej dla słownika. Ostatnie kilka „słów” zostało wygenerowanych losowo i są one tylko po to, aby zapewnić wystarczającą wydajność przesyłania.
Prawda:
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
źródło
You may optionally receive this list as input
- czy to oznacza, że nie liczy się on do partytury, podczas gdy kodowanie byłoby trudne?Odpowiedzi:
Japt,
514845363319 bajtówZaoszczędź 9 bajtów dzięki @PeterTaylor
Przetestuj online!
Pobiera dane wejściowe jako ciąg znaków do przetestowania, a następnie listę słów trzyliterowych, rozdzielonych znakiem
|
. Uwaga: nie działa to w najnowszej wersji interpretera, więc użyj linku zamiast kopiowania i wklejania kodu.Jak to działa
Podstawową ideą jest pobranie ciągu wejściowego i wielokrotne zastępowanie dowolnego z 30 zawartych w nim słów dwoma znakami wypełniającymi. Używam spacji jako znaku wypełniającego. Chcemy również zastąpić
ant
inelephant
,a
inela
,nt
ine nt
itp. Więc chcemy zmienić 30-wyrazowy ciąg na wyrażenie regularne pasujące do dowolnej z tych kombinacji:Możemy to zrobić dość łatwo:
Ma to jednak niepożądany efekt dopasowania również trzech spacji, co nie ma wpływu na wynik, a zatem kończy rekurencyjną zamianę. Możemy to obejść, zastępując mecz dwoma spacjami zamiast trzema:
Oto podstawowa demonstracja tego, jak i dlaczego to działa (użycie
.
zamiast spacji):W przypadku prawdziwych przypadków testowych pozostawia nam to ciąg wszystkich spacji. W przypadku fałszywych przypadków testowych pozostało kilka liter w miksie. Można to przetłumaczyć na prawda / fałsz tak:
I o to chodzi! Zaletą tej metody jest to, że nawet największe przypadki testowe kończą się w czasie poniżej 5 milisekund. ( Testowane tutaj )
źródło
(?!,,,)
?GNU grep, 62 + 1 = 63 bajty
To wymaga
P
opcji. Dane wejściowe mają być zwierzęciem, które ma zostać zsyntetyzowane, a następnie spacją, a następnie listą 3-literowych zwierząt otwartych, zamkniętych i ograniczonych wykrzyknikami. Przykładowe użycie (przy założeniu, że program zostanie zapisany jakozoo
):Dla prawdziwego wejścia linia wejściowa jest wyświetlana z powrotem. W przypadku fałszywych danych wejściowych nie ma danych wyjściowych.
Podziękowania dla Martina za wykrycie błędu i powiadomienie mnie o istnieniu
\B
słowa „bez granic”.źródło
\B
, abyś mógł pozbyć się ostatniego spojrzenia? (Jeśli nie, przełączanie do siatkówki byłoby zaoszczędzić kilka bajtów Właściwie myślę, że byłoby to zapisać bajt w każdym razie, bo nie potrzebuje.P
Opcji).grep: exceeded PCRE's backtracking limit
.ES6,
122121119104 bajtówNauczyłem się, jak to zrobić, jeśli chodzi o odpowiedź ETHproduction, ale nie mogłem wymyślić, jak poradzić sobie z
,,,
* problemem, więc naturalnie, gdy zobaczyłem komentarz Petera Taylora, wszystko stało się jasne. Następnie ETHproductions udało się znaleźć lepszy sposób na rozwiązanie problemu, który pomaga zaoszczędzić 15 bajtów.Dane wejściowe to słowo docelowe i tablica słów zwierząt.
Edycja: Zapisano
1 bajt3 bajty dzięki @ETHproductions.* Tyle że użyłem & s, ponieważ wygląda ładniej w moim
replace
.źródło
(`(?!&&&)(${a.map...})`)
jako ciągu, 2) usunięcie nawiasów po wykonaniu tego, 3) użycieeval`/(?!&&&).../`
?()
które nie działają; dzięki()
temu działa i oszczędza mi bajt.eval
potrzebuje również()
s, więc nie oszczędza nic więcej, przepraszam.a.replace(...)
.s=s.replace(RegExp(a.map(a=>a.replace(/./g,"[&$&]")).join`|`),'&&')
Zastąpienie dwoma znakami zamiast trzema usuwa możliwość utknięcia, zastępując te same trzy znaki w kółko.JS ES6, 77 bajtów
(to anonimowy fn)
Dane wejściowe są takie same jak w powyższym przykładzie grep
źródło
prompt()
czy nie powinieneś używać danych wyjściowychalert()
? (Ewentualnie po prostu włącz tę funkcję.)