Perl,92 90 89 84字节
包括+1的 -n
给出STDIN的高度:
perl -M5.010 bolt.pl <<< 15
bolt.pl
:
#!/usr/bin/perl -n
map{$_=$;until$;=$_,s/.6|3.?/53|16*rand/eg,/3|6/>/36/;say y|3615|\\/ |r}(1x$_.6)x$_
说明
如果您将起始点的偏移量称为0(点位于字符框的拐角处),则在下一行中,您可以向左或向右(或不行)移动,并且可以在offsets上结束-1,1
。下一行给出-2,0,2
可能的偏移量等。它们的总和为2。如果您随后将字符称为点的左下角,而将字符称为右下角的奇数,则可以扩展为将每个字符位置分配为偶数或奇数以偶数和奇数交替的方式排列(实际上,整个平面以棋盘图案平铺)。偶数位置可以具有/
或
,奇数位置可以具有\
或
。
a之前的字符/
处于奇数位置,因此可以是\
或
,但\/
被禁止,因此只能
是可能。类似地,a后面的字符\
必须为a
(假设该行在左侧和右侧填充了足够的空格,因此该行的边界没有问题)。因此,闪电始终在a的正下方\
或a的正下方继续在下一行上继续/
。在任一情况下点是在中间和下一行可以具有一个
,/
,\
或/\
直接在顶部2个字符以下。因此,要生成下一行,我可以简单地替换任何\
或/
通过任何这些4个膨胀以相等的概率的(您也可以独立地通过替换的第一个字符
或/
与由第二字符
或\
)。在perl中,您可以使用以下方法执行此操作:
s#\\ | /#(" "," \\","/ ","/\\")[rand 4]#eg
如果结果行然而包含\/
(禁止连接)或没有/
或\
根本(螺栓模具和没有到达底部)的结果是无效的。在这种情况下,我将整个行扔掉,然后再试一次。一个有效的延续总是存在的,并且如果您尝试的次数足够多,将会发现一个延续(例如,除了1个流,其他所有事物都消失了)。这与建议的反重叠算法的概率分布略有不同,但我认为实际上更好,因为它没有方向偏差。有效性可以通过打高尔夫球的方式使用
m#\\|/#>m#\\/#
这里的问题是随机替换是如此繁琐,所有这些\
转义也占用了字节。因此,我决定使用数字字符串来构建行
,/
并\
在打印之前用替换相应的数字。基本的随机替换是
53|16*rand
这给之一53
,55
,61
或63
以相等的概率。然后我解释5
,并1
作为
,3
作为\
和6
作为/
。那解释了行打印:
say y|3615|\\/ |r
在一场严肃的高尔夫比赛中,我现在将开始系统地探索替代的魔术公式,但这应该是相当不错的(在3个字节以内)
该程序的其余部分:
1x$_.6
这将初始化$_
(请参见下一张地图)为高度空间,然后是/
。这是第一个要打印的上方的不可见行,并确保该字段足够宽,以使螺栓永远不会耗尽左侧的空间
map{ ... ; say ...}(1x$_.6)x$_
我将处理相同的初始字符串高度,每次打印新行
$_=$;until$;=$_,...
将当前行保存在中$;
。如果替换结果无效,请$_
从$;
s/.6|3.?/53|16*rand/eg
进行实际替换。我不必检查前后是什么/
,\
因为它必须是一个空格。这很方便,因为空间可以用1
或表示5
。由于我只将字符串填充到了左边\
,所以仍然缺少空格,因此请将该字符设置为可选
/3|6/>/36/
检查新行是否有效
Stay safe and have fun golfing!
也许还指定如果EAS罢工,放弃一切并遵守命令!在这种情况下,打高尔夫球不是您的优先事项。