用斜线绘制随机游走


14

编写一个程序或函数,该程序或函数采用正整数N(通过stdin /命令行/函数arg)并打印或返回由N个长步长(由斜杠引出)的二维随机游走的字符串表示形式:(/ \加上空格和换行符)。

2D随机游动从无限整数晶格的原点开始。然后,重复N次,随机地均匀选择基本方向(上,下,左,右),并且助行器在该方向上移动一个单位。采取的最终路径是随机游走。

这是N = 6时的随机游走。请注意,到达(-1,3)时,它会向后移动。

N = 6个随机游动示例

为了用斜线画出它,我们实际上需要将整个对象顺时针旋转45°。斜线版本中未绘制轴以及起点和终点。

/
\
 \
 /\

像这样的更复杂的步行(N = 20,尽管无法分辨):

N = 20个随机游动示例

会变成这样:

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

您的程序需要生成这些类型的斜杠版本的随机游走。您必须随机选择步行要走的每个新方向,因此程序每次运行一定的N几乎肯定会产生不同的步行。(伪随机性很好。)

最低和最高斜杠上方或下方不得有任何空行(除了一个可选的尾随换行符),并且最左边和最右边的斜杠之前或之后绝对不应有空格的空列。

因此,对于N = 1,输出始终为/\,但永远不会像这样:

   
 / 

只要不超过最右斜杠的列,就可以使用尾随空格。

字节最少的提交将获胜。这是一个方便的字节计数器。


因此即使N = 20,输出还是可能是一个斜线(尽管很少)?
DaveAlger 2015年

2
@DaveAlger当然。虽然如果您的程序做了很多事情,我希望有些事情是非常错误的。
加尔文的业余爱好

Answers:


3

Pyth,74个字节

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

Uri Zarfaty的答案的最佳翻译版本。


1
我有一个更好的Pyth解决方案:"\ -当然,没有随机性,但是每次都是有效的步行!
theonlygusti 2015年

@theonlygusti然后我有一个更好的解决方案:\\。
orlp 2015年

没明白...
–onlygusti 2015年

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)循环中节省很多并直接打印。
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;

取消高尔夫:

<?
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值推入$Xand $Y数组以确定输出循环中的最小/最大。

用法:

php golf.php 200

1

柏斯-89

这基本上是Uri Zarfaty答案的翻译,尽管我确实做了一些优化。

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

解释即将推出。

在这里尝试

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.