미로 생성 [폐쇄]


41

이 ( here ) 와 비슷한 (오래된) 스레드가 있다는 것을 알고 있지만 약간의 수정으로 스레드 를 재부팅하고 싶습니다.

목표 : 선택한 알고리즘을 사용하여 무작위로 보이는 미로를 생성 한 다음 미로를 그래픽으로 출력합니다 (인쇄 횟수).

  • 너비와 높이는 귀하에 의해 결정됩니다.
  • 적어도 하나의 입구에서 적어도 하나의 출구로 향하는 적어도 하나의 경로가 있어야합니다.
  • 미로의 형식 (표시 방법, 입구 또는 출구 표시)은 사용자에게 달려 있습니다.
  • 더 예쁘면 좋습니다.
  • 사소한 미로 (예 : 빈 미로, 격자 미로, 1x1 크기의 미로)는 사용하지 않는 것이 좋습니다.
  • 미로의 순환이 허용되며 결과가 합리적이라면 권장됩니다.
  • 언어 남용이 권장되었습니다.
  • 미로는 합리적으로 무작위로 보일 것입니다 (그러나 이것을 결정하는 완전히 결정 론적 (예 : 혼란스러운) 알고리즘도 좋습니다).

편집 : 여기에서 주요 초점은 가능한 가장 작은 구현에 있습니다. 그러나 나는 그 제약 내에서 약간의 여유가 빛나도록 장려하고 싶습니다. 나는 미로가 어떤 "기능"을 오픈 엔드로 고의로 정확하게 남겨 놓았지만, 대략적인 지침으로 가장 어휘 벅에 가장 많은 금액을 넣도록 노력해야한다.


4
또한 "예쁜 것이 좋을수록 좋다"는 코드 골프 도전에 대한 유형적 (또는 단순히 관련이없는) 것으로 보인다. 예쁜 결과에 관심이 있다면 인기 콘테스트가 더 나은 선택 일 것입니다.
Martin Ender

5
그렇다면 실제로 코드 골프입니까 아니면 인기 경쟁입니까?
l0b0

2
또 다른 제안으로, 짧은 코드와 깔끔한 미로를 장려하고 싶다면 코드 도전을하고 코드 길이와 공감대가 혼합 된 점수로 승자가 선정 될 것이라고 선언 할 수 있습니다. 게시물에 현재 투표 수를 포함시키는 것은 약간 쓸모가 없기 때문에 각 답변 총점을 결정하는 것은 당신에게 달려 있습니다.
Martin Ender

3
나는 두 번째 총알을 평가할 수 있도록 각 대답이 각 미로의 입구와 출구를 구성하는 것 (벽과 통로는 무엇인지)을 설명해야한다고 생각합니다.
LarsH

2
@Geobits 나는별로 신경 쓰지 않을 것이지만, 실제로 코드 길이와 투표 점수를 합한 코드 도전에 대한 제안입니다. 그것은 OP가 원하는 것을 정확하게 장려 할 것입니다 : 흥미로운 미로를위한 짧은 코드.
Martin Ender

답변:


10

C : 265253 바이트

#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, 144132 바이트

처음부터 우리 는 미로를 그리는 가장 효율적인 방법을 알고 있습니다.

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

언 골프 및 출력 예 :

여기에 이미지 설명을 입력하십시오

물론 선은 벽입니다. 당신은 센터에서 시작해서 나가야하는 미노타 우르입니다.


4
이것은 예쁘고 코드는 짧지 만 스펙트럼의 "사소한 미로"끝을 향해 있다고합니다.
LarsH

2
더 크게 만드는 것이 사소한 것을 바꾸지 않을 것입니다. 요점은이 미로를 해결하는 것이 선형 과정이라는 것입니다. 모든 지점에서 더 깊은 지점으로 "재귀"하지 않고도 잘못된 방향으로 돌 렸는지 신속하게 알 수 있습니다. 반면에 Ian과 aleph의 대답은 "실제"미로입니다. 이러한 선형 방식으로는 해결할 수 없습니다. 사소한 미로는 낙담하지 않기 때문에 나는 이것을 낮추려고 유혹하지만 충분한 담당자가 없습니다.
LarsH

1
@LarsH 네, 우리는 그것에 동의합니다. 그렇기 때문에 가장 효과적인 방법이 아니라 미로를 그리는 가장 "효율적인"방법이라고 말했습니다. ;) 그래도 간단 할 수 있지만 "공백"또는 "1x1"과 같이 배제 된 범주에 속하는 것으로 생각되지 않습니다. 물론이 제출물을 단순성으로 실격 처리하는 것은 OP의 재량에 달려 있지만, 그렇게하지 않거나 도전의 유형을 변경하지 않는 한 더 복잡하고 흥미롭게 만들려는 동기는 없습니다.
Martin Ender

1
@LarsH는 알고리즘이나 그들이 게시 한 특정 예제의 기능 때문인지 확실하지 않지만 답변은 깊이 "1"을 넘어 두 번 이상 역 추적 할 필요가 없습니다. 따라서 많은 복잡성이 포함되어 있지만 어쨌든 관련이없는 경로에 있습니다.
Martin Ender

1
이 미로는 쉽지만, 내 의견으로는 사소한 것이 아닙니다 (그리고 아래의 원형 미로는 훨씬 더 사소합니다). 나는 단지 빈 캔버스 / 크기-1 등을 막고 싶었습니다. "미로".
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 MS 페인트 구조! 이미지
실링 게코

6
내 의도는 경로가 파이프 내부에 있도록하는 것입니다 (여기서) .
imallett

1
@IanMallett Ceiling Gecko가 그 사실을 알고 있다고 생각하지만 왼쪽 벽에 색상을 범람하면 출구를 찾을 때까지 왼쪽 벽을 따라 (최적의) 경로를 제공합니다. ;)
Martin Ender

1
시간이 있다면이 코드의 골프화되지 않은 버전을 보는 데 관심이 있습니다.
LarsH

4
이 글을 쓰는 동안 당신은 미로가 된 코더였습니다.
totymedli

24

매쓰, 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]

미로 2


7
멋진 미로… 그러나 출구에 연결된 어떤 입구도 보이지 않는다. ..?
bwoebi

9
아이디어는 임의의 노드 (예 : 왼쪽 위)를 입구로 선택하고 다른 노드 (오른쪽 아래)를 출구로 선택하는 것입니다. Mathematica는 모든 노드가 다른 모든 노드와 연결되도록하지만 특히 두 번째 미로에서 연결 방법을 찾는 것이 더 어려운 부분입니다.
EagleV_Attnam

선 (그래프 가장자리)이 미로 벽이나 통로로되어 있습니까? 나는 알고 있다고 생각했지만 지금은 확실하지 않습니다.
LarsH

@LarsH 그들은 구절입니다.
alephalpha

1
@LarsH 그래프가 연결되어 있으므로 하나는 입구로, 다른 하나는 출구로 두 개의 임의 노드를 취할 수 있습니다.
alephalpha

13

배쉬, 53 바이트

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

C64 코드와 비슷한 아이디어입니다. 유니 코드 문자는 슬래시로 사용합니다. 유니 코드를 지원하는 터미널에서는 훨씬보기 좋기 때문입니다. OS X 터미널의 샘플 출력 (Menlo 글꼴) :

샘플 미로 출력


2
나는 이것을 한 번 알아 냈습니다 yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bash. 이 게시물
gniourf_gniourf

5
이것은 수년이 지난 것을 스스로 해결할 수 있다고 보장 할 수없는 알고리즘 을 기반으로합니다 .
Isiah Meadows

9

자바 스크립트 (ES6), 174

이것은 내가이 다른 도전에 사용한 미로 제작자 입니다. 행과 열의 두 가지 매개 변수가있는 함수입니다. 미로는 루프없이 완전히 연결되어 있으므로 어느 위치 든 시작 또는 끝 지점이 될 수 있습니다.

(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 기본-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 베이직, 18 바이트

@nneonneo에 의해 23 바이트 C64 무한 루프 버전에서 길이가 향상되었습니다. VDU는 단일 문자를 VDU 컨트롤러에 보냅니다. 2 + 1 * 45 = ASCII 47 /또는 2 + 2 * 45 = ASCII 92\

  VDU2+RND(2)*45:RUN

BBC 기본, 35 바이트 / 107 95 바이트

35 바이트는 마지막 행에 불과하며 40 열 레이아웃에서 25 행 미로를 제공합니다. MODE1을 사용하면 줄 사이에 추가 공간이 남지 않습니다. 프로그램의 나머지 부분은 선택 사항이며 서식을 향상시킵니다. VDU23 문은 문자 47 및 92 (8x8 비트 맵을 형성하는 8 바이트)의 글꼴을 재정의합니다. 나는 4 개의 모서리에 밝은 픽셀을 포함시켜 직선 실행이 핀치되는 것을 막습니다. 이것의 부작용은 빈 다이아몬드에 점이 나타나는 것입니다. 줄 바꿈 2 개를 포함하여 총 107 바이트

  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

편집 이 프로그램은 다음 (세미콜론 붙이고 그 쉼표 대신 후) 작은 엔디안 값 (16)에 8 비트 VDU 코드의 일부를 암호화하여 95 바이트의 비트 단축과 VDU 코드의 쌍으로서 MODE 문을 대표 할 수있다 .

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

산출

bbcbasic.co.uk에서 Windows 용 BBC Basic 사용

마지막 줄만, 35 바이트

여기에 이미지 설명을 입력하십시오

전체 프로그램, 107 95 바이트

@Brian의 답변에 대해 언급했듯이 슬래시는 사각형을 두 개의 어두운 삼각형으로 나눕니다. 각 삼각형에는 정확히 2 개의 출입구가 있습니다. 이것은 미로 가장자리의 어떤 지점에서 미로 가장자리의 다른 지점까지 (사소하고 분기되지 않은) 경로를 보장합니다. 이들 중 다수는 매우 짧지 만 항상 몇 가지 긴 것 같습니다. 물론 미로 한가운데에 고리가 있습니다.

다른 답변에서 언급하지 않았으므로 밝은 부분을 잘 살펴보고 싶습니다. 이것들은 어두운 영역에 의해 경계가 정해 지므로, 위에서 언급 한 진술에 따라 N 어두운 영역에 의해 외부에 경계를 둔 밝은 영역은 N (정확히 많은) 지점에서 필드 가장자리에 닿습니다. 따라서 상당히 넓은 영역이 생겨서 흥미로운 분기 미로를 형성합니다.

아래 예에서 내 프로그램의 원시 출력 (흑백)을 볼 수 있습니다. 그 아래 (Windows Paint 사용)는 가장 긴 두 영역을 파란색으로 채색했습니다. 그런 다음 가장 큰 밝은 영역을 노란색으로 칠하고 두 영역을 파란색으로 빨간색과 녹색으로 경계를 정했습니다. 노랑, 초록 (그리고 빨강) 미로는 매우 흥미롭고 사소하지 않습니다.

여기에 이미지 설명을 입력하십시오

편집-미로 자동 선택 및 시작 / 종료 선택

한 줄 이상 (59 자)의 경우 프로그램은 무작위로 사각형을 선택하고 빨강, 녹색, 노랑, 파랑, 마젠타 및 녹청 색으로 채우기를하여 최대 6 개의 미로를 자동으로 선택할 수 있습니다. 항상 전체 6을 찾지는 못합니다. 이미 색이 지정된 임의의 사각형을 선택하면 아무것도하지 않기 때문입니다.

아래의 나머지 코드는 각 열을 위에서 아래로, 왼쪽에서 오른쪽으로 스캔하고 첫 번째 사각형을 선택하여 각 색상의 시작을 선택합니다. 반대 방향으로 스캔하여 끝을 선택합니다.

이것은 다채로운 색채로 뒤얽힌 미로를 만듭니다. 때때로 그들은 서로 얽혀있어 미로가 어딘가를 건너야하는 것처럼 보입니다. 그러나 물론 그렇지 않습니다!

추가 코드 및 출력 59 + 187 = 246 개의 추가 문자가 원래 프로그램의 끝에 추가됨 (질문 스펙을 넘어서는 향상을 위해)

  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+=2i+=3, 그것은 더 무슨 일이 일어나고 있는지 취소 될 수 있습니다.
imallett

6

나는 내 아이가 이것을하고 약간의 프로그래밍을 배우도록 도왔다 : http://jsfiddle.net/fs2000/4KLUC/34/ 당신은 그것을 어떻게 좋아합니까?


17
게시물에 코드를 넣을 수 있다면 그렇게하십시오. 또한 #Language (s)-Bytecount와 같은 헤더를 포함하십시오. 코드에서 ASCII 문자 만 사용한 경우 여기 에서 좋은 바이트 수를 얻을 수 있습니다 . 코드의 기능, 내가 가진 통찰력, 또는 영리한 일에 대한 요약은 게시물에 멋진 추가 기능이 될 수 있습니다. 그건 그렇고, 다스 베이더 (Darth Vader)는 일부 라인을보기가 매우 어렵습니다. 마지막으로, 코드 골프에 오신 것을 환영합니다!
Rainbolt

당신은 당신의 아이들과 약간의 프로그래밍을 배웠고 나는 약간의 골프를 배웠습니다. 이것은 나의 첫 골프이며 결과는 여전히 길다. 바이트 수 : 원본 : 55 + 6822 = 6877. 비트 재구성 : 39 + 3131 = 3170 골프 : 39 + 1593 = 1632
BartekChom

6

코모도어 64 베이직-38 바이트

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

이것은 내 발명품이 아니며, 과거의 일에서 아주 아름답고 짧은 프로그램을 반복하고 있습니다. 실제로이 10 PRINT CHR$(205.5+RND(1)); : GOTO 10코드를 축하 하는 책 이 있습니다!

YouTube 비디오 에서 출력을 볼 수 있습니다 . 여기 스크린 캡이 있습니다 :

YouTube 스크린 캡

여기에서 이 StackOverflow의 질문 이 미로 생성기 프로그램의 많은 구현입니다. 프로그램의 가장 짧은 구현은 해당 질문의 작성자가 게시 한 다음 23 바이트 C64 BASIC 프로그램입니다.

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

여기서 소문자는 그대로 입력하고 Shift 키를 사용하여 대문자를 입력합니다 (실제 C64 화면에서는 모양이 다름).


이것은 정확히 Brian의 제출물이 아닙니까? (조금 더 짧습니다) 그리고 Bash는 대답합니까? 그렇다면 여기서 질문도 있습니다. 접합부가없는 미로는 여전히 미로입니까?
Martin Ender

nneonneo,이 위대한 아이디어의 올 바르고 정직한 기여에 +1. @ m.buettner 당신이 지적한대로 인쇄되지 않은 영역은 분기되지 않은 미로를 생성합니다. 그러나 (아무도 아직 이것을 보인 사람이 아무도 없습니다.) 인쇄 된 영역은 흥미롭고 사소한 가지가없는 미로를 형성합니다 (내 답변 참조). . 이 대각선 미로에서 시작과 끝을 정의하는 것은 쉽지 않습니다.
Level River St

@ m.buettner 1. x86 바이너리는 최소 10 바이트입니다. 2. 이것은 잘 알려진 알고리즘이며, 전혀 독창적이지 않으며, 해결 가능한 미로를 만들려는 것도 아닙니다.
Isiah Meadows

5

자바 : 700

재귀 적 벽 가산기입니다. 이 사이트 에 알고리즘이 설명되어 있습니다 .

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

그리고 notepad ++에서 100x100 ++ (모든 것을 얻기 위해 축소해야 했으므로 다소 작습니다 ) :

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 기본-281 자

이것은 "적절한"미로에 가깝고 골퍼는 적지 만 더 웅장합니다. 이진 미로 알고리즘이라고 불리는 각 셀은 출구가 아래로 또는 오른쪽으로 갈 수 있지만 둘다는 아닙니다. (이제 한쪽을 똑바로 밟지 않도록 시작 "S"와 끝 "E"로 표시됩니다.

"::"는 ZXB에서 스펙트럼 그래픽 문자를 텍스트 파일에 입력하는 방식으로 판매 된 블록 문자와 같습니다.

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-복원 모니카

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.