污染的最后阶段


10

5x5的收件人内部存在病毒。我们知道它如何传播污染物,您的任务是输出污染物的最后阶段。

收件人

它将被表示为5x5的二维数组:

0 0 0 0 1
0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1

1指其中病毒已经被污染的位置,并且0位置不被污染。

病毒如何传播

  1. 受污染的位置不能清洁。
  2. 仅当其相邻位置中的至少两个(北,东,南和西牢房)受到污染时,清洁位置才会在下一阶段受到污染。
  3. 污染的最后阶段发生在没有更多的干净细胞受到污染的情况下。

样品

将上述接收者用作污染的第一阶段,第二阶段将是:

0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1
0 1 1 1 1

污染的第3阶段将是:

0 0 0 1 1
0 0 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1

污染的阶段4将是:

0 0 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1

第五阶段(在此示例中为最后一个)将是:

0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1

挑战

给定污染的一个阶段作为输入,您应该输出污染的最后一个阶段。

您可以编写完整的程序或函数。您可以将输入作为数组/列表,分隔的数字甚至字符串。选择适合您的语言的最佳方式。

以字节为单位的最短答案为胜!

另一个测试案例

Input:
1 1 0 0 1
0 0 0 0 0
0 1 0 0 1
0 0 0 0 0
1 0 0 0 1

Output:
1 1 0 0 1
1 1 0 0 1
1 1 0 0 1
1 1 0 0 1
1 1 0 0 1

Input:
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1

Output:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

Input:
1 0 0 1 0
0 0 1 0 1
0 0 0 0 0
1 0 0 0 0
0 0 1 0 0

Output:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

Input:
0 1 0 0 0
0 0 0 0 1
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0

Output:
0 1 0 0 0
0 0 0 0 1
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0

1
如何1 0 1在输出中发生?中心零不是和2 1s 相邻吗?
林恩

@Lynn ..我已更新;)...对此感到抱歉
删除

1
您可以添加1 0 0 1 0 \ 0 0 1 0 1 \ 0 0 0 0 0 \ 1 0 0 0 0 \ 0 0 1 0 0为测试用例吗?
Conor O'Brien

@CᴏɴᴏʀO'Bʀɪᴇɴ。新增的感谢
删除了

2
到目前为止,所有测试用例只有完整的行和列为空。我建议0 1 0 0 0 \ 0 0 0 0 1 \ 0 0 1 0 0 \ 1 0 0 0 0 \ 0 0 0 1 0,它保持不变。
xnor

Answers:


12

因为这基本上是在谈论细胞自动机,所以我给你。

Golly Quicklife规则,10个字节

01234/234V

输入规则,将网格粘贴到Golly中,运行模式。生成的模式是输出。

说明:

01234 Survive on any number of neighbors
     /234 Born on >2 neighbors
         V Only directly adjacent neighbors count

或者,如果您坚持完整的RuleLoader规则,则为89个字节:

@RULE X
@TABLE
n_states:2
neighborhood:vonNeumann
symmetries:permute
011001
011101
011111

规则名称为X,步骤与之前相同。


3
这是一种编程语言吗?
林恩

1
Golly Quicklife可以模拟B3/S23任何事情!...但是它确实有严格的输入格式(例如整个程序都包含在输入中(您还会怎么做?))。但是为什么要破坏乐趣?
CalculatorFeline

好吧,我们只需要等待一个归结为细胞自动机的长期行为的问题即可!
CalculatorFeline

1
我对有效性有些怀疑。如果Golly只显示最终结果,那很好,但它也显示中间结果(除非我错了)
lirtosiast

1
@CatsAreFluffy然后我要投票。
lirtosiast '16

5

Python 2,97个字节

s=' '*6+input()
exec"s=s[1:]+('1'+s)[sum(s[i]<'1'for i in[-6,-1,1,6])>2or'/'>s];"*980
print s[6:]

在线尝试。输入作为带引号的字符串,每行用换行符分隔。在980不是最佳的,并且可以与的35下部的多个因为它有该程序的长度没有影响来代替,我已经离开上限作为练习读者最低安全的判定。


需要在输入处加上引号,并\ n转义换行符。
CalculatorFeline

@CatsAreFluffy我相信Ideone链接已经阐明了如何进行输入。
xsot

输入作为带引号的字符串,每行用\ n分隔。
CalculatorFeline

好了,我将对其进行编辑以减少歧义。
xsot

3

Javascript(ES6),91 89 87字节

作为接受输入为数字或字符串数​​组的函数。

Neil的-2个字节(将的分配y与字符串转换结合在一起)

-2个字节(删除变量j

f=x=>(y=x.map((z,i)=>~(i%5&&x[i-1])+~(i%5<4&x[i+1])+~x[i-5]+~x[i+5]<-5|z))+[]==x?y:f(y)
<!-- Snippet demo with array <-> string conversion for convenience -->
<textarea id="input" cols="10" rows="5">0 0 0 0 1
0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1</textarea>
<button id="submit">Run</button>
<pre id="output"></pre>
<script>
strToArray=x=>x.match(/\d/g)
arrayToStr=x=>([]+x).replace(/(.),(.),(.),(.),(.),*/g, '$1 $2 $3 $4 $5\n')
submit.onclick=_=>output.innerHTML=arrayToStr(f(strToArray(input.value)))
</script>


通过写入(y=...)+''==x而不是节省2个字节(y=...),y+''==x
尼尔

2

MATL,22字节

tn:"t5Bt!=~2X53$Y+1>Y|

这适用于该语言的当前版本(15.0.0)

在线尝试

输入格式为:2D数组,行之间用分号分隔。因此,这四个测试用例具有以下输入:

[0 0 0 0 1; 0 0 0 0 1; 0 0 0 1 1; 0 0 1 1 1; 0 1 1 1 1]

[1 1 0 0 1; 0 0 0 0 0; 0 1 0 0 1; 0 0 0 0 0; 1 0 0 0 1]

[1 0 0 0 0; 0 1 0 0 0; 0 0 1 0 0; 0 0 0 1 0; 0 0 0 0 1]

[1 0 0 1 0; 0 0 1 0 1; 0 0 0 0 0; 1 0 0 0 0; 0 0 1 0 0]

说明

这将使用以下掩码重复执行输入数组的2D卷积,该掩码定义哪些邻居被视为污染:

0 1 0
1 0 1
0 1 0

为了获得与原始数组相同大小的结果,首先将其填充零帧,然后仅保留卷积的“有效”部分(即没有边缘效应)。

将阈值2应用于卷积的输出,并且将结果与原始输入进行元素“或”运算。

必须执行足够的次数以确保达到最终状态。一个满足此要求的简单标准是:迭代输入数组中条目的数量(在测试用例中为25次)。

t          % get input 2D array implicitly. Duplicate
n:"        % repeat as many times as elements in the input array
  t        %   duplicate array
  5B       %   number 5 in binary: row vector [1 0 1] 
  t!       %   duplicate and transpose into column
  =~       %   compare for inequality with broadcast. Gives desired mask
  2X53$Y+  %   2D convolution. Output has same size as input 
  1>       %   true for elements equal or greater than 2
  Y|       %   element-wise OR with previous copy of the array
           % end loop. Implicitly display

1

TI-BASIC,151字节

Prompt [A]
[A]→[B]
Lbl 0
[B]→[A]
For(Y,1,5
For(X,1,5
DelVar ADelVar BDelVar CDelVar D
If Y>1:[A](Y-1,X→A
If Y<5:[A](Y+1,X→B
If X>1:[A](Y,X-1→C
If X<5:[A](Y,X+1→D
max(A+B+C+D≥2,[A](Y,X→[B](Y,X
End
End
If [A]≠[B]:Goto 0
[B]

输入为[[1,0,0,1,1][1,0,0,0,0]...]


1
我认为您可以将其增加到大约100个字节。第一条技巧:使用Repeat循环。
lirtosiast

1

Lua,236个字节

s=arg[1]u=s.sub while p~=s do p=s s=s:gsub("(%d)()",function(d,p)t=0 t=t+((p-2)%6>0 and u(s,p-2,p-2)or 0)t=t+(p-7>0 and u(s,p-7,p-7)or 0)t=t+(p+5<30 and u(s,p+5,p+5)or 0)t=t+(p%6>0 and u(s,p,p)or 0)return t>1 and 1 or d end)end print(s)

接受命令行上的输入,并使用Lua的字符串操作来获取答案。

取消高尔夫:

s=arg[1]
u=s.sub
while p~=s do
    p=s
    s=s:gsub("(%d)()", function(d, p)
                 t=0
                 t=t+((p-2)%6>0 and u(s,p-2,p-2)or 0)
                 t=t+(p-7>0 and u(s,p-7,p-7)or 0)
                 t=t+(p+5<30 and u(s,p+5,p+5)or 0)
                 t=t+(p%6>0 and u(s,p,p)or 0)
                 return t>1 and 1 or d
    end)
end
print(s)

1

APL,76 72 70字节

{⍵∨1<¯1 ¯1↓1 1↓↑+/(1 0)(¯1 0)(0 ¯1)(0 1){⍺[1]⊖⍺[2]⌽⍵}¨⊂¯1⊖¯1⌽7 7↑⍵}⍣≡

它的作用是:将矩阵扩展为7x7的矩阵,然后将参数居中(omega)。根据此矩阵,生成4个“子”矩阵,每个矩阵朝不同的方向移动(上/下/左/右),将它们加在一起(这样我们就得到了邻居数),放下框架(返回到5x5矩阵)。或使用带有“旧”矩阵的新矩阵,以确保我们在处理过程中(即在边缘)没有丢弃任何单元。然后,使用⍣≡组合获得定点值。

{⍵∨1<¯1 ¯1↓1 1↓↑+/(1 0)(¯1 0)(0 ¯1)(0 1){⍺[1]⊖⍺[2]⌽⍵}¨⊂¯1⊖¯1⌽7 7↑⍵}⍣≡
                                                             7 7↑⍵    ⍝ Expand the matrix
                                                       ¯1⊖¯1⌽         ⍝ Center the original matrix
                  (1 0)(¯1 0)(0 ¯1)(0 1){⍺[1]⊖⍺[2]⌽⍵}¨⊂               ⍝ Construct 4 child matrices, each offset from the original one by the values on the left of {}
                +/                                                    ⍝ Sum each matrix into one giant matrix
               ↑                                                      ⍝ Mix
     ¯1 ¯1↓1 1↓                                                       ⍝ Transform the 7x7 matrix back to a 5x5 matrix
   1<                                                                 ⍝ Check which elements are smaller than 1
 ⍵∨                                                                   ⍝ "Or" this matrix and the generated matrix
{                                                                 }⍣≡ ⍝ Find the fixpoint

示例(考虑将功能分配给contaminate):

          stage ⍝ the base matrix
0 0 0 0 1
0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1
      contaminate stage ⍝ apply the function
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
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.