ผู้นำเข้าที่สวนสัตว์


42

คุณต้องการเปิดสวนสัตว์ใหม่ มันจะน่าทึ่ง แต่เมื่อคุณเป็นคนที่ราคาถูกคุณต้องการซื้อสัตว์สามตัวเท่านั้น (ทุกคนรู้ว่าค่าใช้จ่ายของสัตว์นั้นแปรผันตามความยาวของชื่อ) 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 แต่นั่นเป็นจำนวนรอบที่ดี

คุณอาจเลือกรับรายการนี้เป็นอินพุต (ในรายการที่เหมาะสมหรือรูปแบบสตริงใด ๆ ตราบใดที่ยังไม่ได้ประมวลผลล่วงหน้า) คุณอาจต้องการทำสิ่งนี้เว้นแต่ว่าการอ่านและการประมวลผลรายการอินพุตนี้มีราคาแพงกว่าการเข้ารหัสและบีบอัดในภาษาที่คุณเลือก โปรดทราบว่าแม้ว่าคุณจะรายการเป็น input คุณอาจคิดว่ามันจะเป็นว่ารายการนี้ดังนั้นหากรหัสของคุณอาศัยอยู่ในรายชื่อผ่านการเป็น 30 องค์ประกอบที่ยาวนานและไม่ได้มีคำที่มีzที่ดี

แต่ละคำสามารถใช้ได้หลายครั้ง สัตว์ไม่สามารถถูกตัดออกได้ในตอนท้ายสัตว์อื่น ๆ ที่ถูกซ่อนเพียงบางส่วนเท่านั้น ดังนั้นไม่ได้เป็นสตริงที่เป็นไปได้แม้ว่าเรามีoxfox

ผลลัพธ์ควรเป็นจริงหากเป็นไปได้และเป็นเท็จอย่างอื่น

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์

รหัสของคุณควรจัดการกับกรณีทดสอบใด ๆ ในไม่กี่วินาที

ใช้กฎมาตรฐานของ

ตัวอย่างเพิ่มเติม

  • คำหนึ่งหรือสองตัวอักษรใด ๆ ที่เป็นเท็จอย่างเห็นได้ชัด
  • ดังนั้นคำสามตัวอักษรใด ๆ ที่ไม่อยู่ในรายการด้านบน
  • แม้ว่าเราจะมีgnuและrat, gnatเป็น falsy เนื่องจากมีวิธีที่จะจัดให้พวกเขาเช่นนั้นคุณจะเห็นตัวอักษรสองตัวของแต่ละ (เราไม่ต้องการที่จะสัตว์ตัดเป็นสาม)

ตัวอย่างความจริงบางประการ:

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- นั่นหมายความว่ามันจะไม่นับรวมกับคะแนน
marinus

@marinus ใช่ ดังนั้นคุณอาจจะต้องการที่จะนำไปเป็นข้อมูลเพิ่มเติมเว้นแต่การอ่านมากกว่าหนึ่งสายการป้อนข้อมูลเป็นจริงๆยุ่งยากในภาษาของคุณเลือก (ฉันไม่ต้องการอนุญาตให้ใช้ hardcoding + "ถ้าคุณทำได้ให้ลบออกจากคะแนนของคุณ" เพราะคุณจะได้รับคนในการเข้ารหัสและบีบอัดในซึ่งจะช่วยให้พวกเขาได้รับคะแนน)
Martin Ender

พารามิเตอร์ " function (out) " รวมพารามิเตอร์ตามการอ้างอิงหรือไม่
mınxomaτ

5
ฉันไม่อยากจะเชื่อเลยว่าฉันพลาดความคิดเห็น "หมายเลขรอบ" ในกล่องทราย อับอายขายหน้าคุณ! รอบส่วนเหล่านี้ 32 เป็นตัวเลขกลมไม่ใช่ 30 (และไม่ใช่ทั้งหมดที่คุณพยายามทิ้งชื่อสัตว์เพศชาย - ดูหมู)
Peter Taylor

คำตอบ:


7

Japt, 51 48 45 36 33 19 ไบต์

บันทึกแล้ว 9 ไบต์ขอบคุณ @PeterTaylor

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

ทดสอบออนไลน์!

|จะเข้าเป็นสตริงเพื่อทดสอบตามด้วยรายการของคำสามตัวอักษรที่คั่นด้วย หมายเหตุ: วิธีนี้ใช้ไม่ได้กับล่ามเวอร์ชันล่าสุดดังนั้นโปรดใช้ลิงก์แทนการคัดลอกโค้ด

มันทำงานอย่างไร

แนวคิดพื้นฐานคือใช้สตริงอินพุตและแทนที่คำใด ๆ ในคำ 30 คำด้วยตัวกรองสองตัว ฉันใช้ที่ว่างเป็นฟิลเลอร์ถ่าน นอกจากนี้เราต้องการแทนที่antin elephant, a  in ela   ,  ntin e   nt, ฯลฯ ดังนั้นสิ่งที่เราต้องการทำคือการเปลี่ยนสตริง 30 คำให้เป็น regex ที่ตรงกับชุดค่าผสมเหล่านี้:

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 + " ]".

อย่างไรก็ตามสิ่งนี้มีผลที่ไม่พึงประสงค์จากการจับคู่สามช่องว่างซึ่งไม่มีผลต่อผลลัพธ์และสิ้นสุดการแทนที่แบบเรียกซ้ำ เราสามารถแก้ไขได้ด้วยการแทนที่การจับคู่ด้วยช่องว่างสองช่องแทนช่องว่างสามช่อง:

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

สำหรับกรณีทดสอบจริง ๆ สิ่งนี้ทำให้เรามีสตริงของช่องว่างทั้งหมด สำหรับกรณีทดสอบที่ผิดพลาดเรามีตัวอักษรเหลืออยู่บ้าง สิ่งนี้สามารถแปลเป็นจริง / เท็จเช่นนั้น:

     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 มิลลิวินาที ( ทดสอบที่นี่ )


" นี่ไม่ใช่เรื่องง่ายที่จะใช้ regex เพียงอย่างเดียว " - เกิด(?!,,,)อะไรขึ้น
Peter Taylor

@PeterTaylor facepalmขอบคุณที่ช่วยประมาณ 10 ไบต์ ...
ETHproductions

1
@PeterTaylor ฉันพบวิธีที่สั้นกว่ามากเพียงแค่แทนที่ด้วยช่องว่างสองช่องแทนที่จะเป็นสามช่องว่าง ลงไปที่ 19 ไบต์!
ETHproductions

ช่วงเวลาที่ใบหน้าอีกแล้ว?
Neil

@ Neil Yep สวยมาก ฉันคิดเกี่ยวกับการลองสองช่องว่างแทนที่จะเป็นสามช่อง แต่ฉันไม่รู้ว่ามันจะทำงานได้ดีจนถึงเช้านี้เมื่อคิดถึงกลยุทธ์อื่น ๆ
ETHproductions

3

GNU grep, 62 + 1 = 63 ไบต์

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

สิ่งนี้ต้องการPตัวเลือก ข้อมูลที่คาดว่าจะเป็นสัตว์ที่จะสังเคราะห์ตามด้วยช่องว่างตามด้วยรายการของสัตว์ 3 ตัวอักษรเปิดปิดและคั่นด้วยเครื่องหมายอัศเจรีย์ ตัวอย่างการใช้งาน (สมมติว่าโปรแกรมถูกบันทึกเป็น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!

สำหรับอินพุตที่แท้จริงบรรทัดอินพุตจะถูกสะท้อนกลับ สำหรับอินพุตที่เป็นเท็จจะไม่มีเอาต์พุต

ขอบคุณ Martin ที่พบจุดบกพร่องและแจ้งเตือนฉันถึงการมีอยู่ของ\Bคำศัพท์ที่ไม่ใช่ขอบเขต


grep ไม่มีขอบเขตไม่มีคำศัพท์หรือไม่\Bดังนั้นคุณสามารถกำจัด lookahead สุดท้ายได้หรือไม่? (ถ้ามันไม่ได้เปลี่ยนไป Retina จะบันทึกไม่กี่ไบต์ที่จริงผมคิดว่ามันจะช่วยประหยัดไบต์ต่อไปเพราะมันไม่จำเป็นต้อง. Pตัวเลือก.)
มาร์ตินเอนเดอร์

ฉันไม่สามารถทดสอบด้วย grep ได้ในตอนนี้ แต่สิ่งนี้จัดการกับกรณีทดสอบเท็จขนาดใหญ่ได้ในไม่กี่วินาทีหรือไม่? ใน Retina การย้อนรอยใช้เวลาสักครู่
Martin Ender

1
@ MartinBüttnerสำหรับคู่สุดท้ายของกรณี falsy grep: exceeded PCRE's backtracking limitก็จริงให้ขึ้นและพิมพ์
feersum

1
การใช้ GNU เพื่อแก้ปัญหานี้ดูเหมือนจะเหมาะสมอย่างยิ่ง
Antti29

2

ES6, 122 121 119 104 ไบต์

ฉันได้หาวิธีที่จะทำเช่นนี้เท่าที่คำตอบของ ETH ในการผลิต แต่ไม่สามารถคิดวิธีจัดการกับ,,,ปัญหา * ดังนั้นโดยธรรมชาติเมื่อฉันเห็นความคิดเห็นของ Peter Taylor ทุกอย่างชัดเจน จากนั้นผลิตภัณฑ์ ETH สามารถจัดการเพื่อหาวิธีที่ดีกว่าในการจัดการกับปัญหาซึ่งช่วยประหยัดได้ 15 ไบต์

อินพุตคือคำเป้าหมายและอาเรย์ของคำศัพท์สัตว์

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

แก้ไข: บันทึก1 ไบต์ 3 ไบต์ด้วย @ETHproductions

* ยกเว้นผมใช้ & 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 ขอบคุณฉันใช้อานนท์ fn
username.ak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.