Eğik Çizgilerle Rastgele Bir Yürüyüş Çiz


14

Pozitif bir tamsayı N alan (stdin / komut satırı / fonksiyon arg üzerinden) ve eğik çizgilerden çıkarılan N adım uzunluğunda iki boyutlu rasgele bir yürüyüşün dize ile temsilini basan veya döndüren bir program veya işlev yazın : / \(artı boşluklar ve boşluk satırları).

2D rastgele bir yürüyüş sonsuz bir tamsayı kafesinin başlangıcında başlar . Daha sonra tekrar tekrar N kez, rastgele bir şekilde bir kardinal yön (yukarı, aşağı, sol, sağ) seçilir ve yürüteç bir yönde bu yönde hareket eder. Ortaya çıkan yol rastgele yürüyüştür.

Burada N = 6 için rastgele bir yürüyüş var.

N = 6 rasgele yürüme örneği

Bunu eğik çizgilerle çizmek için, temelde her şeyi saat yönünde 45 ° döndürmemiz gerekir. Eksenler, başlangıç ​​ve bitiş noktaları eğik çizgi versiyonunda çizilmez.

/
\
 \
 /\

Bunun gibi daha karmaşık bir yürüyüş (N = 20, söylemenin bir yolu yok):

N = 20 rastgele yürüyüş örneği

Bu olur:

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

Programınızın bu tür rastgele yürüyüşlerin eğik çizgi sürümlerini oluşturması gerekir. Sen gerekir belli N için programın her koşu neredeyse kesinlikle farklı bir yürüyüş üretecek böylece rastgele yürüyüş alır her yeni bir yön seçin. (Yalancılık iyidir.)

Asla en düşük ve en yüksek eğik çizgilerin üstünde veya altında boş satırlar olmamalıdır (isteğe bağlı bir son satırsonu hariç) ve asla en soldaki ve en sağdaki eğik çizgilerden önce veya sonra boş sütunlar olmamalıdır.

Yani N = 1 için, çıktı her zaman /ya da \, ama asla şöyle bir şey değildir:

   
 / 

Sondaki boşluklara, en sağdaki eğik çizginin sütununu geçmedikleri sürece izin verilir.

En az bayt içeren gönderim kazanır. İşte kullanışlı bir bayt sayacı.


bu yüzden (nadir de olsa) N = 20?
DaveAlger

2
@DaveAlger Tabii. Programınız çok şey yaparsa bir şeylerin çok yanlış olmasını beklerim.
Calvin'in Hobileri

Yanıtlar:


3

Pyth, 74 bayt

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

Uri Zarfaty'nin cevabının daha da optimize edilmiş bir çevirisi.


1
Daha iyi bir Pyth çözümüm var: "\ - elbette, rastgelelik yok, ama her seferinde geçerli bir yürüyüş!
theonlygusti

@theonlygusti O zaman daha iyi bir çözümüm var: \\.
orlp


@theonlygusti Pyth'teki ters eğik çizgi 1 karakter sabiti başlatır. Oh bekle, boşver, daha kısa değil xD
orlp

5

Python 2, 300 285 257 246 236 bayt

Bir şeyleri başlatacak bir şey. Bunu daha da küçültmek mümkün olmalıdır. @Maltysen 10 bayt tıraş için teşekkürler.

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

Yürüme çıktısını, ziyaret edilen (x, y) tuples'ların G sözlüğüne üretir ve konumumuzu güncelleriz. Her rastgele adım n hem u / d (u) hem de l / r (l) 'dir.



1
Sen bir çok kaydedebilirsiniz "".joinde j in f(1)loop ve doğrudan baskı.
Maltysen

1

PHP 5.5-209 bayt

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

Ungolfed:

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

Sıfırdan bir PHP cevabı üzerinde çalışmaya başladı, ancak son kod çok fazla @Uri Zarfaty'nin çalışmasına benziyordu, bu yüzden gerçekten göndermek için sinir yoktu. Söz konusu cevabı bunun yerine birkaç değişiklikle taşıdı. Çıkış döngüsünde min / maks değerini belirlemek için x / y değerlerini $Xve $Ydizileri iter .

Kullanımı:

php golf.php 200

1

Pyth - 89

Bu temelde Uri Zarfaty'nin cevabı üzerine bir çeviri, ancak bazı optimizasyonlar yaptım.

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

Açıklama çok yakında.

Burada deneyin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.