Намалюйте випадкову прогулянку з косою рисою


14

Напишіть програму або функцію, яка приймає додатне ціле число N (через stdin / командний рядок / функцію arg) і друкує або повертає рядкове зображення двовимірного випадкового ходу довжиною N кроків, виведених з косих рядків : / \(плюс пробіли та нові рядки для інтервалу).

2D-випадкова хода починається від початку нескінченної цілої решітки . Потім N разів повторно кардинальний напрямок (вгору, вниз, вліво, вправо) вибирається рівномірно рівномірно, і ходок рухається однією одиницею в тому напрямку. Отриманий шлях - випадкова прогулянка.

Ось випадкова прогулянка для N = 6. Зауважте, що вона рухається назад, коли досягає (-1, 3).

N = 6 приклад випадкової прогулянки

Для того, щоб намалювати це за допомогою нахилів, нам потрібно повернути всю річ на 45 ° за годинниковою стрілкою. Осі, початкова та кінцева точки не накреслені у косому варіанті.

/
\
 \
 /\

Більш складна прогулянка на зразок цієї (N = 20, хоча немає можливості сказати):

N = 20 приклад випадкової прогулянки

Це стане таким:

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

Вашій програмі необхідно генерувати такі типи косої версії випадкових прогулянок. Ви повинні випадковим чином вибрати кожен новий напрямок, яким рухається прогулянка, тому кожне виконання програми для певного N майже напевно призведе до різної прогулянки. (Псевдовипадковість прекрасна.)

Ніколи не повинно бути порожніх рядків над або під найнижчою та найвищою косою рисою (за винятком однієї необов’язкової кінцевої нової лінії), і ніколи не повинно бути порожніх стовпців пробілів до або після нахилу лівого та правого кута.

Отже, для N = 1 вихід завжди /або \, але ніколи не такий, як:

   
 / 

Пробіли дозволені до тих пір, поки вони не проходять повз стовпця правої косої риси.

Виграє подання з найменшими байтами. Ось зручний байт-лічильник.


тож можливо (хоча і рідко), що вихід може бути однією косою рискою, навіть коли N = 20?
DaveAlger

2
@DaveAlger Звичайно. Хоча якщо ваша програма робить це багато, я очікував, що щось дуже не так.
Захоплення Кальвіна

Відповіді:


3

Pyth, 74 байти

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

Ще більш оптимізований переклад відповіді Урі Зарфаті.


1
У мене є краще рішення Pyth: "\ - звичайно, випадковості немає, але це дійсна прогулянка щоразу!
theonlygusti

@theonlygusti Тоді у мене все краще рішення: \\.
orlp

Не зрозумійте ...
theonlygusti,

@theonlygusti Backslash в Pyth запускає константу 1 символу. О, зачекайте, ніколи, не коротше xD
orlp

5

Пітон 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))

Створює вихідний похід у словник G відвіданих (x, y) кортежів, оновлюючи наше місце розташування під час поїздки. Кожен випадковий крок n є і u / d (u), і l / r (l).



1
Ви можете значно заощадити "".joinна j 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

1

Піт - 89

Це в основному переклад на відповідь Урі Зарфаті, хоча я зробив деякі оптимізації.

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

Пояснення найближчим часом.

Спробуйте тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.