Zachtronics游戏Infinifactory大致激发了这一挑战。
您将获得由表示的矩形输送机网格的俯视图>v<^
。可能有一些没有传送带的小室,以空格表示。这是一个例子:
> <vv <
v ^ >v v
>v^^>vv^
^>^ v
> v<v >>
>v v<^
此设置隐含无限数量的空格。
此外,还给出了矩形货物的尺寸,该货物放在网格左上角的传送带上。您的任务是弄清楚货物是否曾经停下来,或者最终是否会成环运动。
当然,货物可能会一次覆盖多个输送机,因此以下是在每个步骤中确定货物方向的规则:
对面的传送带互相抵消。因此,如果3x2货物覆盖以下任何补丁(为清晰起见,用连字符和管道勾勒出轮廓),结果将是相同的:
+---+ +---+ +---+ |>>^| | ^| |v^^| |^<<| |^ | |^^v| +---+ +---+ +---+
这些也是一样:
+---+ +---+ +---+ |v^<| | | |><>| |>>>| |>> | |>><| +---+ +---+ +---+
由于输送机在货物下方的确切位置无关紧要,因此取消哪对对都没有关系。
此取消在其他规则之前应用。因此,对于其他规则,最多只能有两个方向的传送带。
- 如果货物根本没有覆盖任何输送机(要么是因为所有输送机都取消了,或者是因为它只覆盖了空间,要么是因为它完全脱离了网格),所以货物就停了下来。
如果货物在一个方向上覆盖的输送机多于另一方向,则货物在该方向上移动。例如,如果3x2的货物覆盖了以下补丁
>> ^>^
它会向右移动,因为有更多的
>
比^
。另一方面,如果涵盖了>>^ ^
该规则将不适用,因为
>
和之间有联系^
。这仅保留相邻方向之间有平局(相反方向之间的平局将被取消)的情况。在这种情况下,货物将继续沿其已经进入的轴移动。例如,如果向右移动或向左移动的3x2货物现在覆盖了补丁
>>^ ^
它会向右移动。如果到达此补丁时它向上或向下移动,则现在将向上移动。如果在模拟的第一步就发生了这种冲突,则假定货物已经向右移动。
详细的例子
考虑顶部的传送带网格和3x2的货物。以下是该过程的分步可视化。每个步骤都由网格组成,网格以货物表示#
,一个小框显示了被货物覆盖的输送机,另一个框是取消后的输送机,以及确定货物移动位置的规则:
###vv < > <vv < > <vv < > <vv < > <vv < > <vv <
###^ >v v ###^ >v v v ^ >v v v ^ >v v v ^ >v v v ^ >v v
>v^^>vv^ ###v^^>vv^ ###v^^>vv^ ###^^>vv^ ###^>vv^ >###>vv^
^>^ v ^>^ v ### ^>^ v ###^>^ v ###>^ v ###^ v
> v<v >> > v<v >> > v<v >> > v<v >> > v<v >> > v<v >>
>v v<^ >v v<^ >v v<^ >v v<^ >v v<^ >v v<^
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
|> <| | | | v | | v | | >| | >| | >v| | >v| |>v^| |> ^| |v^^| | ^^|
| v | | v | | >| | >| | | | | | | | | | ^| | | | ^>| | >|
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
Rule 3 Rule 4 Rule 3 Rule 4 Rule 4 Rule 3
================================================================================
> <vv < > <### < > <vv <
v ###v v v ###v v v ###v v
>###>vv^ >v^^>vv^ >###>vv^
^>^ v ^>^ v ^>^ v
> v<v >> > v<v >> > v<v >>
>v v<^ >v v<^ >v v<^
+---+ +---+ +---+ +---+ +---+ +---+
|^ >| | >| |vv | | v | |^ >| | >|
|v^^| | ^^| |^ >| | >| |v^^| | ^^|
+---+ +---+ +---+ +---+ +---+ +---+
Rule 3 Rule 4 Rule 3
此时,货物进入最后两个帧之间的循环。
现在考虑使用2x3的货物:
##<vv < >##vv < > <vv < > <vv < > <vv < > <vv <
## ^ >v v ##^ >v v ##^ >v v v ^ >v v v ^ >v v v ^ >v v
##>v^^>vv^ ##v^^>vv^ ##v^^>vv^ ##v^^>vv^ ##^^>vv^ >v^^>vv^
^>^ v ^>^ v ## ^>^ v ## ^>^ v ##^>^ v ##^>^ v
> v<v >> > v<v >> > v<v >> >##v<v >> > ##<v >> > ##<v >>
>v v<^ >v v<^ >v v<^ >v v<^ >v v<^ ## v<^
+--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+
|> | |> | | <| | | |v | |v | | >| | >| |>v| |>v| | | | |
| v| | v| |v | |v | | >| | >| | | | | | | | | | v| | v|
| | | | | >| | | | | | | | | | | | v| | v| |>v| |>v|
+--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+
Rule 4 Rule 3 Rule 4 Rule 3 Rule 3 Rule 3
================================================================================
> <vv < > <vv < > <vv <
v ^ >v v v ^ >v v v ^ >v v
>v^^>vv^ >v^^>vv^ >v^^>vv^
^>^ v ^>^ v ^>^ v
> ##<v >> > v<v >> > v<v >>
## v<^ ## v<^ >v v<^
## ## ##
## ##
##
+--+ +--+ +--+ +--+ +--+ +--+
| v| | v| |>v| |>v| | | | |
|>v| |>v| | | | | | | | |
| | | | | | | | | | | |
+--+ +--+ +--+ +--+ +--+ +--+
Rule 3 Rule 4 Rule 2
在最后一步中,规则2适用,因为货物已经离开网格,所以它就静止了,不会出现回路。
规则与假设
您的输入将是如上所述的传送带网格以及货物的宽度和高度。您可以以任何方便的顺序和格式采用这三个参数。对于网格,这意味着您可以读取由换行符或其他字符分隔的行的单个字符串,也可以读取字符串数组或字符数组,只要单个网格单元格仍由字符>v<^
和空格。
你应该输出truthy值,如果在至少两帧或A的循环设定结果falsy值,如果货物会来休息。
您可能会假设栅格将被填充为带有空格的矩形,并且货物最初将适合栅格。
您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行参数或函数自变量获取输入,并通过STDOUT(或最接近的替代方案),函数返回值或函数(out)参数输出结果。
这是代码高尔夫球,因此最短的答案(以字节为单位)获胜。
测试用例
测试用例按网格分组。
Grid (2x2):
>v
^<
Width Height Loop?
1 1 True
1 2 True
2 1 True
2 2 False
Grid (3x3):
> v
^ <
Width Height Loop?
1 1 False
1 2 False
1 3 False
2 1 False
2 2 True
2 3 True
3 1 False
3 2 True
3 3 False
Grid (4x3):
>^>v
v^v
^ <<
Width Height Loop?
2 2 False
Grid (6x5):
>v>v>v
^v^v^v
^v^v^v
^>^>^v
^<<<<<
Width Height Loop?
1 1 True
1 2 False
2 1 True
2 2 True
2 4 True
2 5 False
3 1 False
3 2 True
3 3 True
3 5 True
6 2 False
6 3 True
6 5 False
Grid (10x6):
> <vv <
v ^ >v v
>v^^>vv^
^>^ v
> v<v >>
>v v<^
Width Height Loop?
1 1 False
2 3 False
2 6 False
3 2 True
5 4 False
6 1 True
10 6 False
作为一组额外的测试用例,请考虑网格仅由空格组成的任何输入都必须产生虚假的结果。
我已经手动检查了所有测试用例,所以如果您认为我做错了,请告诉我。
[^^/v<]
变为[[0,1] [0,1];[0,-1] [-1,0]]
?还是您是说这取决于我们是STDIN,字符串输入,char数组输入等,但仍然必须采用^,v,>和<的形式?
><^v
或空格表示。我会澄清这一点。