Maze Generation [ปิด]


41

ฉันรู้ว่ามีเธรด (เก่า) คล้ายกับที่นี่ ( ที่นี่ ) แต่ฉันต้องการรีบูตด้วยการแก้ไขบางอย่าง

เป้าหมาย: สร้างเขาวงกตที่ดูสุ่มโดยใช้อัลกอริทึมที่คุณเลือกจากนั้นแสดงผลเขาวงกตแบบกราฟิก (จำนวนการพิมพ์)

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

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


4
นอกจากนี้ "ยิ่งสวยยิ่งดี" ก็ดูเหมือนจะจับต้องได้ยาก (หรือไม่เกี่ยวข้องเลย) กับการแข่งขันกอล์ฟ บางทีการประกวดความนิยมอาจเป็นตัวเลือกที่ดีกว่าถ้าคุณสนใจผลลัพธ์ที่น่าสนใจ
Martin Ender

5
ดังนั้นมันจึงเป็นรหัสกอล์ฟหรือเป็นการแข่งขันที่ได้รับความนิยม?
l0b0

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

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

2
@Geobits ฉันจะไม่สนใจมากเกินไป แต่ด้วยเหตุนี้ข้อเสนอแนะของฉันที่จะทำให้มันเป็นรหัสที่ท้าทายด้วยการให้คะแนนรวมจากความยาวของรหัสและคะแนนโหวต นั่นจะกระตุ้นสิ่งที่ OP ต้องการ: รหัสย่อสำหรับเขาวงกตที่น่าสนใจ
Martin Ender

คำตอบ:


10

C: 265 253 ไบต์

#define f(v)for(v=0;v<k;++v)
#define d(q,n)case q:r(c+n,c+2*n);
z[4225],i,j,k=65;r(p,c){if(!z[c]){z[p]=z[c]=1;f(p)switch(rand()%4){d(0,-k)d(1,k)d(2,-1)d(3,1)}}}main(){f(i)z[i]=z[i+4160]=z[i*k]=z[i*k+64]=z[4157]=1;r(67,132);f(i)f(j)putchar(33-z[i*k+j]);}

(ต้องการเทอร์มินัล 65 ตัว) สร้างเขาวงกตแบบสุ่มขนาด 31x31 โดยมีเส้นทางที่รับประกันหนึ่งเส้นทางจากทางเข้าสู่ทางออก

ตัวอย่างเอาต์พุต (พร้อมเทอร์มินัล 65 อักขระ):

 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
 !     !       !   !       !     !           !             !   ! 
 !!!!! !!! !!! ! !!! ! !!! ! !!! !!!!!!! !!! !!!!!!!!! !!! ! ! ! 
 !   !   !   ! !     ! ! ! ! ! ! !       !   !         !   ! ! ! 
 ! !!!!! !!! ! !!!!!!! ! ! ! ! ! ! !!!!!!! !!! ! !!!!!!! !!! ! ! 
 !     !     !         ! !   !   !     !   !   ! !     !   ! ! ! 
 ! !!! !!!!!!!!!!!!!!!!! !!!!! !!! !!! !!! ! ! !!! !!! !!! !!! ! 
 !   !         !     !   !     !     !   ! ! ! !     !   !   ! ! 
 !!!!!!!!!!! ! ! !!! !!! ! !!!!!!!!!!!!! ! !!! ! !!!!!!! !!! ! ! 
 !           !   !       ! !             !   !     !     !     ! 
 ! !!!!!!! !!!!!!! !!!!!!! ! !!!!!!!!!!!!!!! !!!!!!! !!!!!!!!!!! 
 ! !     ! !   !     !   ! !           !   !       ! !         ! 
 ! !!! ! ! ! ! !!!!!!! ! ! ! !!!!!!!!! ! ! !!!!!!! ! ! !!!!!!! ! 
 !   ! !   ! !       ! !   ! !         ! !       ! ! !   !   ! ! 
 !!! ! !!!!! !!!!!!! ! !!!!!!! !!!!!!!!! !!! !!!!! ! !!! ! !!! ! 
 !   !   ! ! !       !   !     !   !     ! !           ! !   ! ! 
 ! !!!!! ! ! ! !!!!!!!!! ! !!!!! !!! !!!!! !!!!!!!!!!! ! ! ! ! ! 
 ! !       ! !   !   !   ! !       ! !       !   !     ! ! ! ! ! 
 ! !!!!!!!!! !!! ! ! ! !!! !!!!!!! ! !!!!!!! ! ! !!!!!!! !!! ! ! 
 !             !   ! !   !       ! !     !   ! !             ! ! 
 !!!!!!!!!!!!!!!!!!! !!! !!!!!!! ! !!!!! ! !!! !!!!!!!!!!!!!!! ! 
 !               !   !   !       !         !   !     !   !     ! 
 ! !!!!!!!!!!!!! ! ! ! !!! !!!!!!! !!!!!!!!! !!! !!! !!! ! !!! ! 
 ! !   !       !   ! ! ! !     ! ! ! !     !     !   !   !   ! ! 
 ! ! ! !!!!! !!!!!!! ! ! ! !!! ! ! ! ! !!! !!!!!!! !!! !!!!! !!! 
 !   ! !   !       ! ! !     ! !     ! ! !     !   !       !   ! 
 !!!!! ! ! !!! !!! ! ! !!!!!!! !!!!!!! ! ! !!! ! !!!!!!!!! !!! ! 
 !     ! !   !   !   !       !       ! ! ! !   !   !         ! ! 
 ! !!!!! !!! !!! !!!!!!!!!!! !!!!!!! ! ! ! !!!!!!! ! !!!!!!! ! ! 
 !         ! !           !   !       ! ! !     !   ! !       ! ! 
 !!!!!!!!!!! !!!!!!!!!!! ! !!! !!!!!!! ! !!!!! ! !!! !!!!!!!!! ! 
 !         !     !     ! ! !       !   !     ! !     !         ! 
 ! !!!!!!! !!!!! ! !!! !!! !!!!!!! ! !!!!! ! ! !!!!! ! !!!!!!!!! 
 ! !     !     !   ! !   !       ! !       ! !       !         ! 
 ! ! !!! !!!!! ! !!! !!! !!!!!!! ! !!!!!!!!! !!!!!!!!!!!!!!!!! ! 
 !     !     ! !   !   ! !     ! !       !   ! !     !         ! 
 !!!!!!!!!!! ! !!! !!! ! ! ! !!! ! ! !!!!! !!! ! !!! ! !!!!!!! ! 
 !           ! !       !   ! !   ! !       !   ! ! ! !     !   ! 
 ! !!!!!!!!!!! !!!!!!!!!!!!! ! !!! !!!!!!!!!!! ! ! ! ! !!! ! !!! 
 !       !   !             ! ! ! !   !         ! !   !   ! ! ! ! 
 !!!!!!! !!! !!!!!!!!!!!!! ! ! ! !!! ! !!!!!!! ! !!! !!!!! ! ! ! 
 !       !         !     ! ! ! !   !   !     ! !   !       !   ! 
 ! !!!!!!! !!!!!!! ! !!!!! ! ! !!! !!!!!!! ! ! !!! !!!!!!!!!!!!! 
 !   !         ! !   !       ! !           ! !   !             ! 
 ! ! ! !!!!!!! ! ! !!! !!!!!!! ! !!!!!!!!!!! ! !!!!!!!!!!!!!!! ! 
 ! ! ! !     ! !   !   ! !     !   !   !     ! !               ! 
 ! ! !!! !!! ! !!!!! !!! ! !!!!! ! ! ! !!!!!!! ! !!!!!!!!!!!!! ! 
 ! !   !   ! !   !       !   !   !   !         ! !         !   ! 
 !!!!! !!! ! !!! ! !!!!!!!!! !!!!!!! !!!!!!!!!!! !!!!! !!!!! !!! 
 !     !   !   !   !       !       !       !   !     !       ! ! 
 ! !!!!! !!!!! !!!!! !!!!! !!!!!!! !!!!!!!!! ! !!!!! !!!!!!! ! ! 
 !           !     ! !   !   !   !           !   !   !     !   ! 
 ! !!!!!!!!! !!!!! ! !!! ! !!! ! !!!!!!!!!!!!!!! ! !!! !!! !!! ! 
 ! !     !       ! !     !     !     !         ! !       !   ! ! 
 !!! !!! !!!!!!!!! !!!!! !!!!!!!!! ! !!!!!!! !!! ! !!!!!!!!! ! ! 
 !   !     !   !   !   ! !       ! !         !   ! !         ! ! 
 ! !!!!!!! ! ! ! ! !!! ! !!!!!!! ! !!!!!!!!! ! !!!!! !!!!!!!!! ! 
 !       !   !   ! !   !         !   ! !   ! ! !     !       ! ! 
 ! !!!!! !!!!!!!!! ! !!!!!!!!!!! !!! ! ! ! ! ! ! !!!!! !!!!! ! ! 
 ! !     !           !         ! ! ! !   !   ! !   !   !     ! ! 
 ! ! !!!!!!!!!!!!!!!!! !!! !!!!! ! ! !!!!!!!!! !!! ! !!!!!!!!! ! 
 ! !                     !         !               !           ! 
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! 

2
int p,int cคุณไม่จำเป็นต้องแม้กระทั่ง p,cก็พอ ...
chubakueno

อ่าขอบคุณที่ชี้ให้เห็น
Dendrobium

34

Mathematica, 144 132 ไบต์

ตั้งแต่จัดตั้งกองทุนเราทุกคนรู้วิธีที่มีประสิทธิภาพมากที่สุดในการวาดเขาวงกต

c=0;Graphics@Most[Join@@{Circle[{0,0},i,{a=c-(r=Random[](d=2Pi-1/i)&)[],a+d}],Line[{{i},{i+1}}.{{Cos[c=a+r[]],Sin@c}}]}~Table~{i,9}]

Ungolfed และเอาต์พุตตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่

แน่นอนว่าเส้นเป็นกำแพง คุณเป็นมิโนเทารัสที่เริ่มต้นในศูนย์และต้องการออกไปข้างนอก


4
นี่เป็นสิ่งที่ดีและรหัสนั้นสั้น แต่ฉันอยากจะบอกว่ามันเป็นไปยังจุดสิ้นสุดของ "เขาวงกตเล็ก ๆ น้อย ๆ "
LarsH

2
คุณพูดถูกที่ทำให้มันใหญ่ขึ้นจะไม่เปลี่ยนเรื่องไร้สาระ ประเด็นก็คือการแก้เขาวงกตนี้เป็นกระบวนการเชิงเส้นในทุกช่วงหัวเลี้ยวหัวต่อคุณสามารถค้นหาได้อย่างรวดเร็วว่าคุณเลี้ยวผิดโดยไม่ต้อง "หัก" เข้าไปในกิ่งที่ลึกกว่า ในทางกลับกันคำตอบของ Ian และ aleph คือ mazes "ของจริง" พวกเขาไม่สามารถแก้ไขได้ด้วยวิธีการเชิงเส้นนี้ เนื่องจากเขาวงกตเล็ก ๆ น้อย ๆ ไม่ท้อแท้ฉันจึงถูกล่อลวงให้ลงคะแนนคนนี้ แต่ฉันมีตัวแทนไม่เพียงพอ
LarsH

1
@ ลาร์สเอ๋ยเราเห็นด้วยกับเรื่องนั้น นั่นเป็นเหตุผลที่ฉันบอกว่ามันเป็นวิธีที่ "มีประสิทธิภาพ" มากที่สุดในการวาดเขาวงกตไม่ใช่วิธีที่มีประสิทธิภาพที่สุด ;) มันอาจจะง่าย แต่ฉันไม่คิดว่ามันจะอยู่ในหมวดหมู่ใด ๆ ที่มีการปกครองออกเช่น "blank" หรือ "1x1" แน่นอนว่ามันขึ้นอยู่กับดุลยพินิจของ OP ที่จะตัดสิทธิ์การส่งข้อมูลนี้เนื่องจากความเรียบง่าย แต่ตราบใดที่เขาไม่ทำเช่นนั้นหรือเปลี่ยนประเภทของความท้าทายฉันไม่เห็นสิ่งจูงใจที่ทำให้ซับซ้อน / น่าสนใจมากขึ้น
Martin Ender

1
@ LarsH ที่ถูกกล่าวว่าฉันไม่แน่ใจว่าเป็นเพราะอัลกอริทึมของพวกเขาหรือเป็นเพียงคุณสมบัติของตัวอย่างที่พวกเขาโพสต์ แต่ไม่มีคำตอบใด ๆ ที่พวกเขาต้องการ backtracking เกินความลึก "1" มากกว่าหนึ่งครั้ง ดังนั้นในขณะที่พวกเขามีความซับซ้อนมากมันอยู่ในเส้นทางที่ไม่เกี่ยวข้องเลย
Martin Ender

1
ในความคิดของฉันแม้ว่าเขาจะเป็นเรื่องง่าย (และเขาวงกตที่เป็นวงกลมด้านล่างของฉันเป็นเรื่องไม่สำคัญมาก) ฉันแค่อยากจะป้องกัน blank-canvas / size-1 / etc "เขาวงกต" s
imallett

33

C: 364 ไบต์

#define I int
m[1600],i=0,r;f(I x,I y,I l){m[80*y+x]|=l;I d[]={x-1,y,2,1,x+1,y,1,2,x,y-1,8,4,x,y+1,4,8},
s[]={5,5,5,5},j=0;for(;j<4;){L:r=rand()%4;for(I k=0;k<4;)if(s[k++]==r)goto L;s[j]=r;I*p=d+
4*s[j++],X=p[0],Y=p[1];if(!(X<0|X>79|Y<0|Y>19|m[80*Y+X])){f(X,Y,p[2]);m[80*y+x]|=p[3];}}}
main(){f(0,0,4);m[9]|=4;for(;i<1600;)putchar("#5FMP<HJR;IK:9LN"[m[i++]]+128);}

หมายเหตุ: ในข้างต้นฉันได้เพิ่มบรรทัดใหม่เพื่อให้พอดีกับหน้า เอาท์พุทที่คาดหวัง (บนเทอร์มินัล 80 อักขระ) (โน้ตเริ่มต้นและสิ้นสุดที่ด้านซ้ายบน): ป้อนคำอธิบายรูปภาพที่นี่


8
@bwoebi MSPaint เพื่อช่วยเหลือ! รูปภาพ
เพดานตุ๊กแก

6
โปรดทราบว่าความตั้งใจของผมคือการมีเส้นทางที่อยู่ภายในท่อ(เช่นเดียวกับที่นี่)
imallett

1
@IanMallett ฉันคิดว่าเพดานตุ๊กแกรู้ตัวดีอยู่แล้ว แต่การเติมน้ำท่วมผนังด้านซ้ายด้วยสีจะให้เส้นทาง (ไม่เหมาะ) ตามทางไปตามกำแพงด้านซ้ายจนกว่าคุณจะพบทางออก ;)
Martin Ender

1
ฉันสนใจที่จะดูรหัสนี้หากคุณมีเวลา
LarsH

4
ในขณะที่คุณเขียนสิ่งนี้คุณเป็น coder เขาวงกตไอเอ็นจี
totymedli

24

Mathematica, 134 130 ตัวอักษร

Graph[Range@273,Reap[Do[c@n/._c:>#0[Sow[#<->n];n],{n,RandomSample@AdjacencyList[g=GridGraph@{13,21},c@#=#]}]&@1][[2,1]],Options@g]

เขาวงกต


ในความเป็นจริงเราสามารถใช้อัลกอริธึมนี้เพื่อสร้างเขาวงกตจากกราฟใด ๆ

ตัวอย่างเช่นสร้างเขาวงกตจากกราฟทัวร์ของอัศวิน 8 * 8 ( KnightTourGraph[8,8]):

กราฟทัวร์ของอัศวิน

Graph[Range@64,Reap[Do[c@n/._c:>#0[Sow[#<->n];n],{n,RandomSample@AdjacencyList[g=KnightTourGraph[8,8],c@#=#]}]&@1][[2,1]],Options@g]

maze2


7
เขาวงกตที่ดี… แต่ฉันไม่เห็นทางเข้าใด ๆ ที่เชื่อมต่อกับทางออก…?
bwoebi

9
ฉันเชื่อว่าความคิดคือการเลือกโหนดสุ่ม (พูดซ้ายบน) เป็นทางเข้าและอีก (ขวาล่าง) เป็นทางออก Mathematica ทำให้แน่ใจว่าทุกโหนดเชื่อมต่อกับโหนดอื่นทั้งหมด แต่ - โดยเฉพาะในเขาวงกตที่สอง - การค้นหาว่าพวกเขาเชื่อมต่อกันได้อย่างไรส่วนที่ยากขึ้น
EagleV_Attnam

เส้น (ขอบกราฟ) ควรเป็นผนังเขาวงกตหรือทางเดินหรือไม่? ฉันคิดว่าฉันรู้ แต่ตอนนี้ฉันไม่แน่ใจ
LarsH

@ LarsH พวกเขาเป็นทางเดิน
alephalpha

1
@ LarsH กราฟเชื่อมต่อกันดังนั้นคุณสามารถใช้สองโหนดโดยพลการหนึ่งอันเป็นทางเข้าอีกอันหนึ่งเป็นการออก
alephalpha

13

Bash, 53 ไบต์

w=(╱ ╲);while true;do echo -n ${w[RANDOM%2]};done

แนวคิดคล้ายกับรหัส C64 ใช้อักขระ Unicode เป็นเครื่องหมายทับเพราะดูดีกว่ามากในเทอร์มินัลที่รองรับ Unicode ตัวอย่างเอาต์พุตบน OS X Terminal (แบบอักษร Menlo):

ตัวอย่างเอาท์พุทเขาวงกต


2
yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bashผมเคยคิดออกนี้: ดูโพสต์นี้
gniourf_gniourf

5
สิ่งนี้ขึ้นอยู่กับอัลกอริธึมที่ไม่สามารถรับรองได้ว่าจะสามารถแก้ไขได้ซึ่งเป็นวิธีที่มีอายุหลายปี
Isiah Meadows

9

JavaScript (ES6), 174

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

(r,c,o=2*c+2,i=2*r*o+o,z=[],F=(p,i=Math.random()*4)=>[o,1,-o,-1].map((s,j,d)=>z[s=p+2*d[j+i&3]]>0&&(z[s]=z[(p+s)/2]=' ',F(s))))=>{for(;i--;)z[i]=i%o?8:`\n`;F(o+2);return''+z}

ตัวอย่าง

f(7,10)

เอาท์พุต

,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
,8, , , ,8, , , , , ,8, , , , , , , , , ,8,
,8, ,8, ,8,8,8, ,8, ,8,8,8,8,8,8,8, ,8, ,8,
,8, , , ,8, , , ,8, , , ,8, , , , , ,8, ,8,
,8, ,8,8,8, ,8,8,8,8,8, ,8, ,8,8,8,8,8, ,8,
,8, ,8, , , , , ,8, ,8, ,8, ,8, , , , , ,8,
,8, ,8, ,8,8,8, ,8, ,8, ,8, ,8, ,8,8,8,8,8,
,8, ,8, ,8, , , ,8, , , , , ,8, ,8, , , ,8,
,8, ,8, ,8, ,8,8,8,8,8,8,8,8,8, ,8, ,8,8,8,
,8, ,8, ,8, , , , , , , ,8, , , ,8, , , ,8,
,8, ,8, ,8,8,8,8,8,8,8, ,8,8,8, ,8,8,8, ,8,
,8, ,8, , , , , , , ,8, , , ,8, , , , , ,8,
,8, ,8,8,8,8,8,8,8,8,8,8,8, ,8,8,8,8,8, ,8,
,8, , , , , , , , , , , , , ,8, , , , , ,8,
,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8

ทดสอบ

f=
(r,c,o=2*c+2,i=2*r*o+o,z=[],F=(p,i=Math.random()*4)=>[o,1,-o,-1].map((s,j,d)=>z[s=p+2*d[j+i&3]]>0&&(z[s]=z[(p+s)/2]=' ',F(s))))=>{for(;i--;)z[i]=i%o?8:`\n`;F(o+2);return''+z}
    
function update() {    
  O.textContent='';
  [r,c]=I.value.match(/\d+/g)
  O.textContent=f(r,c)
}  

update()
pre { line-height: 0.8em }
Rows,Columns <input id=I oninput='update()' value='8,12'>
<pre id=O></pre>


ฉันไม่แน่ใจว่า ... เขาวงกตหรือแสงในที่มืดหรือไม่? หากมืดก็มีวงขนาดใหญ่และหนึ่งสามารถอยู่ด้านนอกเมื่อเลือกจุดใด ๆ ที่เป็นจุดเข้า / ออก ถ้าไฟคุณควรเพิ่มทางออก / รายการ
Paŭlo Ebermann

1
@ PaŭloEbermannมันเป็นแสงสว่างแน่นอนส่วนที่มืดคือกำแพง ทำซ้ำตัวเอง: เขาวงกตเชื่อมต่อกันโดยไม่มีลูปดังนั้นตำแหน่งใด ๆ สามารถเป็นจุดเริ่มต้นหรือจุดสิ้นสุด
edc65

ว้าวนี่ช่างน่าทึ่งจริงๆ! โกนไบท์บางส่วนแล้วลดเหลือ 133 ไบต์: twitter.com/aemkei/status/889587308894326785 แต่เครดิตทั้งหมดควรไปหาคุณ!
aemkei

@ aemkei 8 แทน '#' ฉันไม่อยากเชื่อเลยว่าฉันจะพลาดมันในเวลานั้น
edc65

8

ZX Basic - 54 ตัวอักษร

a$="/\":for i=1 to 24*32:print a$(1+int(rnd*2));:next

เอาท์พุต

นี่คือเขาวงกตที่แสดงเส้นทางผ่านมัน (ช่องว่างระหว่างเส้น)

เส้นทาง

และตัวอย่างเล็ก ๆ จากตอนที่ฉันทำสิ่งนี้ครั้งแรก (เมื่อหลายปีก่อน) และใช้เวลาเล็กน้อยในการทำกราฟิกที่ดีกว่า

กราฟิกที่ดีกว่า


2
อืมหน้าด้าน ๆ ^^ จุดเริ่มต้นคืออะไรและจุดสิ้นสุดคืออะไร และมีการทับเส้นทางหรือกำแพง? และขนาดช่องว่างต่ำสุดที่ฉันสามารถผ่านคือเท่าไหร่
Martin Ender

2
"ควรมีอย่างน้อยหนึ่งเส้นทางจากทางเข้าอย่างน้อยหนึ่งทางไปยังทางออกอย่างน้อยหนึ่งแห่ง" ฉันไม่เห็นสิ่งบ่งชี้ว่าเป็นไปตามเกณฑ์นี้ กำแพงสุ่มไม่จำเป็นต้องสร้างเขาวงกต
LarsH

1
@ m.buettner: ฉันเดาว่าเครื่องหมายทับเป็นผนังและเราควรเห็นภาพราวกับว่าไม่มีช่องว่างระหว่างแถวและระหว่างคอลัมน์ ดังนั้นตัวอักษร 2x2 ซ้ายล่างที่อยู่ในรูปทรงเพชร (สี่เหลี่ยม) ปิดสนิท
LarsH

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

+1 สำหรับกราฟิกที่ปรับปรุงแล้วและแสดงเส้นทาง ฉันคิดว่ามีทางเข้าและออกที่มีศักยภาพมากมายโอกาสของการมี "เส้นทางอย่างน้อยหนึ่งเส้นทางจากทางเข้าอย่างน้อยหนึ่งทางไปยังทางออกอย่างน้อยหนึ่งครั้ง" นั้นค่อนข้างสูง!
LarsH

8

BBC BASIC, 18 ไบต์

การปรับปรุงความยาวของวงวนอนันต์ C64 แบบ 23 ไบต์โดย @nneonneo VDU ส่งอักขระเดียวไปยังตัวควบคุม VDU: 2 + 1 * 45 = ASCII 47 /หรือ 2 + 2 * 45 = ASCII 92\

  VDU2+RND(2)*45:RUN

BBC BASIC, 35 Bytes / 107 95 Bytes

35 ไบต์เป็นเพียงสำหรับบรรทัดสุดท้ายซึ่งจะให้เขาวงกต 25 แถวในรูปแบบคอลัมน์ 40 MODE1 รับรองว่าไม่มีช่องว่างเหลือระหว่างเส้น ส่วนที่เหลือของโปรแกรมเป็นตัวเลือกและปรับปรุงการจัดรูปแบบ คำสั่ง VDU23 กำหนดแบบอักษรใหม่สำหรับอักขระ 47 และ 92 (8 ไบต์สร้างบิตแมป 8x8) ฉันรวมพิกเซลแสงในทั้งสี่มุมเพื่อหยุดการวิ่งตรงจากการถูกบีบ ผลข้างเคียงของสิ่งนี้คือมีจุดปรากฏในเพชรที่ว่างเปล่า รวม 107 ไบต์รวม 2 บรรทัดใหม่

  VDU23,47,131,7,14,28,56,112,224,193
  VDU23,92,193,224,112,56,28,14,7,131
  MODE9FORa=0TO999VDU2+RND(2)*45:NEXT

แก้ไขโปรแกรมนี้สามารถย่อให้สั้นถึง 95 ไบต์โดยการเข้ารหัสรหัส VDU 8 บิตบางส่วนเป็นค่า endian ขนาดเล็ก 16 บิต (แสดงโดยเครื่องหมายอัฒภาคหลังจากพวกเขาแทนเครื่องหมายจุลภาค) และแสดงคำสั่ง MODE เป็นคู่ของรหัส VDU ดังนี้ .

VDU23,47,1923;7182;28728;49632;23,92,57537;14448;3612;33543;22,9:FORa=0TO999VDU2+RND(2)*45:NEXT

เอาท์พุต

ใช้ BBC Basic สำหรับ Windows จาก bbcbasic.co.uk

บรรทัดสุดท้ายเท่านั้น 35 ไบต์

ป้อนคำอธิบายรูปภาพที่นี่

โปรแกรมทั้งหมด107 95 ไบต์

เมื่อฉันแสดงความคิดเห็นกับคำตอบของ @ Brian สแลชจะแบ่งสี่เหลี่ยมออกเป็น 2 สามเหลี่ยมสีเข้มซึ่งแต่ละอันมีทางเข้า / ออก 2 ทาง สิ่งนี้รับประกันว่าเป็นเส้นทางที่ไม่สำคัญ (ไร้สาระ) จากจุดใด ๆ บนขอบของเขาวงกตไปยังจุดอื่นบนขอบของเขาวงกต หลายสิ่งเหล่านี้สั้นมาก แต่ดูเหมือนจะมีความยาวไม่กี่ แน่นอนกลางเขาวงกตมีลูปอยู่บ้าง

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

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

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข - เลือกโดยอัตโนมัติจากเขาวงกตและการเลือกเริ่ม / สิ้นสุด

สำหรับอีกหนึ่งบรรทัด (59 ตัวอักษร) โปรแกรมสามารถเลือกได้ถึง 6 เขาวงกตโดยอัตโนมัติโดยเลือกสี่เหลี่ยมที่สุ่มและเติมน้ำท่วมในสีแดง, สีเขียว, สีเหลือง, สีฟ้า, สีม่วงแดงและสีฟ้า มันไม่ได้หาค่า 6 เต็มเสมอไปเพราะถ้ามันเลือกสี่เหลี่ยมสุ่มที่มีสีอยู่แล้วมันก็ไม่ทำอะไรเลย

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

สิ่งนี้สร้างชุดของเขาวงกตที่มีสีสันและพันกัน บางครั้งพวกมันก็พันกันดูเหมือนว่าเขาวงกตจะต้องข้ามบางแห่ง แต่แน่นอนพวกเขาทำไม่ได้!

รหัสเพิ่มเติมและเอาท์พุท 59 + 187 = 246 ตัวอักษรเพิ่มเติมที่จะเพิ่มในตอนท้ายของโปรแกรมเดิม (สำหรับการปรับปรุงเกินกว่าคำถาม spec)

  GCOL135FORa=1TO6GCOLa FILLRND(40)*32-16,RND(25)*32+208:NEXT   :REM set background to grey so fill can identify. For each colour 1 to 6, pick a point in the centre of a character and flood fill (characters are logically 32x32 although they are physically only 8x8 pixels.)
  f=126:g=126                                                   :REM flags 1111110 to indicate which starts and ends have not been allocated yet
  FORx=0TO39FORy=0TO24                                          :REM maze is 40x25. There is some blank space at the bottom of the screen (32 rows total)
  p=POINT(x*32+16,1008-y*32)                                    :REM check start point. Text origin is at top of screen, Graphics origin is at bottom, 1280x1024 logical. therefore y offset is 1024-32/2=1008.
  IFf AND2^p f=f-2^p:VDU31,x,y,17,p,79                          :REM if start for colour P has not been allocated yet, allocate it now. VDU31,X,Y go to that square. VDU 17,p select text colour. VDU 79 print an "O"                 
  p=POINT(1264-x*32,240+y*32)                                   :REM check end point
  IFg AND2^p g=g-2^p:VDU31,39-x,24-y,17,p,79                    :REM if end for colour P has not been allocated yet, allocate it now.
  NEXT:NEXT
  VDU31;26                                                      :REM get the cursor off the board. Move to (0,26). Semicolon used instead of comma here indicating that 31 is a 16 bit small endian value, equivalent to VDU31,0,26 or PRINTTAB(0,26)

ป้อนคำอธิบายรูปภาพที่นี่


7

C: 235 ไบต์

#define P(X,Y)M[(Y+40)*80+X+40]=rand()%49/6;
#define B(X,Y)P(X,Y)P(Y,X)
M[6400],r,i;main(){for(i=0;i<40;i+=2){int x=i,y=0,e=1-x;while(x>=y)
{B(x,y)B(-x,y)B(-x,-y)B(x,-y)++y;e+=e<0?2*y+1:2*(y-x--);}}for(i=0;
i<6400;)putchar(64>>!M[i++]);}

หมายเหตุ: ในข้างต้นฉันได้เพิ่มบรรทัดใหม่เพื่อให้พอดีกับหน้า เอาต์พุตที่คาดหวัง (บนเทอร์มินัล 80 อักขระ):ป้อนคำอธิบายรูปภาพที่นี่

ฉันเสียใจที่นี่ไม่ใช่เขาวงกตที่ยากมาก (อันที่จริงไม่จำเป็นต้องมีการย้อนรอยกลับไปยังวงแหวนด้านใน (และคุณควรหาเส้นทางจากเส้นรอบวงสู่ศูนย์กลางได้เล็กน้อย) อย่างไรก็ตามมันมีการนำวงเบรเซนแฮมมาใช้อย่างดี อัลกอริทึมการวาดที่หลักของมัน


เป็นการยากที่จะดูว่าคุณสามารถผ่านและไม่สามารถทำได้ ฉันต้องบอกว่าฉันชอบท่อ;) (สำหรับทั้งนี้และการส่งแบบวงกลมของฉัน)
Martin Ender

@ m.buettner: ฉันเห็นด้วยจริง ถ้าคุณเปลี่ยนi+=2ไปi+=3ก็อาจจะชัดเจนมากขึ้นสิ่งที่เกิดขึ้น
imallett

6

ฉันช่วยลูกของฉันทำสิ่งนี้เพื่อเรียนรู้การเขียนโปรแกรมเล็กน้อย: http://jsfiddle.net/fs2000/4KLUC/34/ คุณชอบมันอย่างไร


17
หากคุณสามารถใส่รหัสในโพสต์ได้ รวมถึงส่วนหัวเช่น #Language - Bytecount หากคุณใช้เฉพาะอักขระ ASCII ในรหัสของคุณคุณจะได้รับ bytecount ดีที่นี่ สรุปว่าโค้ดของคุณทำอะไรบ้างความเข้าใจใด ๆ ที่คุณมีหรือสิ่งที่ชาญฉลาดที่คุณทำอาจเป็นส่วนเสริมที่ดีสำหรับโพสต์ของคุณ อย่างไรก็ตาม Darth Vader ทำให้มันยากมากที่จะเห็นบางบรรทัด ในที่สุดยินดีต้อนรับสู่ Code Golf!
Rainbolt

คุณเรียนรู้การเขียนโปรแกรมเล็กน้อยกับลูก ๆ ของคุณและฉันเรียนกอล์ฟสักเล็กน้อย นี่คือการเล่นกอล์ฟครั้งแรกของฉันและผลลัพธ์ยังค่อนข้างยาว จำนวนไบต์: ดั้งเดิม: 55 + 6822 = 6877 จัดเรียงใหม่เล็กน้อย : 39 + 3131 = 3170 Golfed : 39 + 1593 = 1632
BartekChom

6

Commodore 64 BASIC - 38 ไบต์

10 PRINT CHR$(205.5+RND(1)); : GOTO 10

นี่ไม่ใช่สิ่งประดิษฐ์ของฉันฉันเพียงแค่ทำซ้ำโปรแกรมที่สวยงามและสั้นมากจากวันที่ผ่านมา อันที่จริงมีหนังสือทั้งเล่มชื่อ10 PRINT CHR$(205.5+RND(1)); : GOTO 10ฉลองรหัสชิ้นนี้!

คุณสามารถเห็นผลลัพธ์เกี่ยวกับเรื่องนี้วิดีโอ YouTube ; นี่คือหน้าจอ screencap:

หน้าจอ screencap ของ YouTube

ที่นี่ที่คำถาม StackOverflow นี้เป็นการใช้งานเพิ่มเติมของโปรแกรมเขาวงกตเครื่องกำเนิด การใช้งานโปรแกรมที่สั้นที่สุดคือโปรแกรม C64 BASIC ขนาด 23 ไบต์ต่อไปที่โพสต์โดยผู้เขียนคำถาม:

1?cH(109.5+rN(1));:gO1

โดยที่ตัวอักษรตัวพิมพ์เล็กถูกป้อนตามที่เป็นและตัวอักษรตัวใหญ่จะถูกป้อนโดยใช้ปุ่ม Shift (เหล่านี้มีลักษณะที่แตกต่างกันบนหน้าจอ C64 ที่เกิดขึ้นจริง)


นี่ไม่ใช่สิ่งเดียวกันกับที่ไบรอันเสนอหรือไม่ (สั้นกว่านี้เล็กน้อย) และคำตอบ Bash ของคุณคืออะไร? จากนั้นคำถามที่นี่ก็เช่นกันเขาวงกตที่ไม่มีทางแยกยังคงเป็นเขาวงกตหรือไม่?
Martin Ender

nneonneo, +1 สำหรับการแสดงตัวตนที่เหมาะสมและซื่อสัตย์ของความคิดที่ยอดเยี่ยมนี้ @ m.buettner พื้นที่ที่ไม่ได้พิมพ์จะสร้างเขาวงกตที่ยังไม่บรรเลงตามที่คุณชี้ อย่างไรก็ตาม (และฉันประหลาดใจที่ไม่มีผู้อื่นแสดงสิ่งนี้) พื้นที่พิมพ์ทำให้เขาวงกตที่น่าสนใจและไม่สำคัญ (ดูคำตอบของฉัน) ฉันกำลังยกเขาวงกตของคุณด้วยเนื่องจากมีจุดเริ่มต้นและจุดสิ้นสุดที่ดีที่สุด . การกำหนดจุดเริ่มต้นและจุดสิ้นสุดของเขาวงกตในแนวทแยงนั้นไม่ใช่เรื่องง่าย
เลเวลริเวอร์เซนต์

@ m.buettner 1. ไบนารี x86 มีขนาดเพียง 10 ไบต์ที่เล็กที่สุด 2. นี่เป็นอัลกอริทึมที่ได้รับการยอมรับอย่างดีและไม่ได้เป็นของดั้งเดิมทั้งหมดและไม่ได้มีจุดประสงค์เพื่อสร้างเขาวงกตที่สามารถแก้ไขได้
Isiah Meadows

5

Java: 700

นี่คือ adder กำแพงแบบเรียกซ้ำ อัลกอริทึมมีการระบุไว้ในเว็บไซต์นี้ :

public class Z{int i,j,u=20,v=u,g[][]=new int[v][u];public static void main(String[]a){new Z().d(0,0,20,20,0).p();}int q(int m){return(int)(Math.random()*m);}<T>void z(T m){System.out.print(m);}void p(){for(i=0;i++<u*2;z("_"));for(i=0;i<v;i++){z("\n|");for(j=0;j<u;j++){boolean b=i+2>v,s=g[i][j]%2>0||b;z(s?"_":" ");z(g[i][j]>1||j+2>u?"|":s&(j+1<u&&g[i][j+1]%2>0||b)?"_":" ");}}}Z d(int x,int y,int w,int h,int o){int a=x,b=y,c=a,d=b,e,f;boolean t=o<1;if(t){b+=q(h-2);c+=q(w);}else{a+=q(w-2);d+=q(h);}for(i=t?w:h;i-->0;j=t?a++:b++)if(a!=c&&b!=d)g[b][a]|=t?1:2;e=t?w:a-x+1;f=t?b-y+1:h;if(e>2&&f>2)d(x,y,e,f,e<f?0:1);e=t?w:x+w-a-1;f=t?y+h-b-1:h;if(e>2&&f>2)d(t?x:a+1,t?b+1:y,e,f,e<f?0:1);return this;}}

โดยพื้นฐานแล้วมันจะแยกแต่ละสี่เหลี่ยมเป็นสองส่วนด้วยกำแพง (และทาง) จากนั้นก็แยกออกเป็นสองส่วน ฯลฯ มันจะสร้างเขาวงกตที่“ สมบูรณ์แบบ” - เขาวงกตที่ไม่มีวงจร - ที่มีเส้นทางจากทุกจุดไปยังจุดอื่น ๆ ความตายมากมายเหลือเกินดังนั้นจึงไม่ใช่เรื่องผิดปกติสำหรับเขาวงกตที่มีขนาดใหญ่กว่า

ดังนั้นการเข้าและออกสามารถตัดสินใจได้เอง ถ้าฉันต้องเลือกมันจะบอกว่าบน / ซ้ายและล่าง / ขวา

มันถูกวาดใน ascii ความกว้างสองเท่าดังนั้นจึงเป็นความคิดที่ดีที่จะไพพ์เอาต์พุตไปยังไฟล์หากคุณกำลังทำหนึ่งในขนาดใดก็ได้ นี่คือ 20x20 ในคอนโซล:

20x20

และขนาด 100x100 ใน notepad ++ (ฉันต้องซูมออกเพื่อรับ ti all, ดังนั้นจึงเป็น ... ขนาดเล็ก ):

100x100

รหัสที่มีตัวแบ่งบรรทัด:

public class Z{
    int i,j,u=20,v=u,g[][]=new int[v][u];
    public static void main(String[]a){
        new Z().d(0,0,20,20,0).p();
    }

    int q(int m){return(int)(Math.random()*m);}
    <T>void z(T m){System.out.print(m);}

    void p(){
        for(i=0;i++<u*2;z("_"));
        for(i=0;i<v;i++){
            z("\n|");
            for(j=0;j<u;j++){
                boolean b=i+2>v,s=g[i][j]%2>0||b;
                z(s?"_":" ");
                z(g[i][j]>1||j+2>u?"|":s&(j+1<u&&g[i][j+1]%2>0||b)?"_":" ");
            }
        }
    }

    Z d(int x,int y,int w,int h,int o){
        int a=x,b=y,c=a,d=b,e,f;
        boolean t=o<1;
        if(t){
            b+=q(h-2);
            c+=q(w);
            }
        else{
            a+=q(w-2);
            d+=q(h);
        }

        for(i=t?w:h;i-->0;j=t?a++:b++)
            if(a!=c&&b!=d)
                g[b][a]|=t?1:2;

        e=t?w:a-x+1;f=t?b-y+1:h;
        if(e>2&&f>2)d(x,y,e,f,e<f?0:1);
        e=t?w:x+w-a-1;f=t?y+h-b-1:h;
        if(e>2&&f>2)d(t?x:a+1,t?b+1:y,e,f,e<f?0:1);
        return this;
    }
}

2

ZX Basic - 281 ตัวอักษร

นี่เป็นเขาวงกตที่ "ถูกต้อง" มากขึ้นนักกอล์ฟน้อยกว่า แต่มีเขามากกว่า เรียกว่าอัลกอริธึมเขาวงกตไบนารีแต่ละเซลล์สามารถมีทางออกลงหรือขวา แต่ไม่ใช่ทั้งสองอย่าง (ตอนนี้มีเครื่องหมาย "S" และ "E" ที่ทำเครื่องหมายไว้เพื่อป้องกันไม่ให้ตรงไปด้านใดด้านหนึ่ง)

"::" เป็นวิธีของ ZXB ในการป้อนอักขระกราฟิก Spectrum ลงในไฟล์ข้อความซึ่งเท่ากับอักขระบล็อกที่ขาย

randomize:border 1:paper 1:ink 6:cls
for x=0 to 30 step 2
 for y=0 to 20 step 2
  r=1+int(rnd*2)
  if x=30 and r=1 then 
   r=2
  end if
  if y=20 and r=2 then
   r=1
  end if
  print at y,x;"\::"
  print at y+(r=2),x+(r=1);"\::"
 next
next
print inverse 1;at 0,0;"S";at 20,31;"E"

เขาวงกต


2
ไม่ฉันหมายความว่าคุณควรสลับจุดเริ่มต้นและจุดสิ้นสุด (เริ่มต้นล่างขวา, สิ้นสุดซ้ายบน) มันเป็นเรื่องเล็กน้อยเพราะเนื่องจากกฎที่คุณต้องลงไปและถูกต้องตลอดเวลาเพื่อไปให้ถึงจุดจบ
Martin Ender

1
แม้ว่าจุดเริ่มต้นและจุดสิ้นสุดจะกลับด้านเขาวงกตมีคุณสมบัติ (อาจน่าสนใจ) ที่เส้นทางที่ถูกต้องจะเลื่อนขึ้นและซ้ายเท่านั้น อย่างไรก็ตามเขาวงกตนั้นไม่สำคัญอีกต่อไปเพราะมีหลายจุดที่คุณสามารถไปหนึ่งในสองวิธี
Kevin - Reinstate Monica

1

C- 244

#include <unistd.h>
#include <windows.h>
int main(i,j,rv,rs){srand( time(0));for (i = 0; i < 80; i++)for (j = 0; j <50 ; j++){rv = rand() %10;rs = rand() %100;if(rs < 10 || rs  > 90)continue;if(rv<4){gotoxy(i,j);printf("%c", '#');}}return 0;}

นี่คือลักษณะ:

เขาวงกต

หมายเหตุ: โซลูชั่นนี้ได้รับแรงบันดาลใจจากเกมระดับ 8 ที่ไม่น่าเชื่อถือเข้าไปในป่า

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