スラッシュでランダムウォークを描く


14

(STDIN /コマンドライン/関数引数を介して)N整数正にかかるプログラムまたは機能を記述し、プリント又は戻る二次元の文字列表現ランダムウォーク Nが長いステップされ、スラッシュから引き出さ:/ \(プラススペースと間隔の改行)。

2Dランダムウォークは、無限整数格子の原点から始まります。その後、N回繰り返し、基本方向(上、下、左、右)がランダムに均一に選択され、歩行者はその方向に1ユニット移動します。結果として得られるパスは、ランダムウォークです。

N = 6のランダムウォークを次に示します。(-1、3)に達すると、それ自体をトラバースします。

N = 6ランダムウォークの例

これをスラッシュで描くには、基本的に全体を時計回りに45°回転させる必要があります。スラッシュバージョンでは、軸と開始点と終了点は描画されません。

/
\
 \
 /\

このようなより複雑なウォーク(N = 20、ただし伝える方法はありません):

N = 20のランダムウォークの例

これになります:

     /
/\/ /\
\/\/
/\/
\/

プログラムは、これらのタイプのランダムウォークのスラッシュバージョンを生成する必要があります。ウォークが進むそれぞれの新しい方向をランダムに選択する必要があるため、特定のNのプログラムを実行するたびに、ほぼ確実に異なるウォークが生成されます。(疑似ランダム性は問題ありません。)

最低および最高のスラッシュの上下に空行が存在することはありません(オプションの末尾の改行を除く)。また、左端および右端のスラッシュの前後にスペースの空の列があってはなりません。

したがって、N = 1の場合、出力は常に/or \ですが、次のようなことはありません。

   
 / 

末尾のスペースは、右端のスラッシュの列を超えない限り許可されます。

最少バイトの送信が勝ちです。これは便利なバイトカウンターです。


そのため、N = 20の場合でも、出力が単一のスラッシュになる可能性はあります(ただし、まれですが)。
-DaveAlger

2
@DaveAlger確かに。あなたのプログラムがそれをたくさんやるなら、私は何かが非常に間違っていると思うでしょう。
カルビンの趣味

回答:


3

Pyth、74バイト

K0VQJO2=GO2 XH,-ZJ-KG@"\/"xJG-=ZtyJ-=KtyG;=YmrhSdheSdCHjbclhYsmh@XkH\ k.xY

Uri Zarfatyの答えのさらに最適化された翻訳。


1
より良いPythソリューションがあります:"\ -もちろん、ランダム性はありませんが、毎回有効な散歩です!
-theonlygusti

@theonlygustiそれから私はこれまで以上に良い解決策を持っています:\\。
-orlp

それを取得しないでください
...-theonlygusti

Pythの@theonlygustiバックスラッシュは、1文字の定数で始まります。ああ、ちょっと待ってください、短いxD
orlp

5

Python 2、 300 285 257 246 236バイト

物事を開始する何か。これをさらに小さくすることは可能です。@Maltysenに10バイトのシェービングをありがとう。

from random import*
N=input()
x=y=0;G={}
exec'n=randrange(4);l=n<2;u=n&1;G[(x-l,y-u)]="\\/"[l^u];x-=2*l-1;y-=2*u-1;'*N
f=lambda i:range(min(x[i]for x in G),max(x[i]for x in G)+1)
for i in f(0):print"".join(G.get((i,j)," ")for j in f(1))

訪問した(x、y)タプルのディクショナリGにウォーク出力を生成し、移動すると位置を更新します。各ランダムステップnは、u / d(u)とl / r(l)の両方です。



1
あなたが大幅に節約することができます"".joinj in f(1)ループして直接印刷します。
マルティセン

1

PHP 5.5-209バイト

<?for(;$X[]=$x+=1-2*$l,$Y[]=$y+=1-2*$u,$i++<$argv[1];){$m[$y-$u=$n&1][$x-$l=($n=rand(0,3))<2]='\\/'[$u^$l];}for($y=min($Y);$y<max($Y);$y++){for($x=min($X);$x<max($X);$x++)$s.=$m[$y][$x]?:' ';$s.="\n";}echo$s;

ゴルフをしていない:

<?
for (; $X[] = $x += 1 - 2 * $l, $Y[] = $y += 1 - 2 * $u, $i++ < $argv[1];) {
    $m[$y - $u = $n & 1][$x - $l = ($n = rand(0, 3)) < 2] = '\\/'[$u ^ $l];
}
for ($y = min($Y); $y < max($Y); $y++) {
    for ($x = min($X); $x < max($X); $x++) {
        $s .= $m[$y][$x] ? : ' ';
    }
    $s .= "\n";
}
echo $s;

PHPの回答をゼロから作成し始めましたが、最終的なコードは@Uri Zarfatyの作業にあまりにも似ていたため、投稿する気にはなりませんでした。代わりにいくつかの修正を加えて、答えを移植しました。プッシュX / Yに値$X及び$Y出力ループにおける最小/最大を決定するためのアレイ。

使用法:

php golf.php 200

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