向人们介绍离散概率分布概念的经典示例是bean机器。这台机器有大量的大理石从顶部狭窄的通道掉落,然后它们撞到交错的销钉行,在每个销钉处,大理石撞件可能会落到销钉的左侧或右侧。最终,将销钉收集到机器底部的垂直箱中。这台机器的简单图如下所示:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
|_|_|_|_|_|_|
在此图中,O
表示大理石掉落的位置。每个^
都是钉子,大理石在该钉子处有50%的机会移动到钉子左侧或右侧的正方形。然后,大理石聚集在设备底部的垃圾箱中,对于足够多的大理石,垃圾箱中的大理石堆叠高度将类似于离散的二项分布。
挑战
对于这一挑战,您将基于上图来计算bean机器的最终概率分布。这些图被解释为大理石通过的二维“程序”,即朝向侧场或当前场下方的场。当弹珠到达机器底部时,它们会被计算为概率分布。为了使它有趣,这些图将包含比简单的源代码和引脚更多的字段。一个示例图是:
| O |
| ^ |
| ^ / |
| ^ | ^ |
| <^- = v |
| ^ ^ ^ ^ ^ |
此外,大理石现在各自具有旋转方向。此方向由某些字段设置,并确定大理石在其他几个字段中移动到下一个字段。
定义了以下字段:
O
: 资源。在其正下方产生大理石。这些弹珠的方向向左50%,向右50%。每个来源生产相同数量的大理石。U
:水槽。进入此字段的所有大理石都将从豆子机中移除。: 空的空间。如果大理石到达此区域,它将移动到下面的区域。
-
:地板。如果大理石到达此区域,它将根据其当前方向移动到左侧的区域或右侧的区域。^
:分离器。如果大理石到达此区域,则它有50%的位置移动到分割器的右侧或左侧。这也决定了大理石的方向。v
:加入。如果大理石到达此区域,它将移动到下面的区域。/
:倾斜的垫子。如果大理石到达此区域,它将移动到垫板左侧的区域,设置大理石的方向。\
:与上一个相同,但在右侧。|
:反射镜。如果大理石到达此区域,它将反转大理石的方向,并根据此反向将大理石向右或向左移动。=
:大炮。如果一个大理石到达这个领域后,将其移动到左边的电流方向向右或,直到大理石遇到一个字段不是,
-
或O
。<
:与上一个相同,但是将始终设置方向并向左移动。>
:与上一个相同,但在右侧。
关于该图,提供以下保证。
- 每个输入行在字段中的长度将完全相同。
- 每行的最左侧和最右侧字段始终为
|
。 - 该图将不包含任何可能的路径,通过这些路径,大理石可以在不确定的迭代次数(例如
\/
或)中卡入机器^^
。 - 该图将仅包含上述字段。
- 有一个或多个来源
结果
您的任务将是生成概率分布的16行高ASCII条形图,其中大理石从图的底部离开,并按比例缩放,以便最大的概率覆盖所有16个字符。因此对于以下问题:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
您的程序应产生以下解决方案(请注意,其宽度应与输入程序相同,包括侧面的管道:
# #
# #
# #
# #
# #
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # # # #
# # # # # #
例子
下面是一个示例,应测试所有不同字段类型的功能:
| O O |
| O ^ / <^\\\ |
| ^ > ^ |
| ^ ^ ^ =|
| ^ ^ | ^ <^ O |
| ^ > ^ | ^ O ^> v |
|| ^U ^ | = ^\ |
| ^ ^ ^ ^U ^\ ---^ |
| = ^ ^ = v |
它应该导致以下输出:
#
#
#
#
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
## # # #
## # # # #
# ### # # # #
# # ### # # # #
# # ### # # # #
规则
功能和完整程序都构成了对此挑战的有效答案。您将以换行符分隔的字符串形式收到该图,并应以给定格式返回输出图。默认输入/输出规则适用。尽管在输出中允许使用尾随和前导的换行符,但每行的宽度应与输入的宽度完全相同。
为了提供更多有创意的解决方案,仅要求您的程序在90%的时间内为同一张图输出正确的结果。毕竟这是一个概率模拟。
计分
这是代码高尔夫球,因此以字节为单位的最低分数获胜。
v
= [space]
?
v
,[space]
不同之处在于大炮在它们周围的互动方式。