동물원의 임 포스터


42

새 동물원을 열고 싶습니다. 놀랍습니다. 그러나 당신이 cheapskate이기 때문에, 당신은 단지 3 글자의 동물을 살기를 원합니다 (모든 사람은 동물의 비용이 그 이름의 길이에 비례한다는 것을 알고 있습니다). 사람들이 비용을 지불하도록 만드는 꿈이 있습니다 elephant. 그러나 갑자기 훌륭한 아이디어가 있습니다. 동물을 펜에 올바르게 넣으면 elephant!의 착시 현상을 만들 수 있습니다 . 새 "코끼리 화합물"의 하향식보기는 다음과 같습니다.

elk
  eel
   pig
    hog
     ant

--------  (fence)
    ^
    | viewing direction

하하, 그 참담한 방문객들!

예, 이것이 지각의 작동 방식입니다.

도전

소문자 영어로만 구성된 비어 있지 않은 단어가 주어지면 다음 30 자의 3 글자 동물 단어 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) 매개 변수를 통해 결과를 출력하는 프로그램 또는 함수를 작성할 수 있습니다.

코드는 몇 초 안에 모든 테스트 사례를 처리해야합니다.

표준 규칙이 적용됩니다.

더 많은 예

  • 한 글자 또는 두 글자로 된 단어는 분명히 허위입니다.
  • 위의 목록에없는 3 글자 단어도 마찬가지입니다.
  • 우리가 비록 gnu그리고 rat, gnat그들은 당신이 각의 두 글자를 볼 것을 준비 할 수있는 방법이 (우리 분으로 동물을 절단하고 싶지 않은)가 없기 때문에 falsy입니다.

몇 가지 진실한 예 :

pigment

    ant
  bee
 olm
pig
antioxidant

   fox
 koi  ide
ant     ant

테스트 사례

대부분의 테스트 사례는 사전에 대해 참조 구현을 실행하여 가져 왔습니다. 마지막 몇 개의 "단어"는 무작위로 생성되었으며 제출이 충분히 효율적임을 보장하기 위해 존재합니다.

진실한 :

ant
owl
bass
pride
bobcat
peafowl
elephant
hedgehogs
crocodile
antidemocrat
aspidoganoidei
biodegradability
angioelephantiasis
propreantepenultimate
acategnukeaidabeleenaspcodcoidyakwakoasshogattkjaypigkobolcodidaskearaywelkwboaxbeeuflapaspoapemaassaaspeewoglmabiemuwjadogacagnuepigjaycownbatjaemuifoxkeaeekekeagratsseeluejdoghogaolmgpigbeaeelemulasphogjaydabemukgnunueifoasdoglrayyadogpewlayroassasslgnuaspyyakkbokeaodxilopgnuasppigkobelratelkolmakob
koigdgaspslycoyakehrdabowbatdkkeapogkobelrowlyarpidepetlfoxeboaiderbeefoxbgnuapeocowgiecowlkoieeltbategspemuideatdogbeeecatgeaoccattbbeassgnasolkeaflyelkaognubeeabrratoccolmobodoglyelraywelkoxantowleedrayflypeappigogatraoyakccpiganaaspkobabjaspkointantybjbeeanolmuijaylratojaynueidflyjarayabatmmpigtfly
eolmantjkobeeaorayogaowldfoxayeassapibatmflylyraelaspsseolmbelkkaoantlmufodasgnueantaidenthyakcodoxuepigodggnuantatlcatnuuelkpemucbapeeoiahdogplkowletbatdrayarayoaelkgrayodcatgkantewkobeljaybeeyfkobtbdabadoghbatfoxtflygaspdeidogtowlkeaolmyraelfleelejayehogowlccatoxeabiemkobpigolmdkobrcidekyakabboyidep

거짓 :

a
ox
ram
bear
koala
antelope
albatross
zookeeper
salamander
caterpillar
hippopotamus
koigdgaspslycoyakehrdabowbatdkkeapogkobelrowlyarpidepetlfoxeboaiderbeefoxbgnuapeocowgiecowlkoieeltbategspemuideatdogbeezcatgeaoccattbbeassgnasolkeaflyelkaognubeeabrratoccolmobodoglyelraywelkoxantowleedrayflypeappigogatraoyakccpiganaaspkobabjaspkointantybjbeeanolmuijaylratojaynueidflyjarayabatmmpigtfly
koigdgaspslycoyakehrdabowbatdkkeapogkobelrowlyarpidepetlfoxeboaiderbeefoxbgnuapeocowgiecowlkoieeltbategspemuideatdogbeeecatgeaoccattbbeassgnasolkeaflxelkaognubeeabrratoccolmobodoglyelraywelkoxantowleedrayflypeappigogatraoyakccpiganaaspkobabjaspkointantybjbeeanolmuijaylratojaynueidflyjarayabatmmpigtfly
beyeodpgspeclxlkbkaylldnceepkocbdmymsaogsowpbawbauaioluaaagaetdoaoialeoxaagspoelegflpylptylnolnatrjabaorkdteeydloiebbptatdtfdfgoodtbkoafmounbduaffcrfelcnawmxaskgaoenaattbaobgbgabnhkesbgaaaaotafkiiieatworginaeowaehuddegooaalowaoososaksahoimkulbtoadyyelkcmkacbuostadppcuglbnmotedfgfkoleldonknemomnmoutykg

나는 여전히 더 나은 타이틀에 대한 제안을하고 있습니다.
Martin Ender

You may optionally receive this list as input-그것이 점수에 포함되지 않는 반면에 하드 코딩은 그렇지 않습니까?
marinus

@marinus 네. 따라서 입력에서 둘 이상의 문자열을 읽는 것이 선택한 언어에서 실제로 성가신 경우가 아니라면 추가 입력으로 사용 하고 싶을 것입니다 . (하드 코딩 + "그렇다면 점수에서 빼기"를 허용하고 싶지 않습니다. 사람들이 하드 코딩하고 압축하여 점수에 보너스를 줄 수 있기 때문입니다.)
Martin Ender

" 기능 (출력) 매개 변수 " 에 참조 별 매개 변수가 포함 됩니까?
mınxomaτ

5
샌드 박스에서 "라운드 번호"주석을 놓쳤다는 것을 믿을 수 없습니다. 부끄러운 일입니다! 이 부분들 주위에는 32가 아닌 둥근 숫자가 있습니다. (그리고 수컷 동물의 이름을 완전히 지우려고 시도하지는 않습니다-돼지를보십시오).
피터 테일러

답변:


7

Japt, 51 48 45 36 33 19 바이트

@PeterTaylor 덕분에 9 바이트 절약

;!UeVrE"[$& ]" S² x

온라인으로 테스트하십시오!

테스트 할 문자열로 입력을 사용하고 뒤에 3 자로 된 단어 목록을 |봅니다. 참고 : 최신 버전의 인터프리터에서는 작동하지 않으므로 코드를 복사하여 붙여 넣는 대신 링크를 사용하십시오.

작동 원리

기본 아이디어는 입력 문자열을 가져 와서 30 단어를 반복적으로 두 개의 필러 문자로 바꾸는 것입니다. 필러 문자로 공백을 사용합니다. 또한 antin elephant, a  in ela   ,  ntin e   nt등 을 교체하고 싶습니다 . 따라서 30 단어 문자열을 다음 조합 중 하나와 일치하는 정규식으로 변경해야합니다.

ant|ape|asp|...
Becomes:
[a ][n ][t ]|[a ][p ][e ]|[a ][s ][p ]|...

우리는 이것을 아주 쉽게 할 수 있습니다 :

;VrE"[$& ]"
          // Implicit: V = "ant|ape|asp|..."
;         // Set the vars A-J to various values. E is set to "[a-z]".
VrE       // Take V and replace each lowercase letter with:
"[$& ]"   //  "[" + the char + " ]".

그러나 이것은 3 개의 공백을 일치시키는 바람직하지 않은 효과가 있으므로 결과에 영향을 미치지 않으므로 재귀 대체를 종료합니다. 일치하는 항목을 3 개 대신 2 개의 공백으로 바꾸면이 문제를 해결할 수 있습니다.

Ue    S²  // Take U, and recursively replace matches of the regex with " ".repeat(2).

다음 .은 공간 대신 사용하는 방법과 이유에 대한 기본 데모입니다 .

First match at the end: 
eleant
ele..   (ant)
el..    (eel)
...     (elk)
..      (...)
true

First match at the beginning: 
antmua
..mua   (ant)
...a    (emu)
..a     (...)
..      (boa)
true

First match in the middle: 
cantay
c..ay   (ant)
..ay    (cat)
...     (jay)
..      (...)
true

진실한 테스트 사례의 경우, 이것은 우리에게 모든 공간의 문자열을 남깁니다. 허위 테스트 사례의 경우 믹스에 일부 글자가 남아 있습니다. 이것은 다음과 같이 true / false로 번역 될 수 있습니다.

     x   // Trim all spaces off the ends of the resulting string.
!        // Take the logical NOT of the result.
         // Empty string -> true; non-empty string -> false.

그게 다야! 이 방법의 장점은 가장 큰 테스트 사례조차도 5 밀리 초 이내에 완료된다는 것입니다. ( 여기에서 테스트 )


" 정규식만으로는 쉬운 일이 아닙니다 "-무엇이 잘못 (?!,,,)되었습니까?
피터 테일러

@PeterTaylor facepalm 감사합니다. 약 10 바이트를 절약 할 수 있습니다 ...
ETHproductions

1
@PeterTaylor 훨씬 짧은 방법을 찾았습니다. 단순히 세 개 대신 두 개의 공백으로 바꾸십시오. 최저 19 바이트!
ETHproductions

그때 또 다른 facepalm 순간?
Neil

@Neil Yep, 거의. 나는 3 대신에 2 개의 공간을 시도하는 것에 대해 생각했지만 많은 대안 전략을 생각할 때 오늘 아침까지 잘 작동한다는 것을 알지 못했습니다.
ETHproductions

3

GNU grep, 62 + 1 = 63 바이트

^(((.+)(?=.*!\3))*(...)(?=.*\4!)((.+)(?=.*\6!))*([^qvz]\B)?)+ 

P옵션 이 필요합니다 . 입력은 합성 될 동물, 공백,이어서 개자식 동물의 목록이 열리고, 닫히고, 느낌표로 구분되는 동물 일 것으로 예상된다. 사용법 예 (프로그램이으로 저장되었다고 가정 zoo) :

> grep -Pf zoo
hippopotamus !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!

실제 입력의 경우 입력 라인이 다시 에코됩니다. 잘못된 입력의 경우 출력이 없습니다.

버그를 발견하고 \B경계가없는 단어 의 존재를 경고 해준 Martin에게 감사합니다 .


grep에 단어 경계가없는 문자가 \B없으므로 마지막 미리보기를 제거 할 수 있습니까? (그렇지 않으면 Retina로 전환하면 몇 바이트가 절약됩니다. 실제로 P옵션이 필요 없기 때문에 어쨌든 바이트를 절약 할 것이라고 생각합니다 .)
Martin Ender

나는 지금 grep으로 테스트 할 수 없지만 실제로 몇 초 안에 큰 거짓 테스트 사례를 처리합니까? Retina에서 역 추적에는 꽤 오랜 시간이 걸립니다.
Martin Ender

1
@ MartinBüttner 마지막 ​​몇 가지 잘못된 경우 실제로 포기하고 인쇄했습니다 grep: exceeded PCRE's backtracking limit.
feersum

1
이것을 해결하기 위해 GNU를 사용하는 것이 매우 적절합니다.
Antti29

2

ES6, 122 121 119 104 바이트

나는 ETHproduction의 대답에 이르기 까지이 작업을 수행하는 방법을 연구했지만 ,,,문제 를 처리하는 방법을 생각할 수 없었 으므로 Peter Taylor의 의견을 보았을 때 자연스럽게 모든 것이 명확 해졌습니다. 그런 다음 ETHproductions는 15 바이트를 절약하는 데 도움이되는 문제를 처리하는 더 좋은 방법을 찾았습니다.

입력은 대상 단어와 동물 단어의 배열입니다.

(s,a)=>[...s].map(_=>s=s.replace(RegExp(a.map(a=>a.replace(/./g,"[&$&]")).join`|`),'&&'))&&!/\w/.test(s)

편집 : @ETHproductions 덕분에 1 바이트 3 바이트가 절약되었습니다.

* 내가 더 좋아 보이기 때문에 & s를 사용하는 것을 제외하고 replace.


아주 좋아요! 1) (`(?!&&&)(${a.map...})`)문자열로 사용, 2) 그렇게 한 후 괄호 제거, 3) eval`/(?!&&&).../` ?
ETHproductions

@ETHproductions 나는 ()작동하지 않는 외부를 제거하는 실수를 저질렀다 . 와 ()그것을 작동하고 나에게 바이트를 저장합니다. 더 이상 아무것도 저장하지 않도록 s eval가 필요 ()합니다. 죄송합니다.
Neil

추가 괄호 쌍도 있다고 생각합니다 a.replace(...).
ETHproductions

묶음을 절약 할 수 있습니다. s=s.replace(RegExp(a.map(a=>a.replace(/./g,"[&$&]")).join`|`),'&&')세 개가 아닌 두 개의 글자로 바꾸면 동일한 세 개의 글자가 계속 교체 될 수 있습니다.
ETHproductions

0

JS ES6, 77 바이트

s=>/^(((.+)(?=.*!\3))*(...)(?=.*\4!)((.+)(?=.*\6!))*([^qvz][^\b])?)+/.test(s)

(이것은 익명의 fn입니다)

입력은 위의 grep 예제 입력과 동일


를 사용하여 입력하는 경우 ?를 prompt()사용하여 출력해서는 안됩니다 alert(). (또는 이것을 그냥 기능으로 만드십시오.)
Neil

@ Neil 고마워, 나는 anon을 사용했다. fn
username.ak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.