Нарисуйте случайную прогулку со слешами

14

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

Двумерное случайное блуждание начинается в начале бесконечной целочисленной решетки . Затем 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

Еще более оптимизированный перевод ответа Ури Зарфати.

orlp
источник
1
У меня есть лучшее решение Pyth: "\ - конечно, здесь нет случайности, но это правильная прогулка каждый раз!
theonlygusti
@theonlygusti Тогда у меня есть лучшее решение: \\.
Орл
Не понимаю ...
theonlygusti
Обратная косая черта @theonlygusti в Pyth начинается с 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))

Генерирует выходные данные прогулки в словарь G посещенных (x, y) кортежей, обновляя наше местоположение по мере продвижения. Каждый случайный шаг n является либо u / d (u), либо l / r (l).

Ури Гранта
источник
3
Ухоженная. N = 100000, размер шрифта 1.
Увлечения Кэлвина
1
Вы можете сэкономить много с "".joinпомощью j in f(1)цикла и печати напрямую.
Maltysen
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;

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;

Начал работать над PHP-ответом с нуля, но окончательный код слишком напоминал работу @Uri Zarfaty, поэтому у меня действительно не хватило смелости его опубликовать. Закончилось портирование указанного ответа с несколькими модификациями вместо этого. Выталкивает X / Y значения в $Xи $Yмассивы для определения мин / макс в выходном контуре.

Использование:

php golf.php 200
mhall
источник
1

Пиф - 89

Это в основном перевод ответа Ури Зарфати, хотя я и сделал некоторые оптимизации.

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

Объяснение скоро.

Попробуй это здесь .

Maltysen
источник