Draw a Random Walk dengan Slash

14

Tulis program atau fungsi yang mengambil dalam bilangan bulat positif N (melalui stdin / command line / function arg) dan mencetak atau mengembalikan representasi string dari jalan acak dua dimensi yang merupakan N langkah panjang, ditarik dari garis miring: / \(ditambah spasi dan baris baru untuk spasi).

Berjalan acak 2D dimulai pada asal kisi integer tak terbatas . Kemudian N kali berulang kali, arah mata angin (atas, bawah, kiri, kanan) dipilih secara seragam secara acak dan alat bantu jalan menggerakkan satu unit ke arah itu. Jalur yang dihasilkan adalah jalan acak.

Ini adalah jalan acak untuk N = 6. Perhatikan bahwa itu berjalan kembali dengan sendirinya ketika mencapai (-1, 3).

N = 6 contoh jalan acak

Untuk menggambar ini dengan garis miring, pada dasarnya kita perlu memutar seluruh benda 45 ° searah jarum jam. Sumbu dan titik awal dan akhir tidak digambar dalam versi garis miring.

/
\
 \
 /\

Jalan yang lebih kompleks seperti ini (N = 20, meskipun tidak ada cara untuk mengatakannya):

N = 20 contoh jalan acak

Akan menjadi ini:

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

Program Anda perlu membuat versi slash dari jalan acak ini. Anda harus secara acak memilih setiap arah jalan yang baru ditempuh, sehingga setiap menjalankan program untuk N tertentu hampir pasti akan menghasilkan jalan yang berbeda. (Pseudorandomness baik-baik saja.)

Seharusnya tidak pernah ada garis kosong di atas atau di bawah garis miring terendah dan tertinggi (kecuali untuk satu baris tambahan opsional), dan seharusnya tidak pernah ada kolom ruang kosong sebelum atau setelah garis miring paling kiri dan paling kanan.

Jadi untuk N = 1, output selalu /atau \, tetapi tidak pernah seperti ini:

   
 / 

Ruang trailing dibolehkan selama tidak melewati kolom tebasan paling kanan.

Kiriman dengan byte paling sedikit menang. Inilah penghitung byte yang berguna.

Hobi Calvin
sumber
jadi mungkin (walaupun jarang) bahwa output bisa menjadi garis miring bahkan ketika N = 20?
DaveAlger
2
@DaveAlger Sure. Meskipun jika program Anda banyak melakukan itu, saya berharap ada sesuatu yang sangat salah.
Hobi Calvin

Jawaban:

3

Pyth, 74 byte

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

Terjemahan jawaban Uri Zarfaty yang lebih optimal.

orlp
sumber
1
Saya punya solusi Pyth yang lebih baik: "\ - tentu saja, tidak ada keacakan, tapi ini jalan yang valid setiap waktu!
theonlygusti
@ theonlygusti Maka saya punya solusi yang lebih baik: \\.
orlp
Jangan
paham
@theonlygusti Backslash di Pyth memulai konstanta 1 karakter. Oh, tunggu, tidak masalah, xD tidak lebih pendek
orlp
5

Python 2, 300 285 257 246 236 byte

Sesuatu untuk memulai sesuatu. Seharusnya mungkin untuk mengecilkan ini lebih jauh. Terima kasih @Maltysen untuk mencukur 10 byte.

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))

Buat output jalan ke kamus G dari tupel yang dikunjungi (x, y), memperbarui lokasi kami saat kami pergi. Setiap langkah acak n adalah u / d (u) dan l / r (l).

Uri Granta
sumber
3
Rapi. N = 100000, ukuran font 1.
Calvin's Hobbies
1
Anda dapat menyimpan banyak dengan "".joindi j in f(1)loop dan mencetak langsung.
Maltysen
1

PHP 5.5 - 209 byte

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

Tidak Disatukan:

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

Mulai mengerjakan jawaban PHP dari awal, tetapi kode terakhir terlalu mirip dengan karya @Uri Zarfaty jadi saya benar-benar tidak punya keberanian untuk mempostingnya. Akhirnya porting menjawab kata dengan beberapa modifikasi sebagai gantinya. Dorong nilai x / y ke dalam $Xdan $Ylarik untuk menentukan min / maks dalam loop keluaran.

Pemakaian:

php golf.php 200
mhall
sumber
1

Pyth - 89

Ini pada dasarnya adalah terjemahan dari jawaban Uri Zarfaty, meskipun saya memang membuat beberapa optimasi.

KZVQJO4=G<J2=b.&J1 XH,-KG-Zb@"\\/".|Gb-=KtyG-=Ztyb)LrhSm@dbHheSm@kbHFNy0jkm?@H,Nb},NbHdy1

Penjelasan segera hadir.

Coba di sini .

Maltysen
sumber