迷路生成[終了]


41

これに似た(古い)スレッドがあることは知っていますが(ここ)、いくつかの修正を加えて再起動したいと思います。

目標は、選択したアルゴリズムを使用してランダムに見える迷路を生成し、その迷路をグラフィカルに出力することです(印刷カウント)。

  • 幅と高さはユーザーが決定します。
  • 少なくとも1つの入口から少なくとも1つの出口まで少なくとも1つのパスが必要です。
  • 迷路の形式(どのように表示するか、入り口または出口をマークする方法)もあなた次第です。
  • きれいなほど良い。
  • 些細な迷路(たとえば、空の迷路、格子迷路、サイズ1x1の迷路)は推奨されません。
  • 結果が合理的である場合、迷路のサイクルが許可され、奨励されます。
  • 言語の乱用を奨励しました。
  • 迷路は適度にランダムに見えるはずです(ただし、これを生成する完全に決定論的な(カオスなど)アルゴリズムでも問題ありません)。

編集:ここでの主な焦点は、可能な限り最小の実装を作成することです。ただし、その制約内である程度の余裕を持たせて、光沢を促進したいと思います。私は迷路の「機能」を無制限に意図的に正確に残しましたが、大まかなガイドラインとして、最も少ない量の語彙に最大の強打を詰め込むようにしてください。


4
また、「きれいな方が良い」ということは、コードゴルフの課題にはほとんど具体的(または単に無関係)に思えます。あなたがきれいな結果に興味があるなら、多分人気コンテストがより良い選択でしょう。
マーティンエンダー14

5
それは本当にコードゴルフですか、それともむしろ人気コンテストですか?
l0b0 14

2
別の提案として、短いコードときちんとした迷路の両方を奨励したい場合、それをコードチャレンジにして、コードの長さとアップボットの混合であるスコアによって勝者が選択されることを宣言することができます-それは投稿に現在の賛成票の数を含めることは少し役に立たないため、各回答の合計スコアを決定するのはあなた次第です。
マーティンエンダー14

3
2番目の箇条書きを評価できるように、各答えは各迷路の入り口と出口を構成するもの(および壁と通路)を説明する必要があると思います。
LarsH 14

2
@Geobitsあまり気にしませんが、コードの長さと投票数から得点を組み合わせて実際にコードチャレンジにするという私の提案です。これは、OPが望んでいることを正確に促進します。興味深い迷路の短いコードです。
マーティンエンダー14

回答:


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文字の端末が必要)入口から出口までの1つの保証されたパスで、比較的ランダムな31x31迷路を生成します。

出力例(シミュレートされた65文字の端末を使用):

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

2
あなたも必要ありませんint p,int cp,c十分...である
chubakueno

ああ、それを指摘してくれてありがとう
デンドロビウム14

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

未ゴルフと出力例:

ここに画像の説明を入力してください

もちろん、線は壁です。あなたは中心で始まり、外に出る必要があるミノタウロスです。


4
これはきれいで、コードは短いですが、スペクトルの「些細な迷路」の終わりに向かっていると言えます。
LarsH

2
あなたはそれを大きくしてもささいなことは変わらないのは正しい。ポイントは、この迷路を解決することは線形プロセスであるということです。どの分岐点でも、より深い枝に「再帰」することなく、間違った方向に進んだかどうかをすぐに見つけることができます。一方、イアンとアレフの答えは「本当の」迷路です。それらはこの直線的な方法で解決することはできません。些細な迷路は落胆しているので、私はこれに反対票を投じたいと思うでしょうが、十分な担当者がいません。
LarsH 14

1
@LarsHうん、それに同意します。だからこそ、私はそれが最も「効果的な」迷路を描くのではなく、最も「効率的な」方法だと言ったのです。;)それでも、それは単純かもしれませんが、「空白」や「1x1」のような除外されたもののカテゴリーに入るとは思いません。もちろん、この提出物をその単純さのために失格にするのはOPの裁量にありますが、彼がそれをしないか、チャレンジのタイプを変更する限り、私はそれをより複雑/興味深いものにするインセンティブを見ません。
マーティンエンダー14

1
@LarsHと言われていますが、それが彼らのアルゴリズムによるものなのか、それとも彼らが投稿した特定の例の機能によるものなのかはわかりませんが、どちらの答えも深さ「1」を超えるバックトラックを何度も必要としませんでした。したがって、それらには多くの複雑さが含まれていますが、いずれにしても関係のないパスに含まれています。
マーティンエンダー14

1
私の意見では、この迷路は簡単だとはいえ、簡単ではありません(そして、下の私の円形迷路はもっと簡単です)。私は本当にblank-canvas / size-1 / etcを防ぎたかっただけです。「迷路」。
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 to the rescue!画像
天井ヤモリ14

6
私の意図は、パスをパイプの内側にすることでした(ここのように)ことに注意してください。
imallett

1
@IanMallett Ceiling Geckoはそのことを知っていたと思いますが、左壁に色を塗りつぶすと、出口を見つけるまで左壁に沿って(最適ではない)パスが続きます。;)
マーティンエンダー14

1
時間があれば、このコードのゴルフのないバージョンを見ることに興味があります。
LarsH 14

4
これを書いている間、あなたは迷路コーダーでした。
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]

迷路2


7
いい迷路…でも、出口に繋がっている入り口が見えない…?
bwoebi 14

9
アイデアは、ランダムノード(たとえば、左上)を入口として選択し、別のノード(右下)を出口として選択することだと思います。Mathematicaはすべてのノードが他のすべてのノードに接続されていることを確認しますが、特に2番目の迷路では、それらがどのように接続されているかを見つけるのは難しい部分です。
EagleV_Attnam 14

線(グラフの端)は迷路の壁、または通路ですか?私は知っていたと思っていましたが、今はわかりません。
LarsH

@LarsHパッセージです。
alephalpha

1
@LarsHグラフは接続されているので、2つの任意のノード、1つを入口、もう1つを出口として使用できます。
alephalpha

13

バッシュ、53バイト

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

C64コードと同様のアイデア。Unicodeをサポートする端末ではより見栄えが良いため、Unicode文字をスラッシュとして使用します。OS X端末でのサンプル出力(Menloフォント):

サンプル迷路出力


2
私は一度、このアウトを考え出し:yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bash。参照このポスト
gniourf_gniourf

5
これは、何年も前に解けることを保証できないアルゴリズムに基づいています
イサイアメドウズ14

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>


わからない...明るい部分と暗い部分が迷路なのか?暗い場合、大きなループがあり、出入りポイントとして任意のポイントを選択するときに外側にとどまることができます。ライトの場合、出口/エントリを追加する必要があります。
パエロエベルマン

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
うん、生意気。^^そこの始まりと終わりは何ですか?スラッシュはパスですか、それとも壁ですか?そして、私が通過できる最小ギャップサイズは何ですか?
マーティンエンダー

2
「少なくとも1つの入口から少なくとも1つの出口まで少なくとも1つのパスが必要です。」この基準が満たされているという兆候は見られません。ランダムな壁は必ずしも迷路を作成しません。
LarsH 14

1
@ m.buettner:スラッシュは壁であり、行と列の間にスペースがないように視覚化することになっていると推測しています。したがって、左下の2x2文字は完全に閉じた菱形(正方形)の形状を形成します。
LarsH 14

@LarsHそうそう思った。これは、OPの質問で、人々が開始と終了が何であるかを示す必要があるという別のポイントを示しています。また、このスキームではジャンクションも許可されていません。これらの閉じた正方形または蛇行したパス(閉じたループである場合もあります)のみを持つことができます。
マーティンエンダー14

グラフィックの改善とルートの表示に+1。非常に多くの潜在的な入り口と出口を考えると、「少なくとも1つの入り口から少なくとも1つの出口への少なくとも1つのパス」を持つ可能性はかなり高いと思います。
LarsH 14

8

BBC BASIC、18バイト

@nneonneoによる23バイトのC64無限ループバージョンの長さの改善。VDUは1つの文字をVDUコントローラーに送信します:2 + 1 * 45 = ASCII 47 /または2 + 2 * 45 = ASCII 92\

  VDU2+RND(2)*45:RUN

BBC BASIC、35バイト/ 107 95バイト

35バイトは最後の行のためだけのもので、40列のレイアウトで25行の迷路を与えます。MODE1は、行間に余分なスペースが残らないようにします。プログラムの残りの部分はオプションであり、フォーマットを改善します。VDU23ステートメントは、文字47および92のフォントを再定義します(8バイトが8x8ビットマップを形成します)。これの副作用は、空のダイヤモンドにドットが表示されることです。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

このプログラムを編集するには、次のように、8ビットVDUコードの一部を16ビットスモールエンディアン値(カンマではなくセミコロンで表す)にエンコードし、MODEステートメントをVDUコードのペアとして表すことにより、95バイトに短縮できます。 。

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

出力

bbcbasic.co.ukからBBC Basic for Windowsを使用する

最終行のみ、35バイト

ここに画像の説明を入力してください

プログラム全体、107 95バイト

@Brianの答えについてコメントしたように、スラッシュは正方形を2つの暗い三角形に分割します。それぞれの三角形にはそれぞれ2つの入り口/出口があります。これにより、迷路の端にある任意のポイントから迷路の端にある他のポイントへの(簡単な、分岐していない)パスが保証されます。これらの多くは非常に短いですが、常にいくつかの長いものがあるようです。もちろん、迷路の真ん中にはいくつかのループもあります。

他の回答では言及されていないので、明るい領域をよく見てみたいと思います。これらは暗い領域に囲まれているため、上記の説明の結果として、N個の暗い領域に外部的に囲まれた明るい領域は、N個の(正確に同じ数の)ポイントでフィールドの端に接触します。したがって、かなり大きな明るい領域がいくつか発生し、これらは興味深い分岐迷路を形成します。

以下の例では、私のプログラムからの生の出力(モノクロ)を見ることができます。その下(Windowsペイントを使用)では、最も長い2つの暗い領域を青で色付けしています。次に、最大の明るい領域を黄色で色付けし、2つの領域を青で囲まれた赤と緑で色付けしました。黄色、緑(さらには赤)の迷路は、非常に興味深く、自明ではありません。

ここに画像の説明を入力してください

編集-迷路の自動選択と開始/終了の選択

もう1行(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文字の端末):ここに画像の説明を入力してください

私はこれが非常に難しい迷路ではないことを残念に思います(実際、内輪へのバックトラックは必要ありません(そして、境界線から中心へのパスを簡単に見つけることができるはずです)。)コアの描画アルゴリズム。


通過できる場所とできない場所を確認するのは少し難しいです。私は言わなければならない、私はパイプを好んだ;)(これと私の循環提出の両方に)。
マーティンエンダー14

@ m.buettner:私は実際に同意します。i+=2to を変更するとi+=3、何が起こっているかがより明確になる可能性があります。
イマレット14

6

私は私の子供がこれを行うのを助け、少しプログラミングを学びました:http : //jsfiddle.net/fs2000/4KLUC/34/ どのようにそれが好きですか?


17
コードを投稿に合わせることができる場合は、それを行います。また、#Language(s)-Bytecountのようなヘッダーを含めます。コードでASCII文字のみを使用した場合は、ここで素敵なバイト数を取得できます。あなたのコードが何をしているのかの概要、あなたが持っていたかもしれない洞察、あるいはあなたがしたどんな賢いこともあなたの投稿への素晴らしい追加かもしれません。ところで、ダースベイダーは、いくつかの線を見るのを非常に難しくしています。最後に、Code Golfへようこそ!
レインボルト14

あなたは子供たちと少しプログラミングを学び、私は少しゴルフを学びました。これは私の最初のゴルフであり、結果はまだかなり長いです。バイト数:オリジナル:55 + 6822 = 6877。 少し再編成:39 + 3131 = 3170 ゴルフ: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ビデオで出力を確認できます。ここにスクリーンキャップがあります:

YouTubeスクリーンキャップ

ここで、このStackOverflowの質問は、この迷路の生成プログラムの複数の実装です。プログラムの最短の実装は、その質問の著者によって投稿された次の23バイトのC64 BASICプログラムです。

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

小文字はそのまま入力し、大文字はShiftキーを使用して入力します(実際のC64画面では、これらの外観が異なります)。


これはまったく同じブライアンの提出ではありませんか?(少し短くなります)そして、あなたのBashの答えは?ここでの質問も同様です、ジャンクションのない迷路はまだ迷路ですか?
マーティンエンダー14

nneonneo、この素晴らしいアイデアの適切かつ正直な帰属に対して+1。@ m.buettner指摘されているように、印刷されていない領域は分岐していない迷路を生成します。しかし(そして、誰もまだこれを示していないことに驚いています)印刷された領域は、いくつかの興味深い、自明ではない、分岐した迷路を形成します(私の答えを参照してください)。 。これらの斜めの迷路で開始と終了を定義するのは簡単ではありません。
レベルリバーセント14

@ m.buettner 1. x86バイナリは最小でも10バイトです。2.これは洗練されたアルゴリズムであり、まったくオリジナルではなく、解ける迷路を作成することも意図していませんでした。
イサイアメドウズ14

5

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

基本的に、各長方形を壁(および通路)で2つに分割し、次にそれらを2つに分割します。これにより、すべてのポイントから他のすべてのポイントへのパスを持つ「完全な」迷路を生成します。行き止まりがたくさんあるので、大きな迷路ではどんな意味でも「些細」ではありません。

したがって、入口と出口は任意に決定できます。いずれかを選択する必要がある場合は、上/左および下/右と言うだけです。

ダブル幅の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 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
いいえ、実際には開始と終了(右下で開始、左上で終了)を入れ替える必要があります。ルールがあるため、最後までたどり着くには常に下に行かなければならないからです。
マーティンエンダー

1
たとえ開始と終了が逆になっても、迷路には正しいパスが上下にしか移動しないという(おそらく興味深い)プロパティがあります。ただし、2つの方法のいずれかを使用できるポイントがたくさんあるため、迷路はもう簡単ではありません。
ケビン-復帰モニカ14

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:into the woodsに触発されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.