生命游戏arrowlits


26

背景

这项挑战是为了纪念Apsiller,他们凭借自己的挑战赢得了2016年PPCG最佳影片中的“ 看起来并不那么简单”类别的奖,我的4音符音乐盒可以播放那首歌吗? 恭喜你!

在他们的“关于我”页面上,该用户有一个非常精美的模拟器,用于“ 生命游戏”蜂窝自动机。(严重,请检查一下。)另一方面,单词aspillera在西班牙语中代表“ arrowslit”。鉴于这些事实,这一挑战是关于“人生游戏”中的箭眼。

生命游戏arrowlits

在GoL中,我们将用滑翔机代表一个箭头,并用一系列方块代表一堵墙。一架滑翔机从上方接近墙壁,并试图飞过墙壁的缝隙(箭头所示)。您的任务是检查滑翔机是否穿过箭孔或撞到墙上。

输入项

您的输入是位网格,代表GoL配置。您可以采用任何合理的格式(任意两个可离散打印的ASCII字符的多行字符串,字符串列表,2D整数数组,2D布尔数组等)。为了清楚起见,下面将使用字符的多行字符串.#

确保输入具有多个属性。首先,它的高度是2N一些Ñ≥6 ,其宽度至少是2N + 2。输入将全部为.s,除了在最上面的三行中的某个位置是滑翔机,而在中间的两行中是一堵墙。滑翔机将向西南或东南方向移动,其位置应确保如果移除了墙,则滑翔器在到达底部边缘之前不会穿过侧边缘(但可能会到达网格的某个角)。滑翔机最初与左边缘和右边缘分开至少.s 步长。它可以处于任何阶段。

墙由块组成,这些块由一列.s 隔开,但在一个地方,它们之间至少由两列.s 隔开。像滑翔机一样,最左边和最右边的块也与边缘分开.s 一步。左边缘上总是至少有一个块,而右边缘上总是有一个块。

这是有效输入网格的示例:

....#......................
..#.#......................
...##......................
...........................
...........................
...........................
.##.##............##.##.##.
.##.##............##.##.##.
...........................
...........................
...........................
...........................
...........................
...........................

输出量

如前所述,您的任务是确定滑翔机是否撞入墙壁或使其滑到南边。出于此挑战的目的,如果配置不再由单个滑翔机和木块墙组成,则会发生崩溃,无论以后在仿真中发生什么。下图显示了东南滑翔机在两个不同的阶段中不会崩溃的最小间隙(西南滑翔机的条件是对称的)。

...#...........
.#.#...........
..##...........
...............
...............
##...........##
##...........##

...#...........
....#..........
..###..........
...............
...............
##...........##
##...........##

如果滑翔机飞过墙壁,则应输出真实值,否则输出虚假值。对于上面的示例,正​​确的输出是虚假的,因为滑行器会撞到墙壁的左侧。

出于此挑战的目的,您可以假设,如果您在输入上模拟GoL 2 *(高度-3)步,则滑行器位于预期位置的最下面一行,并且壁完整,那么输出是真实的。

规则和计分

您可以编写完整的程序或函数。最低字节数获胜。

测试用例

我已经将测试用例收集到GitHub存储库中,因为它们很大。以下是各个文件的链接:


是否有任何理由在输入中包括墙下方的空行?
马丁·恩德

@MartinEnder他们使您在输入上实际模拟GoL的解决方案更加可行(至少我希望如此)。
Zgarb

滑翔机将始终从第一行开始?
罗德

@Rod是的,它将位于西南或东南方向的第一行。
Zgarb

人生的另一场比赛:P
克里斯托弗·克里斯托弗(Christopher)

Answers:


15

Python 2中142个 136 135字节

-6字节归功于ElPedro
-1字节归功于TuukkaX

p=input()
z=p[2].index(1)
m=(p[1][z]-p[1][z+1]<1)*2-1
k=i=0
for b in p[3:]:x=p[2][::m].index(1)+i;k|=1in b[::m][x-2:x+8];i+=1
print 1-k

在线尝试!验证所有测试用例

检查方向(东/西):

西东
使用z=p[2].index(1)获得的第三排第一方阵(用红色方块表示),再m=(p[1][z]-p[1][z+1]<1)*2-1减去右边的左边(蓝色)一个(绿色)的值,这样一来所有将要在4个滑翔机状态西南结果为1(图像中的第一行),而向东南的结果为0-1
然后将:1 -> -1和转换0,-1 -> 1为参数,以在处理西列表时反转列表。这样,向西南滑翔机的威胁与向东南滑翔机的威胁相同。

滑翔机运动

滑翔
这是滑翔机向东南移动的运动,它具有“梯形”模式,并且第三行最左边的方块对于每种模式都是恒定的。以它为起点,检查左右三个周围的块,以及中间的四个块是否存在1s(即墙)。
箭眼
arrowlits_path


我认为您可以通过在循环外设置一个变量i,然后在每次循环中向其添加1来丢失4个字节,从而摆脱掉。当我尝试使用您的TIO时似乎可以正常工作。+1是一个很酷的答案,无论我是对还是错。0forenumerate
ElPedro

真好!您可以通过删除中的空格来保存字节1 in。+1。
Yytsi


4

八度,123 122 108个字节

感谢@LuisMendo节省了2个字节

B=A=input("");B(1:3,:)=0;do;until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5;any(A(end,:))

在线尝试!

要么

验证所有测试用例

感谢Rod准备测试用例。

B=A=input("");
B(1:3,:)=0;
do
until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5
any(A(end,:))

先前的答案:

B=A=input("");
B(1:3,:)=0;
while nnz(A~=B)==5
    s=conv2(A,(m=-1:1)|m','same');
    x=~A;
    A&=~A|~(s<2|s>3);
    A|=x&s==3;
end;
any(A(end,:))

首先提取墙壁图案作为变量B
进行GoL模拟,直到壁图案和模拟图案具有多于/少于5个不同的像元。
如果滑翔机已收到最后一行,则该函数返回true。


1
直到墙图案和模拟图案具有多于/少于5个不同的像元。真聪明!
路易斯·门多

@LuisMendo谢谢,保存了一个拜托
rahnema1

3

视网膜101 93 91字节

字节数假定为ISO 8859-1编码。

O$#^`.(?=(.*¶)*(?<=#_.\2.+##.(.*¶)\D+))
$#1
¶(?>_(_)*#+_+¶_+¶(?<1>_+¶)*)(?>(?<-1>.)+)_{11}

在线尝试!

当然还不是最佳的。

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.