무작위 미로 인쇄


19

선택한 알고리즘을 사용하여 임의의 미로 를 생성하고 인쇄하는 프로그램을 작성 하십시오. 프로그램의 여러 실행에 대해서는 미로가 달라야합니다. 높이와 너비는 명령 행 인수로 제공됩니다. 사용 |, 수직 벽을 위해 -수평 벽과 +코너. 미로는 벽으로 둘러싸여 있으며 입구는 빠진 벽으로 표시되어 있습니다. 미로는 #적어도 하나의 입구에서 도달 할 수 있는 보물을 포함합니다.

$ python2 random-maze.py 4 5
+-+-+
  |#|
|   |
+---+

+1 좋은 질문입니다. 그래도 몇 가지 요점. 1 : 출구는 어떻게 표시됩니까? 기호가 같 *습니까? 아니면 두 개의 별도 출입구가 있습니까? 2 : 출구에 도달 할 수 있도록 지정해야합니다.
snmcdonald

1
@ snmcdonald : 재미있게 만들어 보자 :).
Alexandru

2
나는 그들을 해결하는 것에 대한 후속 골프를 볼 수 있습니다 ... :)
st0le

@ st0le : 나는 이미 몇 가지 아이디어가 있습니다. 당신이 토론하고 싶다면 나에게 메일을 보내십시오.
Alexandru

1
퍼즐 유형은 여기에 지정되어 있지 않습니다. 나는 사람들이 그것을 마치 [code-golf] 인 것처럼 대답 한 것을 본다. 그 의도였습니까? 그렇다면 그와 같이 태그를 지정하십시오.
dmckee

답변:


5

나는 이것이 기술적으로 미로 생성기가 아니라고 생각하지만 결과와 같은 미로를 만듭니다 : https://gist.github.com/803450 .

내가 아는 끔찍한 코드는 반 시간 미만으로 작동하며 다른 벽에서 튀어 나온 벽과는 관련이 없습니다. 그러나 그 나머지 부분을 고치는 데 방해가되지 않을 정도로 가깝습니다.

일부 출력 예 :

→ ruby random-maze.rb 30 30
+----+-+-----------++-+----+
|    + |           ++ |    |
++  +  | ++ ++   +    + ++ ++
|  ++ ++ |  |    +---+  +   |
| +      | +| +   +++  +  + |
|   +   +| +| +-+  |   + +  |
|        +  +    + + ++  |+ |
| + ++ +  ++   + |  +   ++| |
| |  | ++  + +----+ + +-+ | |
| +  |  +-+  |+        |  | |
|   +-+  +| ++  ++ + + |  | |
| ++   +  + |  ++|   + | ++ |
|  + + + +  +---++-+   +++  |
| +  |  +| +    |  ++   |   |
| | +++ +| + ++ +--+  + |---+
|#+ | |  |   +++     +  +   |
++  | ++ +-+  ++ +--+  +  + |
|  ++  |    +     ++| +  ++ |
| ++   +--------+  +| + +   |
| |     |      +++  |  +  +-+
| |     | +--+  |++ |+ | ++
| |     |  +--+ | | || |  |
| |     +-+     +-+ |+ |+ |
| | +---+   ++      +  |  |
| +-|     +    +      ++ ++
|   +       ++   +---+   |
|              ++   +  +-+
|                 +   ++
+-+ +-------------+---+

1
좋은 생각. 수정하면 추가 포인트;)
Alexandru

이것은 단 하나의 할당에 대해 미로를 생성하는 데 사용하는 알고리즘에 대한 빠른 추출과 출력 변경입니다 . 실제 알고리즘은 주로 CHEVYRAY블로그 게시물 에서 도난 당했습니다 . 이번 주말에 그것을 고칠 수 있습니다. 출력 형식이 진정한 미로가 아니기 때문에 출력 형식이 완전히 작동하는지 확실하지 않지만, 잘 보이면서 가능한 한 가깝게 시도하겠습니다.
Nemo157

나에게 아주 좋은 미로 인 것 같습니다.
Alexandru

8

Python, 375 자

import random,sys
H,V=map(int,sys.argv[1:])
H-=1
V-=1
b,h,v,p=' -|+'
M=H/2*h
n=random.randint(1,(H/2)*(V/2-1))
for i in range(V/2):
 e=s=t='';N=v
 for j in range(H/2):
  if i and(random.randint(0,1)or j==0):s+=N+b;t+=v;N=v;M=M[1:]+p
  else:s+=M[0]+h;t+=b;N=p;M=M[1:]+h
  n-=1;t+=' #'[n==0]
 if H&1:s+=s[-1];t+=b;e=h
 print s+N+'\n'+t+v
if V&1:print t+v
print h.join(M)+e+h+p

이것은 하나의 입구와 무작위로 놓인 보물로 미로를 생성합니다. 미로는 단순한 이진 트리 미로 입니다.

$ ./maze.py 15 15
--------------+
              |
| | ----------+
| |           |
| +-----+ | --+
|       | |   |
| --+ --+ +---+
|   |   |     |
| --+-+ +---+ |
|     |     | |
| --+ +-+ --+ |
|   |   |   |#|
| | | --+ --+-+
| | |   |     |
+-+-+---+-----+

어쩌면 의도 된 것이지만 맨 위 줄 (벽 바로 아래)은 항상 긴 복도입니다.
Alexandru

예, 가장 왼쪽 열은 항상 긴 복도입니다. 이것은 내가 생성하는 미로 유형의 속성입니다.
Keith Randall

오. 미로는 그래도 아주 좋습니다 :).
Alexandru

6

루비 1.9.2p136 : 90

eval ARGV[0]
z=[l="+"+"-"*@w+"+"]
@h.times{z<<"|"+" "*@w+"|"}
z[rand(@h)+1]="|#"
puts z<<l

산출

$> ruby maze.rb "@h=8;@w=8;"

+------+
|      |
|      |
|      |
|      |
|#
|      |
+------+

이봐, 좋은 미로 라고 말한 사람은 없어 알았어 알았어 이제 진짜로 만들게


양호하지만 프로토콜 (명령 줄의 높이와 너비, 미로가 stdout에 인쇄 됨)을 준수하는지 확인하십시오.
Alexandru

실제로 그것은 stdout에 대해 아무 말도하지 않습니다 (누군가 stdout으로 인쇄하지 않는 언어를 사용하고 있기 때문에 합리적인 설명이 아닙니다). 이것을 투표하는 사람에게는 지정된대로 문제를 해결하므로 mazer가 미로를 미워하지 마십시오.

질문에 명시된 한 실제로는 아닙니다. meta.codegolf.stackexchange.com/questions/13/…를 참조하십시오 . 또한 JavaScript와 달리 Ruby는 표준 출력에 대한 인수 읽기 및 쓰기를 지원합니다. 귀하의 솔루션은 문제를 올바르게 해결 한 다른 사람들과 비교할 때 부정 행위입니다.
Alexandru

편집 할 수 없습니다. 나는 '불완전'이 아닌 '불완전'을 의미했다. 나는 미로의 아이디어를 좋아한다.
Alexandru

그런 다음 다른 언어는이를 호출하거나 #!/usr/bin/env python예를 들어 코드에 포함하는 데 필요한 코드를 포함 해야합니다. 내가 진짜 해결책을 쓸 것이라고 말했듯이, 이것은 질문 자체의 품질이 나쁘다는 것을 지적하고 더 나은 지침이 필요하다는 것을 보여줍니다. 마지막으로 질문을 가리 키더라도 질문에 대한 답변이 사이트의 실제 규칙이 아닙니다. 하지만 괜찮습니다. 여기 새 버전이 있습니다.

3

C 844

#include <stdlib.h>
#include <time.h>
h,w,*m,y,x,z;d(t,b,l,r){int i=b-t,j=r-l;if(i>1&&j>1){i=(rand()%--i)|1;j=(rand()%--j)|1;z=rand()%4;x=rand()%i+t;x|=1;for(y=t;y<i+t;y++)if(y!=x||!z)m[y*w+j+l]=124;x=rand()%(b-i-t)+i+t;x|=1;for(y=t+i;y<b+1;y++)if(y!=x||!(z-1))m[y*w+j+l]=124;y=rand()%j+l;y|=1;for(x=l;x<j+l;x++)if(y!=x||!(z-2))m[(i+t)*w+x]=45;y=rand()%(r-j-l)+j+l;y|=1;for(x=l+j;x<r+1;x++)if(y!=x||!(z-3))m[(i+t)*w+x]=45;m[(i+t)*w+j+l]=43;m[(t-1)*w+l+j]=43;m[(b+1)*w+j+l]=43;m[(i+t)*w+l-1]=43;m[(i+t)*w+r+1]=43;d(t,t+i-1,l,l+j-1);d(t+i+1,b,l,l+j-1);d(t,t+i-1,l+j+1,r);d(t+i+1,b,l+j+1,r);}}main(int c,char**v){h=atoi(v[1]),w=atoi(v[2]),m=calloc(h*w,4);srand(time(0));while(y<h){while(x<w){m[y*h+x]=(!y||y==h-1)?(!x||x==w-1)?43:45:(!x||x==w-1)?124:32;x++;}y++;x=0;}d(1,h-2,1,w-2);z=rand()%(w-2);z|=1;m[z]=32;z=rand()%(w-2);z|=1;m[h*(w-2)+z]=35;}

테스트하려면 :

#include <stdio.h>//beginning
for(y=0;y<h;y++){for(x=0;x<w;x++){putchar(m[y*h+x]);}putchar('\n');}getchar();//end

3x3

+ +
| # |
+-+

7x8

+-+--+
| |
+ +-+-+
| |
| +-+-+
| | # |
+-+-+-+

18x20

+-+-+ + --- + --- +-+-+
| | | | |
| + + +-+ --- + +-+
| | | |
+ + +-+ --- +-+-+-+
| | | |
+-+ +-+-+-+ --- +-+-+
| | | | | |
| + + + +-+--+ |
| | | | |
| | | +-+-+ ---- + |
| | | | |
+ + +-+-+-+--+-+
| | | | |
| + +-+-+--+ |
| | | | |
| | | | # | | |
+-+-+-+ --- + ----- +-+

이것은이다 코드 문제 가 아니라 코드 골프 . 거의 읽을 수없는 코드 인 이유는 무엇입니까?
Braden Best

-1. 이 코드는 난독 화 될뿐만 아니라이 코드를 컴파일하는 방법과 두 코드 블록을 구현하는 방법에 대한 명확한 지침이 없습니다. 완전히 누락되지 않은 경우 사용 지침이 희박합니다. 귀하의 답변은 코드 골프라는 것이 분명합니다. 그러나 질문 은 아닙니다 . 따라서 쉽게 복사 / 붙여 넣기 / 컴파일 할 수 있도록 코드를 읽을 수 있고 자체 포함해야하므로 다른 사람들이 코드의 작동 방식을 해독 할 필요없이 실제로 작동하는지 확인할 수 있습니다.
Braden Best

0

간단한 자바 솔루션은 다음과 같습니다.

import java.util.*;

public class MazeGen {
    public static void main(String[]a){
        int w,l;
        Random rand=new Random(System.currentTimeMillis()%1000+System.nanoTime());
        if(a.length==2){
            w=Integer.parseInt(a[0]);
            l=Integer.parseInt(a[1]);
        }else{
            System.out.println("No command line arguments, taking from STDIN.");
            Scanner input=new Scanner(System.in);
            w=input.nextInt();
            l=input.nextInt();
            input.close();
        }
        char[][]maze=new char[w][l];
        for(int x=0;x<w;x++){
            for(int y=0;y<l;y++){
                maze[x][y]=' ';
            }
        }
        for(int x=0;x<w;x++){
            maze[x][0]=maze[x][l-1]='|';
        }
        for(int y=0;y<l;y++){
            maze[0][y]=maze[w-1][y]='-';
        }
        maze[0][0]=maze[w-1][0]=maze[w-1][l-1]=maze[0][l-1]='+';
        int dor=1+rand.nextInt(l-2);
        maze[0][dor]=' ';
        int tx=2+rand.nextInt(w-3),ty=1+rand.nextInt(l-2);
        maze[tx][ty]='#';
        if(ty<dor-1){
            maze[tx][ty+1]='|';
            if(tx==w-2){
                maze[tx+1][ty+1]='+';
            }
            if(tx==1){
                maze[0][ty+1]='+';
            }
        }
        if(ty>dor+1){
            maze[tx][ty-1]='|';
            if(tx==w-2){
                maze[tx+1][ty-1]='+';
            }
            if(tx==1){
                maze[0][ty-1]='+';
            }
        }
        if(ty==dor&&tx>3&&(maze[tx][ty+1]==' '||maze[tx][ty-1]==' ')){
            maze[tx-1][ty]='-';
        }
        if(dor>5){
            int z=2+rand.nextInt(dor-3);
            int q=1+rand.nextInt(w-3);
            for(int i=0;i<w;i++){
                if(i==0||i==w-1){
                    maze[i][z]='+';
                }else if(i!=q&&maze[i][z]==' '){
                    maze[i][z]='|';
                }
            }

        }
        if(l-dor>5){
            int z=dor+2+rand.nextInt(l-dor-3);
            int q=1+rand.nextInt(w-3);
            for(int i=0;i<w;i++){
                if(i==0||i==w-1){
                    maze[i][z]='+';
                }else if(i!=q&&maze[i][z]==' '){
                    maze[i][z]='|';
                }
            }

        }
        for(char[]row:maze){
            System.out.println(row);
        }
    }
}

일부 샘플 결과 :

3x3 :

+ +
|#|
+-+

4x4 :

+ -+
| #|
|  |
+--+

4x5 :

+-+ +
|#| |
|   |
+---+

5x5 :

+ --+
|   |
|   |
| |#|
+-+-+

5x8 :

+ --+--+
|   |  |
|      |
| # |  |
+---+--+

8x15 :

+---- ----+---+
|         |   |
|         |   |
|         |   |
|             |
| #|      |   |
|         |   |
+---------+---+
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.