แก้อัลคาซ่าร์นี้ให้ฉัน


39

เมื่อเร็ว ๆ นี้ฉันได้เล่นเกมที่เรียกว่าอัลคาซ่า มันเป็นเกมกระดานปริศนาที่เป้าหมายของคุณคือเข้าจากประตูหนึ่งผ่านผ่านช่องสี่เหลี่ยมทั้งหมดและออกจากประตูอีกบานหนึ่ง กฎเท่านั้นคือ:

  • ป้อนหนึ่งครั้งออกครั้งเดียว;
  • ผ่านช่องสี่เหลี่ยมทั้งหมด
  • อย่าผ่านช่องสี่เหลี่ยมมากกว่าหนึ่งครั้ง

ภาพด้านล่างแสดงตัวอย่างของอัลคาซ่าร์บอร์ดและทางด้านขวาของปริศนาที่แก้แล้ว (แน่นอนว่านี่เป็นภาพที่ง่าย):

ตัวอย่างปริศนาอัลคาซ่าร์

คุณสามารถค้นหาปริศนาเพิ่มเติมได้ที่http://www.theincrediblecompany.com/try-alcazarและดาวน์โหลดเกมที่ PlayStore (PS: ไม่ใช่โฆษณา)

ปัญหาของฉันคือฉันเกือบจะจบเกมยกเว้นระดับหนึ่ง ฉันไม่สามารถหาวิธีแก้ไขได้ ดังนั้นความท้าทายที่ฉันเสนอคือสร้างอัลกอริธึมที่แก้ระดับ1ปกติ2ระดับอัลคาซาร์ที่แก้ไขได้

แน่นอนฉันไม่ได้ขอให้ทุกคนสร้างล่ามภาพเพื่ออ่านภาพและไขปริศนา (หรือฉัน) ดังนั้นฉันจึงไขปริศนาด้านบนโดยใช้อักขระวาดกล่อง ตัวต่อและวิธีแก้ปัญหาจะเป็นดังนี้:

╔═══════╗         ╔═══════╗
║▒ ▒ ▒ ▒║         ║┌─┐ ┌─┐║
║     ║ ║         ║│ │ │║│║
╣▒ ▒ ▒║▒╠         ╣│ └─┘║└╠
║ ══╦═╩═╣         ║│══╦═╩═╣
║▒ ▒║▒ ▒║         ║└─┐║┌─┐║
║   ║   ║   ==>   ║  │║│ │║
╣▒ ▒║▒ ▒║         ╣┐ │║│ │║
║ ║ ║   ║         ║│║│║│ │║
╣▒║▒ ▒ ▒║         ╣│║└─┘ │║
║ ║     ║         ║│║    │║
║▒ ▒ ▒ ▒║         ║└─────┘║
╚═══════╝         ╚═══════╝

ในกระดานด้านบนเป็นเซลล์ที่จะเติมเต็ม

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

╔════╩╗         ═ ═ ╩ 
║▒ ▒ ▒║        ║▒ ▒ ▒║
║ ═══ ║           ═   
║▒ ▒ ▒║   ==   ║▒ ▒ ▒║
║     ║               
║▒ ▒ ▒║        ║▒ ▒ ▒║
╚╦════╝         ╦═ ══ 

สิ่งนี้ใช้ได้สำหรับการแก้ปัญหาด้วยเช่นกัน นั่นคือมันไม่จำเป็นต้องเชื่อมต่อเซลล์:

╔════╩╗        ╔════╩╗        ╔════╩╗
║▒ ▒ ▒║        ║┌───┘║        ║┌ ─ ┘║
║ ═══ ║        ║│═══ ║        ║ ═══ ║
║▒ ▒ ▒║   ==   ║└───┐║   =>   ║└ ─ ┐║
║     ║        ║    │║        ║     ║
║▒ ▒ ▒║        ║┌───┘║        ║┌ ─ ┘║
╚╦════╝        ╚╦════╝        ╚╦════╝

ในตัวอย่างด้านบนโซลูชันทั้งสองมีความหมายเหมือนกัน

ใช่กรณีทดสอบ ที่นี่พวกเขาคือ:

ปริศนา 1

╔════╩╗        ╔════╩╗
║▒ ▒ ▒║        ║┌ ─ ┘║
║ ═══ ║        ║ ═══ ║
║▒ ▒ ▒║   =>   ║└ ─ ┐║
║     ║        ║     ║
║▒ ▒ ▒║        ║┌ ─ ┘║
╚╦════╝        ╚╦════╝

ปริศนา 2

╔═════╗        ╔═════╗
║▒ ▒ ▒║        ║┌ ─ ┐║
║   ║ ║        ║   ║ ║
╣▒ ▒║▒║        ╣└ ┐║│║
║ ║ ║ ║   =>   ║ ║ ║ ║
╣▒║▒ ▒╠        ╣┐║│ │╠
║ ║   ║        ║ ║   ║
║▒ ▒ ▒║        ║└ ┘ │║
╚════╦╝        ╚════╦╝

ปริศนา 3

╔════╩══╗        ╔════╩══╗
║▒ ▒ ▒ ▒║        ║┌ ┐ └ ┐║
║ ║   ║ ║        ║ ║   ║ ║
╣▒║▒ ▒║▒╠        ╣┘║└ ┐║│╠
║ ╚══ ║ ║        ║ ╚══ ║ ║
║▒ ▒ ▒ ▒╠   =>   ║┌ ─ ┘ │╠
║   ═══ ║        ║   ═══ ║
║▒ ▒ ▒ ▒║        ║│ ┌ ┐ │║
║   ║   ║        ║   ║   ║
║▒ ▒║▒ ▒║        ║└ ┘║└ ┘║
╚═══╩═══╝        ╚═══╩═══╝

ปริศนา 4

╔═══════╗        ╔═══════╗
║▒ ▒ ▒ ▒║        ║┌ ┐ ┌ ┐║
║     ║ ║        ║     ║ ║
╣▒ ▒ ▒║▒╠        ╣│ └ ┘║└╠
║ ══╦═╩═╣        ║ ══╦═╩═╣
║▒ ▒║▒ ▒║        ║└ ┐║┌ ┐║
║   ║   ║   =>   ║   ║   ║
╣▒ ▒║▒ ▒║        ╣┐ │║│ │║
║ ║ ║   ║        ║ ║ ║   ║
╣▒║▒ ▒ ▒║        ╣│║└ ┘ │║
║ ║     ║        ║ ║     ║
║▒ ▒ ▒ ▒║        ║└ ─ ─ ┘║
╚═══════╝        ╚═══════╝

ปริศนา 5

╔══╩══════╗        ╔══╩══════╗
║▒ ▒ ▒ ▒ ▒║        ║┌ ─ ┐ ┌ ┐║
║   ║     ║        ║   ║     ║
║▒ ▒║▒ ▒ ▒╠        ║└ ┐║└ ┘ │╠
║   ╠════ ║        ║   ╠════ ║
║▒ ▒║▒ ▒ ▒║   =>   ║┌ ┘║┌ ─ ┘║
║   ║     ║        ║   ║     ║
║▒ ▒║▒ ▒ ▒╠        ║└ ┐║└ ─ ─╠
║   ╠═════╣        ║   ╠═════╣
║▒ ▒║▒ ▒ ▒║        ║┌ ┘║┌ ─ ┐║
║   ║     ║        ║   ║     ║
║▒ ▒ ▒ ▒ ▒║        ║└ ─ ┘ ┌ ┘║
╚══╦═══╦══╝        ╚══╦═══╦══╝

ปริศนา 6

╔═══════════╗        ╔═══════════╗
║▒ ▒ ▒ ▒ ▒ ▒║        ║┌ ┐ ┌ ┐ ┌ ┐║
║           ║        ║           ║
║▒ ▒ ▒ ▒ ▒ ▒║        ║│ └ ┘ └ ┘ │║
║       ═══ ║        ║       ═══ ║
║▒ ▒ ▒ ▒ ▒ ▒║        ║└ ┐ ┌ ─ ─ ┘║
║     ═══   ║        ║     ═══   ║
╣▒ ▒ ▒ ▒ ▒ ▒╠   =>   ╣┐ │ │ ┌ ┐ ┌╠
║           ║        ║           ║
║▒ ▒ ▒ ▒ ▒ ▒║        ║│ │ │ │ │ │║
║   ║   ║   ║        ║   ║   ║   ║
║▒ ▒║▒ ▒║▒ ▒║        ║│ │║│ │║│ │║
║   ║   ║   ║        ║   ║   ║   ║
║▒ ▒ ▒ ▒ ▒ ▒║        ║└ ┘ └ ┘ └ ┘║
╚═══════════╝        ╚═══════════╝

ปริศนา 7

╔════╩════════╦╩╗        ╔════╩════════╦╩╗
║▒ ▒ ▒ ▒ ▒ ▒ ▒║▒║        ║┌ ─ ─ ─ ─ ─ ┐║│║
║ ║       ║   ║ ║        ║ ║       ║   ║ ║
║▒║▒ ▒ ▒ ▒║▒ ▒ ▒║        ║│║┌ ─ ─ ┐║┌ ┘ │║
║ ║ ║ ═══ ║     ║        ║ ║ ║ ═══ ║     ║
║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒╠        ║│ │║┌ ─ ┘ └ ┐ │╠
║   ║           ║        ║   ║           ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║        ║│ │ └ ┐ ┌ ┐ └ ┘║
║     ║ ║     ══╣        ║     ║ ║     ══╣
║▒ ▒ ▒║▒║▒ ▒ ▒ ▒║        ║│ └ ┐║│║│ └ ─ ┐║
║     ║ ║       ║        ║     ║ ║       ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║        ║│ ┌ ┘ │ └ ┐ ┌ ┘║
║           ║ ══╣   =>   ║           ║ ══╣
║▒ ▒ ▒ ▒ ▒ ▒║▒ ▒║        ║└ ┘ ┌ ┘ ┌ ┘║└ ┐║
╠══       ║ ╚══ ║        ╠══       ║ ╚══ ║
║▒ ▒ ▒ ▒ ▒║▒ ▒ ▒║        ║┌ ┐ └ ┐ │║┌ ─ ┘║
║     ║ ║ ║     ║        ║     ║ ║ ║     ║
║▒ ▒ ▒║▒║▒ ▒ ▒ ▒║        ║│ └ ┐║│║│ └ ─ ┐║
║ ║   ║ ║ ╔══   ║        ║ ║   ║ ║ ╔══   ║
║▒║▒ ▒ ▒ ▒║▒ ▒ ▒║        ║│║┌ ┘ │ │║┌ ┐ │║
║ ║     ║ ║     ║        ║ ║     ║ ║     ║
║▒ ▒ ▒ ▒║▒ ▒ ▒ ▒║        ║│ └ ─ ┘║└ ┘ │ │║
║       ╚══     ║        ║       ╚══     ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║        ║└ ─ ─ ─ ─ ─ ┘ │║
╚════╦═╦═╦═════╦╝        ╚════╦═╦═╦═════╦╝

ปริศนา 8 (ขออภัยฉันไม่มีวิธีแก้ปัญหานี้)

╔══╩╦══╩═══╩═╩═╩═══╩╗
║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║
║   ║               ║
╣▒ ▒║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║
║   ╚══ ╔══     ╔═══╣
╣▒ ▒ ▒ ▒║▒ ▒ ▒ ▒║▒ ▒╠
║       ║   ╔══ ║   ║
╣▒ ▒ ▒ ▒ ▒ ▒║▒ ▒ ▒ ▒╠
║           ║       ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒╠
║           ║       ║
╣▒ ▒ ▒ ▒ ▒ ▒║▒ ▒ ▒ ▒╠
║   ╔═══╗   ╚══     ║
╣▒ ▒║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒║
║   ║   ║           ║
╣▒ ▒║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒╠
║ ══╝   ║       ╔══ ║
║▒ ▒ ▒ ▒║▒ ▒ ▒ ▒║▒ ▒║
║   ══╗ ╚══ ╔══ ║   ║
╣▒ ▒ ▒║▒ ▒ ▒║▒ ▒ ▒ ▒╠
║     ║     ║   ║   ║
╣▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║▒ ▒║
║   ═══   ══╗   ║   ║
╣▒ ▒ ▒ ▒ ▒ ▒║▒ ▒ ▒ ▒╠
╠══ ║       ║   ╔══ ║
║▒ ▒║▒ ▒ ▒ ▒ ▒ ▒║▒ ▒╠
║   ╚══ ║   ║   ║   ║
╣▒ ▒ ▒ ▒║▒ ▒║▒ ▒ ▒ ▒╠
║       ║   ║       ║
║▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒║
╚══╦═══╦═══╦═╦═╦═╦═╦╝

อินพุต

การป้อนรหัสของคุณสามารถเป็นตัวแทนได้ตราบใดที่มันปฏิบัติตามกฎเหล่านี้:

  1. ต้องเป็นอินพุตกราฟิก ดังนั้นจึงเป็นไปไม่ได้ที่จะอ่านรายการพิกัดตัวอย่างเช่น

  2. ผนังแนวนอนผนังแนวตั้งและประตูจะต้องแตกต่างกันและต้องทำจากอักขระที่มองเห็นได้ (ไม่มีอักขระว่าง)

  3. จะถูกแทนที่ด้วยช่องว่าง ฉันใช้ตัวละครอื่นเพื่อไฮไลต์พวกเขา

เอาท์พุต

เอาท์พุทยังสามารถมีการแสดงใด ๆ ตราบเท่าที่มันเป็นไปตามกฎเหล่านี้:

  1. ต้องเป็นเอาต์พุตกราฟิก นั่นคือเราสามารถมองเห็นเส้นทางได้โดยดูจากมัน

  2. กฎข้อที่หนึ่งบ่งบอกว่าตัวอักษรเส้นทางจะแตกต่างกัน นั่นคือจะต้องมีอย่างน้อย 6 ตัวอักษรเส้นทาง แนวนอนแนวตั้งและมุม

  3. สำหรับคำตอบที่ถูกต้องผลลัพธ์จะต้องเป็นบอร์ดเดียวกับอินพุต (ชัด) กับเซลล์ทั้งหมด (ในการเป็นตัวแทนของฉัน) เต็มไป เติมช่องว่างระหว่างเซลล์เป็นตัวเลือก

เกณฑ์การให้คะแนน

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ

1มีระดับ Alcazar บางระดับที่มีเซลล์และอุโมงค์เสริม สิ่งเหล่านี้จะไม่ได้รับการพิจารณา

2มีกระดาน Alcazar บางกระดานที่เป็นไปไม่ได้


2
โปรแกรมของฉันไม่พบวิธีแก้ปัญหาสำหรับตัวต่อ 8 คุณแน่ใจหรือว่ามันสามารถแก้ไขได้ อาจพิมพ์ผิดบางอย่าง?
edc65

1
@ edc65 เหมือนกันที่นี่ - ไม่มีวิธีแก้ปัญหาสำหรับ # 8
ngn

คำตอบ:


5

Python 3 , 809 728 723 714 693 688 684 663 657 641 639 627 660 610 571 569 ไบต์

แก้ไข:บันทึกแล้ว 55 ไบต์ขอบคุณ@Felipe Nardi Batista

ห้ามรันเคสทดสอบสุดท้ายใน 60 วินาทีบน TIO แต่ควรทำงานได้อย่างถูกต้องอย่างไรก็ตาม ส่งคืนรายการพิกัดสำหรับเส้นทาง ไบต์ 400 บางส่วนถูกใช้เพื่อรับรายการข้อมูลจาก I / O

A=enumerate
I,J="═║"
B=range
L=len
K=-1
Z=1,0
X=0,1
C=K,0
V=0,K
E=lambda a,b,p:(((a,b)in d)*L(p)==H*h)*p or max([E(q+a,w+b,p+[(q+a,w+b)])for q,w in y[a][b]if~-((q+a,w+b)in p)*-h>w+b>K<q+a<H]+[[]])
x=input().split("\n")
h=L(x[0])//2
H=L(x)//2
y=[[{C,Z,V,X}for i in B(h)]for j in B(H)]
d=[]
exec('d+=[(%s,i)for i,a in A(x[%s][1::2])if I<a]\nfor i,u in A(x[%s:%s:2]):\n d+=[(i,0)]*(J<u[0])+[(i,h-1)]*(J<u[K])\n for j,w in A(u[%s:%s:2]):\n  if"%s"==w:y[i][j]-={%s};y[i+%s][j+%s]-={%s}\n'*2%(0,*X,"",2,K,J,X,*X,V,H-1,K,2,K,1,"",I,Z,*Z,C))
print(max(E(*D,[D])for D in d))

ลองออนไลน์!


@ HalvardHummel เอาล่ะขออภัยสำหรับสูตรที่ไม่ดีของความท้าทาย ดังนั้นฉันเสนอต่อไปนี้ คะแนนจะถูกคำนวณโดยการคูณจำนวนไบต์ด้วยเวลารันดังนั้นทั้งเวลารันและการนับไบต์จะได้รับรางวัล คุณคิดอย่างไร?
Phelype Oleinik

1
@PhelypeOleinik ฉันไม่คิดว่ามันเป็นระบบการให้คะแนนที่ดีมาก การทำให้มันเป็นกอล์ฟ Coed เป็นทางออกที่ดีกว่า แต่ถ้าคุณกำลังมองหาวิธีแก้ปัญหาฉันมั่นใจว่าสิ่งนี้สามารถปรับเปลี่ยนให้มีประสิทธิภาพมากขึ้น
caird coinheringaahing

@cairdcoinheringaahing ฉันเข้าใจว่าทางออกที่ดีที่สุดคือการรักษาอย่างที่มันเป็น แต่อัลกอริทึมที่ใช้เวลา "หลายวันหรือหลายเดือน" ในการแก้ปริศนากระดาน 8x12 นั้นไม่ได้ผลคุณไม่คิดอย่างนั้นหรือ วิธีที่ฉันเห็นมันเป็นอัลกอริทึมที่แก้ปัญหาได้ในเวลาที่น้อยลงควรได้รับรางวัลแม้ว่ามันจะนานขึ้นก็ตาม
Phelype Oleinik

3
@PhelypeOleinik "ประสิทธิภาพ" ของรหัสไม่เกี่ยวข้อง คุณได้ท้าทายให้เราเขียนโค้ดย่อและนั่นคือพื้นฐานของความท้าทายของคุณ การเพิ่มความเร็วที่โปรแกรมรันไปยังการผสมจะทำให้สิ่งต่าง ๆ มีความซับซ้อนเกินความจำเป็นและยังสามารถนำไปใช้ในการทำคะแนนไร้สาระได้อีกด้วย ระบบการให้คะแนนแบบกำหนดเองนั้นมักจะไม่ได้ผล หากคุณต้องการรหัสย่อให้ตั้งคำถามเกี่ยวกับกอล์ฟ หากคุณต้องการรหัสที่รวดเร็วให้สร้างคำถามที่เร็วที่สุด การพยายามผสมมันเข้าด้วยกันไม่ใช่ความคิดที่ดี
LyricLy

ในexec(...)สตริงของคุณมีห้าบรรทัดใหม่แสดงเป็น\n, 5 * 2 = 10 ไบต์ การใช้สตริงที่มีการเสนอราคาสามเท่าจะเพิ่ม 4 ไบต์ ( ...''...''...) แต่จากนั้นลบ 5 ไบต์เนื่องจากสามารถใช้อักขระบรรทัดใหม่จริงได้ โดยรวมแล้วสามารถบันทึกได้หนึ่งไบต์
Jonathan Frech

5

APL (Dyalog Classic) , 319 ไบต์

iNj←⍳1+n←×/N←⌊2÷⍨⍴a←⎕⋄e←↑⊃,/{(,~'#='∊⍨a[(⍵⌽⍳2)∘+¨2×⍳N+⍵=⍳2])/,2,/[⍵]⊃,[⍵]/n i n}¨⍳2
r←{e g c←⍵⋄d←+/j∘.=∊g⋄e⌿⍨←(≠/c[e])∧2>⌈/d[e]⋄n≡≢g:gj/⍨d=10≡≢e:02>⌊/d+D←+/j∘.=,e:0⋄u←,¯1↑e←e[⍒⌊/D[e];]⋄e↓⍨←¯1⋄0≢r←∇e(g⍪u)(c-(-/c[u])×c=c[⊃u]):r⋄∇e g c}e(0e)j
a[1+2×⍳N]←' ??┌?─┐┬?└│├┘┴┤┼'[2⊥(↑(⊂i),¨¨{⊖∘⍉⍣⍵⊢n⍪¯1↓⌽∘⍉⍣⍵⊢i}¨⍳4)∊↓r⍪⌽r]
a

ลองออนไลน์!

ใช้การป้อนข้อมูล=#F7LJ<>^v.แทน═║╔╗╚╝╣╠╩╦▒เพื่อให้พอดีกับในcharset คลาสสิก

กรณีทดสอบทั้งหมดยกเว้นการผ่านครั้งสุดท้ายในไม่กี่วินาที

การทดสอบครั้งสุดท้ายใช้เวลา 47 นาทีในคอมพิวเตอร์ของฉันและไม่ได้ผลเลย

เมื่อเส้นทางที่เกิดขึ้นใช้ประตูใกล้กับมุมถนนมันอาจจะแสดงผลอย่างไม่ถูกต้อง (ราวกับว่าเส้นทางนั้นผ่านไปและผ่านประตูจินตนาการพิเศษ) แต่ก็ยังสามารถมองเห็นได้และไม่คลุมเครือ


ดีมาก! ถ้าฉันอาจถามรหัสของคุณใช้ในการแก้ไขอย่างไร ค้นหาหมดจดหรือบางสิ่งบางอย่างที่สง่างามมากขึ้น? อย่างที่ฉันพูดฉันไม่ได้ไขปริศนาตัวสุดท้ายด้วยมือ มันไม่มีวิธีแก้ปัญหาทีละขั้นตอนที่ชัดเจนและต้องการแม้กระทั่งเมื่อแก้ด้วยมือการคาดเดาเพื่อค้นหาคำตอบบางอย่าง จิ๊กซอว์นี้รวมอยู่ในเกมดั้งเดิม แต่อาจไม่มีวิธีแก้ปัญหาดังนั้นจึงไม่ควรนำมาพิจารณา
Phelype Oleinik

1
@PhelypeOleinik ใช่มันเป็นการค้นหาที่ไม่น่าสนใจเลยทีเดียว เหตุผลที่พบวิธีแก้ปัญหาที่มีอยู่อย่างรวดเร็วก็คือพยายามหากรณีที่น่าจะเป็นไปได้ก่อน เหตุผลที่มันทำงานได้อย่างน่ากลัวในกรณีสุดท้ายคือมันทดสอบความเป็นไปได้ทั้งหมดและตัดทอนซ้ำเฉพาะความขัดแย้งที่เห็นได้ชัดเท่านั้น ดูเหมือนจะไม่มีใครรู้อัลกอริธึม Hamiltonian-path ที่ดีแม้แต่ในกรณีพิเศษของกราฟขอบเขต - ระดับ (neighbors4 เพื่อนบ้าน)
NGN

3

JavaScript (ES6), 274 ไบต์

อินพุตเป็นสตริงหลายบรรทัดแต่ละบรรทัดสิ้นสุดด้วยอักขระขึ้นบรรทัดใหม่ ประตูถูกทำเครื่องหมายด้วยอักขระ '2'

เอาต์พุตเป็นสตริงหลายบรรทัดพร้อมกับพา ธ ที่ทำเครื่องหมายด้วยอักขระ '1' ซึ่งมองเห็นได้ง่ายมาก

นี่คือการค้นหาความลึกครั้งแรกลองเส้นทางทั้งหมดและ backtraking เมื่อติดอยู่ มันไม่มีประสิทธิภาพเลย แต่สามารถไขปริศนาได้ 1 .. 6 ในเวลาน้อยกว่า 1 นาที

z=>(w=z.search`
`+1,t=(w-2)*(z.length/w-1)/4,z=[...z],R=(p,l,q)=>[1,-1,w,-w].some(d=>l<t?z[q=p+d]<1&z[q+d]<1&&(R(q+d,++z[q]+l)||--z[q]):z[p+d]>1&&--z[p+d],++z[p])||--z[p],z.some((c,i)=>-c&&(x=i%w,R(i<w?i+w:x?x>w-3?i-1:i-w:i+1,--z[i])||++z[i]*0))&&z.join``.replace(/0/g,' '))

น้อย golfed

z => (
  w = z.search`\n`+1, // board width and offset to next row
  t = (w-2)*(z.length/w-1)/4, // total size of board, number of cells that must be filled
  z = [...z], // convert string to array
  d = [1, -1, w, -w], // delta to next position in all directions
  // recursive search
  // given a current position, try to move in all directions
  // if the board is not full, look for an emoty cell
  // if the board is full, look for a door
  R = (p, // current position
       l, // fill level
       q  // parameter used as a local variable
      ) => (
        ++z[p], // mark current position
        // .some will terminate early if the called function returns true
        // in case of return true the recursive function returns all way up leaving the path marked
        // in case of return false we need to unmark path and backtrack
        d.some( d => // for each direction, offset in d
          l < t // check if board is full
          ? z[q=p+d] < 1 & z[q+d] < 1 // not full, try to advance 
            && (++z[q], // mark intermediate cell
                R(q+d, 1+l) // recursive call incrementing fill level
                || --z[q] // if R return false, backtrack: unmark intermediate cell
               )
          : z[p+d] > 1 && --z[p+d]
        ) // full, ok only if I find a door nearby
        || --z[p], // if some returns false, unmark and backtrak
  // look for doors and for each door call R 
  // when R returns true, stop and return the marked board
  // if R returns false for each door, no solution, return false
  z.some((c,i) => 
   -c && // if numeric and != 0
    (x = i%w,
     z[i]=1, // marking starting position (door)
     R(i<w ? i+w : x ? x > w-3 ? i-1 : i-w : i+1, 1)
     || (z[i] = 2, false) // if R returned false, unmark a return false
    ) 
  ) && z.join``.replace(/0/g,' ') 
)

ในตัวอย่างการทดสอบมีวิธีการแก้ปัญหาโดยใช้ DFS ที่มีข้อ จำกัด บางอย่างที่แก้ปริศนา 7 ในเวลาน้อยกว่าหนึ่งนาที (บนพีซีของฉัน) Puzzle 8 ไม่มีวิธีแก้ปัญหา ข้อ จำกัด :

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

ทดสอบ

ระวังตัวต่อจิ๊กซอว์ 7 นั้นดีกว่าการหมดเวลาสำหรับการประมวลผลจาวาสคริปต์ในเบราว์เซอร์ใด ๆ (โดยใช้ตัวแก้ปัญหาแบบสั้นและช้า)

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