Kẻ mạo danh ở sở thú


42

Bạn muốn mở một sở thú mới. Nó sẽ là tuyệt vời. Nhưng là loại rẻ tiền mà bạn có, bạn chỉ muốn mua những con vật ba chữ cái (mọi người đều biết rằng chi phí của một con vật tỷ lệ thuận với độ dài của tên của nó). Có giấc mơ của bạn làm cho mọi người trả tiền để xem một elephant. Nhưng đột nhiên bạn có một ý tưởng tuyệt vời. Nếu bạn chỉ đặt các con vật một cách chính xác trong bút, bạn có thể tạo ra ảo ảnh quang học của một elephant! Dưới đây là chế độ xem từ trên xuống của "hợp chất voi" mới của bạn:

elk
  eel
   pig
    hog
     ant

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

Haha, những vị khách cả tin!

Vâng, đây là cách nhận thức hoạt động.

Các thách thức

Cho một từ không trống chỉ bao gồm các chữ cái tiếng Anh viết thường, xác định xem nó có thể được hình thành từ việc chồng chéo 30 từ động vật ba chữ cái sau đây không:

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

Vâng, có hơn 30, nhưng đó là một số tròn đẹp.

Bạn có thể tùy ý nhận danh sách này dưới dạng đầu vào (ở bất kỳ định dạng chuỗi hoặc danh sách hợp lý nào, miễn là nó không được xử lý trước). Có thể bạn sẽ muốn làm điều này, trừ khi đọc và xử lý danh sách đầu vào này là nhiều đắt hơn hardcoding và nén nó trong ngôn ngữ của bạn lựa chọn. Lưu ý rằng ngay cả khi bạn lấy danh sách làm đầu vào, bạn có thể cho rằng nó sẽ luôn chính xác là danh sách này, vì vậy nếu mã của bạn dựa trên danh sách đã qua dài 30 phần tử và không chứa từ nào z, điều đó tốt.

Mỗi từ có thể được sử dụng nhiều lần. Động vật không thể bị cắt ở hai đầu, chỉ bị ẩn đi một phần bởi các động vật khác. Vì vậy, oxkhông phải là một chuỗi có thể, mặc dù chúng ta có fox.

Đầu ra phải là sự thật nếu điều này là có thể, và giả mạo khác.

Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).

Mã của bạn sẽ xử lý bất kỳ trường hợp thử nghiệm nào trong vài giây.

Luật tiêu chuẩn được áp dụng.

Thêm ví dụ

  • Bất kỳ từ một hoặc hai chữ cái rõ ràng là sai.
  • Vì vậy, bất kỳ từ ba chữ cái không có trong danh sách trên.
  • Mặc dù chúng tôi có gnurat, gnatlà giả vì không có cách nào để sắp xếp chúng sao cho bạn chỉ nhìn thấy hai chữ cái của mỗi (chúng tôi không muốn cắt động vật thành ba phần).

Một số ví dụ trung thực:

pigment

    ant
  bee
 olm
pig
antioxidant

   fox
 koi  ide
ant     ant

Các trường hợp thử nghiệm

Hầu hết các trường hợp thử nghiệm được lấy từ việc chạy một triển khai tham chiếu đối với một từ điển. Một vài "từ" cuối cùng được tạo ngẫu nhiên và chỉ ở đó để đảm bảo rằng các bài nộp đủ hiệu quả.

Sự thật:

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

Giả mạo:

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

Tôi vẫn đang đưa ra đề xuất cho một tiêu đề tốt hơn ...
Martin Ender

You may optionally receive this list as input- điều đó có nghĩa là nó không được tính vào điểm số, trong khi mã hóa cứng?
bến tàu

@marinus Vâng. Vì vậy, có lẽ bạn sẽ muốn lấy nó làm đầu vào bổ sung, trừ khi đọc nhiều hơn một chuỗi trên đầu vào thực sự cồng kềnh trong ngôn ngữ bạn chọn. (Tôi không muốn cho phép mã hóa + "nếu bạn làm thế, hãy trừ nó khỏi điểm số của bạn", bởi vì sau đó bạn sẽ khiến mọi người mã hóa và nén nó vào, điều này về cơ bản sẽ mang lại cho họ phần thưởng cho điểm số của họ.)
Martin Ender

" Tham số hàm (out) " có bao gồm các tham số theo tham chiếu không?
mınxomaτ

5
Tôi không thể tin rằng tôi đã bỏ lỡ nhận xét "số tròn" trong hộp cát. Thật xấu hổ cho bạn, thưa ông! Xung quanh những phần 32 này là một số tròn, không phải 30. (Và không hoàn toàn cố gắng rằng bạn đã bỏ qua tên của động vật đực - xem hog).
Peter Taylor

Câu trả lời:


7

Japt, 51 48 45 36 33 19 byte

Đã lưu 9 byte nhờ @PeterTaylor

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

Kiểm tra nó trực tuyến!

Lấy đầu vào là chuỗi để kiểm tra, theo sau là danh sách các từ có ba chữ cái, được phân cách bằng |. Lưu ý: điều này không hoạt động trong phiên bản mới nhất của trình thông dịch, vì vậy vui lòng sử dụng liên kết thay vì sao chép mã.

Làm thế nào nó hoạt động

Ý tưởng cơ bản là lấy chuỗi đầu vào và liên tục thay thế bất kỳ trong số 30 từ trong đó bằng hai ký tự điền. Tôi sử dụng một không gian như là char filler. Ngoài ra, chúng tôi muốn thay thế antin elephant, a  in ela   ,  ntin e   nt, v.v. Vì vậy, điều chúng tôi muốn làm là thay đổi chuỗi 30 từ thành regex phù hợp với bất kỳ kết hợp nào sau đây:

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

Chúng ta có thể làm điều này khá dễ dàng:

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

Tuy nhiên, điều này có tác dụng không mong muốn cũng phù hợp với ba không gian, không có ảnh hưởng đến kết quả và do đó kết thúc việc thay thế đệ quy. Chúng ta có thể khắc phục điều này bằng cách thay thế trận đấu bằng hai khoảng trắng thay vì ba:

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

Đây là một minh chứng cơ bản về cách thức và lý do tại sao điều này hoạt động (sử dụng .thay cho không gian):

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

Đối với các trường hợp thử nghiệm trung thực, điều này để lại cho chúng ta một chuỗi tất cả các không gian. Đối với các trường hợp thử nghiệm giả, chúng tôi có một số chữ cái còn lại trong hỗn hợp. Điều này có thể được dịch thành đúng / sai như vậy:

     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.

Và đó là về nó! Một phần thưởng của phương pháp này là ngay cả những trường hợp thử nghiệm lớn nhất cũng kết thúc trong vòng dưới 5 mili giây. ( Đã thử nghiệm ở đây )


" Đây không phải là một điều dễ dàng với regex một mình " - có chuyện gì với (?!,,,)?
Peter Taylor

@PeterTaylor facepalm Cảm ơn, tiết kiệm khoảng 10 byte ...
Sản phẩm ETH

1
@PeterTaylor Tôi đã tìm thấy một phương pháp ngắn hơn nhiều: chỉ cần thay thế bằng hai khoảng trắng thay vì ba. Xuống tới 19 byte!
Sản xuất ETH

Một khoảnh khắc facepalm sau đó?
Neil

@Neil Yep, khá nhiều. Tôi đã nghĩ về việc thử hai không gian thay vì ba, nhưng tôi không nhận ra nó sẽ hoạt động tốt cho đến sáng nay khi suy nghĩ qua nhiều chiến lược thay thế.
Sản phẩm ETH

3

GNU grep, 62 + 1 = 63 byte

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

Điều này đòi hỏi Ptùy chọn. Đầu vào dự kiến ​​sẽ là động vật được tổng hợp, theo sau là khoảng trắng, theo sau là danh sách các động vật 3 chữ cái được mở, đóng và phân cách bằng dấu chấm than. Ví dụ sử dụng (giả sử chương trình được lưu dưới dạng 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!

Đối với một đầu vào thực sự, dòng đầu vào được lặp lại. Đối với một đầu vào sai, không có đầu ra.

Cảm ơn Martin vì đã phát hiện ra một lỗi và cảnh báo tôi về sự tồn tại của \Btừ không ranh giới.


Có phải grep không có ranh giới không từ \Bđể bạn có thể thoát khỏi cái nhìn cuối cùng? (Nếu không, chuyển sang Retina sẽ tiết kiệm được một vài byte. Thực ra tôi nghĩ rằng dù sao thì nó cũng sẽ tiết kiệm được một byte, vì nó không cần Ptùy chọn.)
Martin Ender

Tôi không thể kiểm tra với grep ngay bây giờ, nhưng điều này có thực sự xử lý các trường hợp kiểm tra sai lệch lớn trong vài giây không? Trong Retina, việc quay lại mất khá nhiều thời gian.
Martin Ender

1
@ MartinBüttner Trong vài trường hợp giả mạo cuối cùng, nó thực sự đã từ bỏ và được in grep: exceeded PCRE's backtracking limit.
frageum

1
Sử dụng GNU một cái gì đó để giải quyết điều này có vẻ rất thích hợp.
Antti29

2

ES6, 122 121 119 104 byte

Tôi đã tìm ra cách thực hiện điều này theo như câu trả lời của ETHproduction nhưng không thể nghĩ ra cách xử lý ,,,vấn đề *, vì vậy, một cách tự nhiên khi tôi thấy nhận xét của Peter Taylor, mọi thứ trở nên rõ ràng. Sau đó, ETHproductions quản lý để tìm ra cách tốt hơn để xử lý vấn đề giúp tiết kiệm 15 byte một cách hữu ích.

Đầu vào là từ mục tiêu và một loạt các từ động vật.

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

Chỉnh sửa: Đã lưu 1 byte 3 byte nhờ @ETHproductions.

* Ngoại trừ tôi đã sử dụng bởi vì nó trông đẹp hơn trong tôi replace.


Rất đẹp! Bất kỳ điều nào trong số những điều này sẽ hoạt động: 1) sử dụng (`(?!&&&)(${a.map...})`)như chuỗi, 2) loại bỏ dấu ngoặc sau khi làm điều đó, 3) bằng cách sử dụng eval`/(?!&&&).../` ?
Sản phẩm điện tử

@ETHproductions Tôi đã phạm sai lầm khi loại bỏ các ()s bên ngoài không hoạt động; với ()nó hoạt động và tiết kiệm cho tôi một byte. evalcũng cần ()s để nó không tiết kiệm gì thêm, xin lỗi.
Neil

Tôi nghĩ rằng bạn cũng có thêm một cặp dấu ngoặc đơn xung quanh a.replace(...).
Sản phẩm điện tử

Bạn có thể lưu một bó: s=s.replace(RegExp(a.map(a=>a.replace(/./g,"[&$&]")).join`|`),'&&')Thay thế bằng hai ký tự thay vì ba loại bỏ khả năng bị kẹt thay thế ba ký tự giống nhau nhiều lần.
Sản phẩm ETH

0

JS ES6, 77 byte

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

(đây là fn ẩn danh)

Đầu vào giống như đầu vào ví dụ grep ở trên


Nếu bạn đang sử dụng đầu vào prompt()mà bạn không nên sử dụng đầu ra alert()? (Hoặc chỉ cần làm cho chức năng này.)
Neil

@Neil cảm ơn, tôi đã sử dụng anon. fn
tên người
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.