ท้ายที่สุดน้ำไปถึงถังหรือไม่?


30

ในโลกศิลปะ ASCII มีน้ำผนังแฮชและกลไกตัวอักษร

คุณอยู่ในห้องที่ประกอบด้วยผนังแฮช ( #ป้าย):

#######
#     #
#     #
#     #
# ### #
#     #
#######

คุณติดตั้งแหล่งน้ำ S ( Sเครื่องหมาย) และถังเก็บน้ำ E ( Eเครื่องหมาย) ซึ่งสามารถรับน้ำได้จากทุกทิศทาง แต่คุณมีแหล่งน้ำ S เดียวและถัง E หนึ่งแหล่ง

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

ดังนั้นคุณต้องเลือกอย่างชาญฉลาดว่าจะวางที่ใด นั่นคือสิ่งที่คุณดึงทักษะการของคุณออก

งาน

คุณได้รับการป้อนข้อมูลประกอบด้วยสตริงที่แสดงถึงห้องที่มีแหล่งที่มาและถัง:

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

คุณต้องตรวจสอบว่าในที่สุดน้ำถึงถัง หากเป็นไปได้น้ำจะไหลไปทางซ้ายและขวาหากเป็นไปได้ น้ำไม่สะสมเพราะไม่ขึ้น

ดังนั้นสำหรับอินพุตข้างต้นผลลัพธ์คือ:

#######
#  *  #
#  *  #
#*****#
#*###*#
#**O**#
#######

น้ำถึงถังอย่างมีความสุขดังนั้นคุณต้องเอาท์พุทค่าความจริง

แต่ถ้าน้ำไม่ถึงถัง:

#######
#S    #
#     #
#  E  #
# ### #
#     #
#######

#######
#*    #
#*    #
#* X  #
#*### #
#*****#
#######

จากนั้นคุณจะต้องส่งออกค่าเท็จ

เขียนโปรแกรมเพื่อตัดสินใจว่าในที่สุดน้ำจะมาถึงถังหรือไม่ รหัสของคุณควรสั้นที่สุด

สมมติฐาน

  • สมมติว่าอินพุตถูกต้องเสมอ (ทั้งห้องเป็นพื้นที่สี่เหลี่ยมผืนผ้าล้อมรอบด้วย S และ E)

  • สมมติว่ามีเพียงหนึ่งห้องที่ให้ไว้เป็นอินพุต

กรณีทดสอบ

โปรแกรมของคุณควรคืนค่าความจริงสำหรับกรณีทดสอบต่อไปนี้:

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

#######
#  S  #
#     #
#  E  #
#     #
#     #
#######

#######
#     #
#     #
# SE  #
# ### #
#     #
#######

###############################################
#                      S                      #
#                                             #
#                                             #
#                                             #
#               ###############               #
#                                             #
#  ##################     ##################  #
#                                             #
#                                             #
#                    #####                    #
#                      E                      #
###############################################

#######
#  S  #
#     #
#     #
# ### #
#   # #
### ###
## E ##
#     #
#######

แต่ค่าเท็จสำหรับกรณีทดสอบต่อไปนี้:

#######
#S    #
#     #
#  E  #
# ### #
#     #
#######

#######
#     #
# SE  #
#     #
#     #
#     #
#######

#######
#     #
#  E  #
#     #
#  S  #
#     #
#######

####################################
#                                  #
#                                  #
#                                  #
#S             #                  E#
####################################

ห้องที่สองถึงห้องสุดท้ายในหมวด True และห้องสุดท้ายในหมวด False ถูกขโมยอย่างไร้ยางอายยืมมาจากKoth: Jump and Run by Manu (ที่ลบโพสต์แซนด์บ็อกซ์)

ห้องสุดท้ายในหมวดหมู่ที่แท้จริงคือจากคำตอบที่มาร์ติน Buttner ในจอประสาทตา


หมายเหตุ: ฉันได้ลบโพสต์แซนด์บ็อกซ์ของ KOTH ความท้าทายของคุณดูดีขึ้นมาก :)
GeneralGuy

น้ำไม่สะสมจนกว่าจะเติมเต็มห้องใด ๆ ดังนั้นน้ำจะไปถึงถังเสมอถ้าอยู่ในห้องเดียวกัน
บ๊อบ

1
เคล็ดลับสำหรับการจัดรูปแบบกรณีทดสอบในความท้าทายที่เป็นจริง / เท็จ (หรือความท้าทายด้านการจำแนกประเภทที่มีคลาสไม่กี่คลาส): จัดกลุ่มกรณีทดสอบตามผลลัพธ์และแยกกลุ่มเพื่อให้คุณสามารถหลีกเลี่ยงบิตfrom / to/ จริง ๆ กรณีในครั้งเดียว)
Martin Ender

1
ดังนั้นโดยพื้นฐานแล้วตรรกะการไหลของของเหลว Minecraft แม้ว่าใน Minecraft ฉันคิดว่าข้อที่ 3 ในกรณีทดสอบจริงของคุณจะกลับมาผิดพลาดเพราะน้ำจะไปทางซ้ายเท่านั้น
Patrick Roberts

1
ทำให้ฉันนึกถึงฟิสิกส์ของน้ำที่ตกลงสู่พื้นทราย
user253751

คำตอบ:


15

หอยทาก 20 ไบต์

\S{d(=\#n)?^#},!(t\E

พิมพ์0สำหรับค่าความผิดพลาดและ1ค่าความจริง

ลองออนไลน์!

  • \Sการแข่งขันSในช่วงเริ่มต้น
  • d กำหนดทิศทางลง
  • {...}, ตรงกับสิ่งที่อยู่ในวงเล็บ 0 หรือมากกว่าครั้ง
  • =\#เป็นการยืนยันที่ประสบความสำเร็จหากมี#ถ่านอยู่ด้านหน้าของหอยทาก แต่ไม่ย้ายมัน
  • n เปลี่ยน 90 องศาในทิศทางใดทิศทางหนึ่ง
  • (...)? ตรงกับรูปแบบในวงเล็บ 0 หรือ 1 ครั้ง
  • \ ​ ตรงกับช่องว่างและย้ายหอยทากลง
  • !(... เป็นการยืนยันเชิงลบ
  • t เทเลพอร์ตไปยังสแควร์ที่ไม่มีใครเทียบในกริด
  • \E ไม้ขีด E

ฉันไม่ต้องการรวบรวมภาษานี้ด้วยตัวเอง มีล่ามออนไลน์สำหรับสิ่งนี้หรือไม่
user48538

@ zyabin101 ไม่ไม่มีล่ามออนไลน์
feersum

ตกลงเวลาที่จะโทรหาเดนนิส : P เครื่องฉายอยู่ที่ไหน?
user48538

5
i.imgur.com/dvWrAwP.pngฉันทำมันเอง
user48538

ดีฉันได้พยายามแต่มันพิมพ์ 0 สำหรับกรณีการทดสอบทั้งหมด แต่หนึ่งสำหรับฉัน ผมทำอะไรผิดหรือเปล่า?
เดนนิส

11

สลิป 20 + 2 = 22 ไบต์

S>( ^4|^4(?|`#)^T)*E

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

ต้องการrแฟล็ก (ไม่มีเซลล์ที่ซ้ำกัน) เพื่อยกเลิก

ลองมันออนไลน์ เอาท์พุทเป็นเส้นทางที่นำไปสู่ความจริงที่ว่างเปล่าสำหรับความเท็จ

S                 Match S
>                 Rotate pointer downward
(                 Either...
 <space>^4          Match a space and point downwards
 |                  or
 ^4                 Point downwards
 (?|`#)             Match # below then reset pointer
 ^T                 Either turn left or right
)*                ... 0+ times
E                 Match E

6

เรติน่า , 87 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

+mT`E `S`(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]|.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?
M`E
0

ลองออนไลน์!

เท่าที่การประมวลผลสตริง 2 มิติเป็นไปได้ใน Retina (หรือ. NET regex โดยทั่วไป) มันไม่รัดกุม ...

คำอธิบาย

+mT`E `S`(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]|.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?

Sนี่คือน้ำท่วมเติมซึ่งเครื่องหมายเซลล์ทั้งหมดที่มีการเข้าถึงได้โดยน้ำที่มี มันทำได้โดยการจับคู่ตัวละครที่สามารถเข้าถึงได้และจากนั้นถอดเสียงพวกเขาSด้วยT-mode Eนี้น้ำท่วมผ่านไปเติมช่องว่างทั้งในและ +ที่จุดเริ่มต้นซ้ำนี้จนกว่าการส่งออกหยุดการเปลี่ยนแปลง

สำหรับ regex ที่แท้จริงนั้นมีสองกรณีแยกกัน:

(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]

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

.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?

นี้จะคล้ายกันมากมันตรงกับSและถ้ามีตัวละครก่อนและหลังจากที่มันมีเงื่อนไขว่าตัวละครโดยตรงใต้เป็นS #นี้จะดูแลการแพร่กระจายของน้ำตามพื้นดิน

Eเมื่อเราทำมันง่ายมากที่จะตรวจสอบว่าน้ำมาถึง หากเป็นเช่นนั้นEจะถูกลบออกจากสตริงในการเติมน้ำท่วมและหากไม่ใช่Eจะยังคงอยู่ ลองนับจำนวนEs:

M`E

แต่ตอนนี้นั่นคือ0(ซึ่งฉันจะพิจารณาเป็นเท็จ) สำหรับกรณีทดสอบความจริงและ1(ซึ่งฉันจะพิจารณาความจริง) สำหรับกรณีทดสอบเท็จ เราสามารถย้อนกลับได้อย่างง่ายดายโดยการนับจำนวน0s ในผลลัพธ์นี้:

0

เสร็จสิ้น


การเพิ่มอินพุตของคุณเป็นกรณีทดสอบ
user48538
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.