Thế hệ mê cung [đóng cửa]


41

Tôi biết có một chủ đề (cũ) tương tự như thế này ( ở đây ), nhưng tôi muốn khởi động lại nó với một số sửa đổi.

Mục tiêu: tạo ra một mê cung trông ngẫu nhiên bằng thuật toán bạn chọn, sau đó xuất ra mê cung bằng đồ họa (số lượng in).

  • Chiều rộng và chiều cao được xác định bởi bạn.
  • Cần có ít nhất một đường dẫn từ ít nhất một lối vào đến ít nhất một lối ra.
  • Định dạng của mê cung (cách bạn hiển thị, đánh dấu lối vào hoặc lối ra) cũng tùy thuộc vào bạn.
  • Càng xinh, càng tốt.
  • Mê cung tầm thường (ví dụ mê cung trống, mê cung lưới, mê cung kích thước 1x1) không được khuyến khích.
  • Chu kỳ trong mê cung được cho phép và, được khuyến khích, nếu kết quả là hợp lý.
  • Lạm dụng ngôn ngữ khuyến khích.
  • Mê cung sẽ trông hợp lý ngẫu nhiên (nhưng thuật toán hoàn toàn xác định (ví dụ hỗn loạn) tạo ra điều này cũng tốt).

Chỉnh sửa: trọng tâm chính ở đây là thực hiện nhỏ nhất có thể. Tuy nhiên, tôi muốn cho phép một số chậm trễ trong giới hạn đó để khuyến khích sự sáng bóng. Tôi đã cố tình để lại chính xác những "tính năng" mà mê cung đã kết thúc mở, nhưng như một hướng dẫn sơ bộ, bạn nên cố gắng đóng gói nhiều tiếng nổ nhất vào thùng ít từ vựng nhất.


4
Ngoài ra "Càng đẹp, càng tốt" dường như khó có thể hữu hình (hoặc đơn giản là không liên quan) đối với một thử thách chơi gôn. Có lẽ một cuộc thi nổi tiếng sẽ là lựa chọn tốt hơn nếu bạn quan tâm đến kết quả đẹp.
Martin Ender

5
Vì vậy, nó thực sự là code-golf hay nó là cuộc thi khá phổ biến?
l0b0

2
Như một đề xuất khác, nếu bạn muốn khuyến khích cả mã ngắn và mê cung gọn gàng, bạn có thể biến nó thành thử thách mã và tuyên bố rằng người chiến thắng sẽ được chọn bởi một số điểm là hỗn hợp giữa độ dài mã và upvote - mặc dù điều đó sẽ tùy thuộc vào bạn để xác định tổng số câu trả lời, bởi vì bao gồm số lượng upvote hiện tại trong bài viết là một chút vô dụng.
Martin Ender

3
Tôi nghĩ rằng mỗi câu trả lời nên giải thích những gì tạo thành lối vào và lối ra trong mỗi mê cung (cũng như, bức tường và lối đi là gì), để chúng ta có thể đánh giá viên đạn thứ 2.
LarsH

2
@Geobits Tôi sẽ không bận tâm quá nhiều, nhưng do đó, đề nghị của tôi thực sự biến nó thành một thách thức mã với việc chấm điểm kết hợp từ độ dài mã và phiếu bầu. Điều đó chính xác sẽ khuyến khích những gì OP muốn: mã ngắn cho các mê cung thú vị.
Martin Ender

Câu trả lời:


10

C: 265 253 byte

#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]);}

(Yêu cầu thiết bị đầu cuối 65 ký tự) Tạo mê cung 31x31 tương đối ngẫu nhiên với một đường dẫn được đảm bảo từ lối vào đến lối ra.

Ví dụ đầu ra (với thiết bị đầu cuối 65 ký tự mô phỏng):

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

2
Bạn thậm chí không cần int p,int c. p,clà đủ ...
chubakueno

À, cảm ơn vì đã chỉ ra điều đó
Dendrobium

34

Toán học, 144 132 byte

Kể từ khi thành lập, tất cả chúng ta đều biết cách hiệu quả nhất để vẽ một mê cung .

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}]

Đầu ra và ví dụ:

nhập mô tả hình ảnh ở đây

Tất nhiên, các dòng là các bức tường. Bạn là minotaur, người bắt đầu ở trung tâm và cần phải ra ngoài.


4
Điều này là đẹp, và mã là ngắn, nhưng tôi sẽ nói nó về phía cuối "mê cung tầm thường" của quang phổ.
LarsH

2
Bạn đúng khi làm cho nó lớn hơn sẽ không thay đổi sự tầm thường. Vấn đề là giải quyết mê cung này là một quá trình tuyến tính: tại mỗi thời điểm bạn có thể nhanh chóng tìm ra liệu mình đã rẽ sai, mà không phải "tái diễn" vào các nhánh sâu hơn. Mặt khác, câu trả lời của Ian và aleph là những mê cung "thực sự": chúng không thể được giải theo cách tuyến tính này. Vì các mê cung tầm thường không được khuyến khích, tôi rất muốn hạ thấp cái này, nhưng tôi không có đủ đại diện.
LarsH

1
@LarsH vâng, chúng tôi đồng ý về điều đó. Đó là lý do tại sao tôi nói đó là cách "hiệu quả" nhất để vẽ một mê cung, chứ không phải là cách "hiệu quả" nhất. ;) Tuy nhiên, nó có thể đơn giản, nhưng tôi không nghĩ rằng nó thuộc một loại với những loại bị loại trừ như "để trống" hoặc "1x1". Tất nhiên, theo quyết định của OP để loại bỏ sự đệ trình này vì tính đơn giản của nó, nhưng miễn là anh ta không làm điều đó hoặc thay đổi loại thách thức, tôi không thấy khuyến khích làm cho nó phức tạp / thú vị hơn.
Martin Ender

1
@LarsH đang được nói, tôi không chắc đó là do thuật toán của họ hay chỉ là một tính năng của các ví dụ cụ thể mà họ đã đăng, nhưng không có câu trả lời nào của họ yêu cầu quay lại vượt quá độ sâu "1" nhiều lần. Vì vậy, mặc dù chúng có rất nhiều phức tạp, nhưng tất cả đều nằm trong những con đường không liên quan.
Martin Ender

1
Mê cung này không tầm thường, theo ý kiến ​​của tôi, ngay cả khi nó dễ dàng (và mê cung hình tròn của tôi bên dưới thậm chí còn tầm thường hơn). Tôi thực sự chỉ muốn ngăn chặn canvas / size-1 / vv. "mê cung" s.
imallett

33

C: 364 byte

#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);}

Lưu ý: ở trên, tôi đã thêm dòng mới để làm cho nó phù hợp trên trang. Đầu ra dự kiến ​​(trên thiết bị đầu cuối 80 ký tự) (ghi chú bắt đầu và kết thúc ở trên cùng bên trái): nhập mô tả hình ảnh ở đây


8
@bwoebi MSPaint để giải cứu! HÌNH ẢNH
Tắc kè trần

6
Lưu ý rằng ý định của tôi là có đường dẫn bên trong các đường ống (như ở đây) .
imallett

1
@IanMallett Tôi nghĩ rằng Trần Gecko đã nhận thức được điều đó, nhưng việc lấp đầy bức tường bên trái bằng một màu sắc cho bạn một con đường (không tối ưu) đi dọc theo bức tường bên trái cho đến khi bạn tìm thấy lối ra. ;)
Martin Ender

1
Tôi rất muốn xem phiên bản chưa được đánh gôn của mã này, nếu bạn có thời gian.
LarsH

4
Trong khi bạn viết điều này, bạn là một lập trình viên mê cung.
totymedli

24

Toán học, 134 130 ký tự

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]

mê cung


Trên thực tế, chúng ta có thể sử dụng thuật toán này để tạo ra một mê cung từ bất kỳ đồ thị (không xác định) nào.

Ví dụ: tạo mê cung từ biểu đồ tham quan của hiệp sĩ 8 * 8 ( KnightTourGraph[8,8]):

biểu đồ du lịch hiệp sĩ

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]

mê cung2


7
Mê cung đẹp nhưng tôi không thấy lối vào nào được kết nối với lối ra?
bwoebi

9
Tôi tin rằng ý tưởng là chọn một nút ngẫu nhiên (giả sử, phía trên bên trái) làm lối vào và một nút khác (dưới cùng bên phải) làm lối ra. Mathematica đảm bảo tất cả các nút được kết nối với tất cả các nút khác, nhưng - đặc biệt là trong mê cung thứ hai - tìm cách chúng được kết nối là phần khó hơn.
EagleV_Attnam

Là các đường (cạnh đồ thị) được cho là tường mê cung, hoặc lối đi? Tôi nghĩ rằng tôi biết, nhưng bây giờ tôi không chắc chắn.
LarsH

@LarsH Họ là những đoạn văn.
alephalpha

1
@LarsH Biểu đồ được kết nối, vì vậy bạn chỉ cần lấy hai nút tùy ý, một nút là lối vào, nút còn lại là lối ra.
alephalpha

13

Bash, 53 byte

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

Ý tưởng tương tự với mã C64. Sử dụng các ký tự Unicode làm dấu gạch chéo vì chúng trông đẹp hơn nhiều trong một thiết bị đầu cuối hỗ trợ Unicode. Đầu ra mẫu trên OS X Terminal (phông chữ Menlo):

Mẫu đầu ra mê cung


2
Tôi đã từng tìm ra điều này : yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bash. Xem bài đăng này
gniourf_gniourf

5
Điều này dựa trên một thuật toán không thể tự bảo đảm là có thể giải được, một thuật toán đã nhiều năm tuổi.
Isiah Meadows

9

JavaScript (ES6), 174

Đây là người xây dựng mê cung mà tôi đã sử dụng trong thử thách khác này , chỉ chơi gôn. Đây là một hàm có 2 tham số: hàng và cột. Mê cung hoàn toàn được kết nối không có vòng lặp, vì vậy bất kỳ vị trí nào cũng có thể là điểm bắt đầu hoặc điểm kết thúc.

(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}

Thí dụ

f(7,10)

Đầu ra

,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

Kiểm tra

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>


Tôi không chắc ... ánh sáng hay vùng tối là mê cung? Nếu trời tối, thì nó có một vòng lặp lớn và người ta chỉ có thể ở bên ngoài khi chọn bất kỳ điểm nào làm điểm vào / thoát. Nếu ánh sáng, sau đó bạn nên thêm lối ra / vào.
Paŭlo Ebermann

1
@ PaŭloEbermann đó là ánh sáng tất nhiên, vùng tối là những bức tường. Lặp đi lặp lại bản thân: Mê cung hoàn toàn được kết nối không có vòng lặp, vì vậy bất kỳ vị trí nào cũng có thể là điểm bắt đầu hoặc điểm kết thúc
edc65

Thật tuyệt vời! Cạo một số byte và giảm xuống còn 133 byte: twitter.com/aemkei/status/889587308894326785 Nhưng tất cả các khoản tín dụng sẽ thuộc về bạn!
aemkei

@aemkei 8 thay vì '#', tôi không thể tin rằng mình đã bỏ lỡ điều đó vào thời điểm đó
edc65

8

ZX cơ bản - 54 ký tự

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

Đầu ra

Đây là mê cung hiển thị một tuyến đường xuyên qua nó (khoảng cách giữa các dòng)

con đường

và một đoạn nhỏ từ khi tôi mới làm điều này (vài năm trước) và dành một chút thời gian để làm đồ họa tốt hơn.

đồ họa tốt hơn


2
Hừm, táo tợn. ^^ Bắt đầu là gì và kết thúc ở đó là gì? Và những dấu gạch chéo những con đường hay những bức tường? Và kích thước khoảng cách tối thiểu tôi có thể đi qua là gì?
Martin Ender

2
"Nên có ít nhất một con đường từ ít nhất một lối vào đến ít nhất một lối ra." Tôi không thấy bất kỳ dấu hiệu nào cho thấy tiêu chí này được đáp ứng. Những bức tường ngẫu nhiên không nhất thiết phải tạo ra một mê cung.
LarsH

1
@ m.buettner: Tôi đoán rằng các dấu gạch chéo là các bức tường và chúng ta phải hình dung nó như thể không có khoảng trống giữa các hàng và giữa các cột. Vì vậy, các ký tự 2x2 phía dưới bên trái tạo thành hình kim cương (hình vuông) hoàn toàn khép kín.
LarsH

@LarsH vâng tôi nghĩ vậy. Điều đó chỉ làm cho một điểm khác cho trường hợp của bạn về câu hỏi của OP rằng mọi người nên chỉ ra bắt đầu và kết thúc là gì. Ngoài ra, chương trình này thậm chí không cho phép các mối nối. Bạn chỉ có thể có những ô vuông khép kín hoặc những con đường uốn khúc (cũng có thể là những vòng khép kín).
Martin Ender

+1 cho đồ họa được cải thiện và hiển thị tuyến đường. Tôi đoán được đưa ra rất nhiều lối vào và lối ra tiềm năng, khả năng có "ít nhất một con đường từ ít nhất một lối vào đến ít nhất một lối ra" là khá cao!
LarsH

8

BBC BASIC, 18 byte

Một cải tiến về độ dài trên phiên bản vòng lặp vô hạn C64 23 byte của @nneonneo. VDU gửi một ký tự duy nhất đến bộ điều khiển VDU: 2 + 1 * 45 = ASCII 47 /hoặc 2 + 2 * 45 = ASCII 92\

  VDU2+RND(2)*45:RUN

BBC BASIC, 35 byte / 107 95 byte

35 byte chỉ dành cho dòng cuối cùng, cung cấp một mê cung 25 hàng trong bố cục 40 cột. MODE1 đảm bảo rằng không còn khoảng trống thừa giữa các dòng. Phần còn lại của chương trình là tùy chọn và cải thiện định dạng. Các câu lệnh VDU23 xác định lại phông chữ cho các ký tự 47 và 92 (8 byte tạo thành một bitmap 8x8.) Tôi bao gồm một pixel ánh sáng ở cả bốn góc để ngăn không cho chạy thẳng bị chèn ép. Tác dụng phụ của việc này là một chấm xuất hiện trong những viên kim cương rỗng. Tổng cộng 107 byte bao gồm 2 dòng mới.

  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

Chỉnh sửa chương trình này có thể được rút ngắn xuống 95 byte bằng cách mã hóa một số mã VDU 8 bit thành các giá trị endian nhỏ 16 bit (ký hiệu là dấu chấm phẩy sau chúng thay vì dấu phẩy) và biểu thị câu lệnh MODE dưới dạng một cặp mã VDU, như sau .

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

Đầu ra

Sử dụng BBC Basic cho Windows từ bbcbasic.co.uk

Chỉ dòng cuối cùng, 35 byte

nhập mô tả hình ảnh ở đây

Toàn bộ chương trình, 107 95 byte

Như tôi đã nhận xét về câu trả lời của @ Brian, dấu gạch chéo chia hình vuông thành 2 hình tam giác tối, mỗi hình có chính xác 2 lối vào / lối ra. Điều này đảm bảo một con đường (tầm thường, không phân chia) từ bất kỳ điểm nào trên rìa mê cung đến một điểm khác trên rìa mê cung. Nhiều trong số này rất ngắn, nhưng dường như luôn có một vài cái dài. Tất nhiên, ở giữa mê cung cũng có một số vòng lặp.

Vì các câu trả lời khác không đề cập đến nó, tôi muốn nhìn kỹ vào các khu vực ánh sáng. Chúng bị giới hạn bởi các vùng tối, do đó, như một hệ quả của tuyên bố đưa ra ở trên, một vùng ánh sáng được giới hạn bên ngoài bởi N vùng tối chạm vào rìa của trường tại điểm N (chính xác là nhiều). Do đó, một số vùng ánh sáng khá lớn xảy ra và những dạng mê cung phân nhánh này rất thú vị.

Trong ví dụ dưới đây, bạn có thể thấy đầu ra thô (đơn sắc) từ chương trình của tôi. Bên dưới đó (sử dụng Windows Paint) tôi đã tô màu hai vùng tối dài nhất màu xanh lam. Sau đó, tôi tô màu khu vực ánh sáng lớn nhất bằng màu vàng và hai khu vực giới hạn bởi màu xanh lam là màu đỏ và màu xanh lá cây. Các mê cung màu vàng, xanh lá cây (và thậm chí là màu đỏ) khá thú vị và không tầm thường.

nhập mô tả hình ảnh ở đây

EDIT - Tự động chọn mê cung và lựa chọn bắt đầu / kết thúc

Đối với một dòng nữa (59 ký tự), chương trình có thể tự động chọn ra tối đa 6 mê cung bằng cách chọn hình vuông ngẫu nhiên và lấp đầy các màu đỏ, xanh lá cây, vàng, xanh dương, đỏ tươi và lục lam. Nó không phải lúc nào cũng tìm thấy đủ 6, bởi vì nếu nó chọn một hình vuông ngẫu nhiên đã được tô màu thì nó không làm gì cả.

Phần còn lại của mã bên dưới chọn ra một khởi đầu cho mỗi màu bằng cách quét từng cột từ trên xuống dưới và từ trái sang phải và chọn ô vuông đầu tiên mà nó gặp. Nó chọn một kết thúc bằng cách quét theo hướng ngược lại.

Điều này tạo ra một tập hợp các mê cung đầy màu sắc, đan xen. Đôi khi chúng đan xen vào nhau trông giống như những mê cung phải băng qua đâu đó. Nhưng tất nhiên, họ không!

Mã bổ sung và đầu ra 59 + 187 = 246 ký tự bổ sung sẽ được thêm vào cuối chương trình gốc (để nâng cao ngoài thông số câu hỏi.)

  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)

nhập mô tả hình ảnh ở đây


7

C: 235 byte

#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++]);}

Lưu ý: ở trên, tôi đã thêm dòng mới để làm cho nó phù hợp trên trang. Đầu ra dự kiến ​​(trên thiết bị đầu cuối 80 ký tự):nhập mô tả hình ảnh ở đây

Tôi lấy làm tiếc rằng đây không phải là một mê cung rất khó khăn (trên thực tế, không yêu cầu quay lại các vòng trong (và bạn sẽ có thể tìm thấy một con đường từ chu vi đến trung tâm một cách tầm thường). Tuy nhiên, nó có một triển khai tốt đẹp của vòng tròn Bresenham vẽ thuật toán ở lõi của nó.


Thật khó để thấy nơi bạn có thể đi qua và nơi bạn không thể đi qua. Tôi phải nói rằng, tôi thích các đường ống;) (cho cả điều này và đệ trình vòng tròn của tôi).
Martin Ender

@ m.buettner: Tôi thực sự đồng ý. Nếu bạn thay đổi i+=2thành i+=3, có thể rõ ràng hơn những gì đang xảy ra.
imallett

6

Tôi đã giúp con tôi làm điều này, để học một chút về lập trình: http://jsfiddle.net/fs2000/4KLUC 432 / bạn thích nó như thế nào?


17
Nếu bạn có thể phù hợp với mã của bạn vào bài viết, hãy làm điều đó. Ngoài ra, bao gồm một tiêu đề như #L Language (s) - Bytecount. Nếu bạn chỉ sử dụng các ký tự ASCII trong mã của mình, bạn có thể nhận được một mã số đẹp ở đây . Một bản tóm tắt về những gì mã của bạn làm, bất kỳ hiểu biết nào bạn có thể có hoặc bất kỳ điều thông minh nào bạn đã làm có thể là một bổ sung tốt đẹp cho bài đăng của bạn. Nhân tiện, Darth Vader làm cho rất khó để nhìn thấy một số dòng. Cuối cùng, Chào mừng bạn đến với Code Golf!
Rainbolt

Bạn đã học được một chút về lập trình với con bạn và tôi đã học được một chút về chơi gôn. Đây là lần chơi golf đầu tiên của tôi và kết quả vẫn còn khá dài. Số lượng byte: Bản gốc: 55 + 6822 = 6877. Một chút được tổ chức lại : 39 + 3131 = 3170 Golfed : 39 + 1593 = 1632
BartekChom

6

Hàng hóa 64 BASIC - 38 byte

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

Đây không phải là phát minh của tôi, tôi chỉ đơn giản là lặp lại một chương trình rất đẹp và ngắn từ những ngày đã qua. Trên thực tế, có cả một cuốn sách có tên 10 PRINT CHR$(205.5+RND(1)); : GOTO 10kỷ niệm đoạn mã này!

Bạn có thể thấy đầu ra trên video YouTube này ; đây là một screencap:

Ảnh chụp màn hình YouTube

Ở đây tại câu hỏi StackOverflow này có nhiều triển khai hơn của chương trình tạo mê cung này. Việc triển khai chương trình ngắn nhất là chương trình C64 BASIC 23 byte sau đây được đăng bởi tác giả của câu hỏi đó:

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

trong đó các chữ cái viết thường được nhập nguyên trạng và các chữ cái viết hoa được nhập bằng phím Shift (chúng có các chữ xuất hiện khác nhau trên màn hình C64 thực tế).


Đây có phải chính xác là cùng một đệ trình của Brian không? (chỉ ngắn hơn một chút) Và câu trả lời Bash của bạn là gì? Vậy thì câu hỏi ở đây là tốt, một mê cung không có nút giao vẫn là mê cung?
Martin Ender

nneonneo, +1 cho sự ghi nhận đúng đắn và trung thực của ý tưởng tuyệt vời này. @ m.buettner Khu vực chưa in tạo ra mê cung không phân chia khi bạn chỉ ra. Tuy nhiên (và tôi ngạc nhiên không có ai khác thể hiện điều này), khu vực in tạo thành một số mê cung thú vị, không tầm thường, phân nhánh (xem câu trả lời của tôi.) Tôi nâng cao mê cung của bạn vì nó có điểm bắt đầu và kết thúc tốt nhất . Xác định bắt đầu và kết thúc trên các mê cung đường chéo là không dễ dàng.
Cấp sông St

@ m.buettner 1. Nhị phân x86 chỉ có 10 byte nhỏ nhất. 2. Đây là một thuật toán được mài giũa kỹ lưỡng, và hoàn toàn không phải là nguyên bản, cũng không nhằm mục đích tạo ra một mê cung có thể giải quyết được.
Isiah Meadows

5

Java: 700

Đây là một trình cộng tường đệ quy. Thuật toán được phác thảo trên trang web này :

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;}}

Về cơ bản, nó chia mỗi hình chữ nhật thành hai với một bức tường (và lối đi), sau đó chia đôi thành hai, v.v ... Nó tạo ra một mê cung "hoàn hảo" - một không có chu kỳ - có đường dẫn từ mọi điểm đến mọi điểm khác. Rất nhiều ngõ cụt, vì vậy nó không "tầm thường" trong bất kỳ ý nghĩa nào đối với các mê cung lớn hơn.

Vì vậy, lối vào và lối ra có thể được quyết định tùy ý. Nếu tôi phải chọn một, nó sẽ chỉ nói trên / trái và dưới / phải.

Nó được vẽ bằng ascii có chiều rộng gấp đôi, vì vậy tốt nhất là bạn nên chuyển đầu ra thành tệp nếu bạn đang thực hiện một trong bất kỳ kích thước nào. Đây là 20x20 trong bảng điều khiển:

20x20

Và 100x100 trong notepad ++ (tôi phải thu nhỏ để lấy tất cả, vì vậy nó hơi ... nhỏ ):

100x100

Mã có ngắt dòng:

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 cơ bản - 281 ký tự

Đây là nhiều hơn một mê cung "thích hợp", ít golf hơn, nhưng mê cung hơn. Vì vậy, được gọi là thuật toán mê cung nhị phân, mỗi ô có thể có một lối ra đi xuống hoặc phải, nhưng không phải cả hai. (Bây giờ bao gồm Bắt đầu "S" được đánh dấu và Kết thúc "E", để ngăn chặn việc đi thẳng dọc theo một bên).

"::" là cách ZXB nhập các ký tự đồ họa Spectrum vào tệp văn bản, tương đương với ký tự khối được bán.

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"

mê cung


2
Không tôi thực sự có nghĩa là bạn nên trao đổi bắt đầu và kết thúc (bắt đầu dưới cùng bên phải, kết thúc trên cùng bên trái). Vì nó đứng tầm thường, bởi vì các quy tắc, bạn chỉ cần đi xuống và đúng mọi lúc để đi đến cuối cùng.
Martin Ender

1
Ngay cả khi bắt đầu và kết thúc đảo ngược, mê cung có thuộc tính (có lẽ thú vị) rằng đường dẫn chính xác sẽ chỉ di chuyển lên và rời khỏi. Mê cung không còn tầm thường nữa, bởi vì có nhiều điểm bạn có thể đi theo một trong hai cách.
Kevin - Tái lập 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;}

Đây là cách nó trông như thế nào:

mê cung

Lưu ý: giải pháp này được lấy cảm hứng từ trò chơi cấp 8 không đáng tin cậy : vào rừng.

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.