박테리아 콜로니 표지 1
통해 9
빈 셀에 의해 표시하여, 균일 한 깊이의 셀 세그먼트 라이브0
0 0 2 0 0 0 1 2 0 0 3 3 0 0
매 초마다 각 식민지는 인접한 빈 세포로 퍼집니다. 두 식민지가 동시에 빈 세포에 도달하면 더 큰 레이블이 붙은 식민지가 그것을 취합니다.
t=0: 0 0 2 0 0 0 1 2 0 0 3 3 0 0
t=1: 0 2 2 2 0 1 1 2 2 3 3 3 3 0
t=2: 2 2 2 2 2 1 1 2 2 3 3 3 3 3
식민지는 경계를 넘어 퍼질 수 없습니다. 식민지는 다른 식민지로 대체되지 않으므로 빈 셀이 모두 채워지면 더 이상 변경되지 않습니다.
초기 상태가 주어지면 최종 상태를 출력하거나 인쇄합니다. 합리적인 목록 또는 문자열 형식을 사용하십시오. 중간 상태를 출력해서는 안됩니다. 투입물에는 적어도 하나의 박테리아 콜로니가 포함됩니다.
관련 : 목록에서 0을 가리십시오 . (식민지는 오른쪽으로 만 퍼졌다.)
테스트 사례 : 입력 아래 출력.
0 0 2 0 0 0 1 2 0 0 3 3 0 0
2 2 2 2 2 1 1 2 2 3 3 3 3 3
7 0 3 0 0 0 0 0 8 0 9 1
7 7 3 3 3 8 8 8 8 9 9 1
5 0 3 0 0 0
5 5 3 3 3 3
7 7 1
7 7 1
1 0 1
1 1 1
답변
자바 스크립트 (ES6), 66 62 바이트
a=>a.map(_=>a=a.map((c,i)=>c||Math.max(a[i-1]|0,a[i+1]|0)))&&a
설명
a=> // a = input as array of numbers
a.map(_=> // loop for the length of a, this ensures the end is always reached
a=a.map((c,i)=> // update a after to the result of t, for each cell c of index i
c|| // keep the cell if it is not 0
Math.max( // else set the cell to the max value of:
a[i-1]|0, // the previous cell (or 0 if i - 1 less than 0),
a[i+1]|0 // or the next cell (or 0 if i + 1 greater than the length of a)
)
)
)
&&a // return a
테스트
답변
Pyth, 18 바이트
um|@d1eSd.:++0G03Q
정수 목록으로 입력을받습니다.
본질적으로 이것은 수렴 루프까지 적용을 사용합니다 u
. 각 셀과 두 셀의 모든 목록을 한쪽에 형성 한 다음 각 제로화 셀을 이웃의 최대 값으로 업데이트하여 업데이트를 적용합니다.
um|@d1eSd.:++0G03Q
Implicit: Q = eval(input())
u Q Apply the following until convergence, starting with G = Q.
++0G0 Pad G with zeros on either side.
.: 3 Form all 3 element substrings.
Now, for each element of G, we have a list of the form
[previous, current, next]
m Map over this list
|@d1 The current element, if it's nonzero
eSd Else the max of the list.
답변
Mathematica, 77 바이트
alephalpha의 //.
솔루션 과 비교할 때 경쟁이 치열 하지는 않지만 셀룰러-오토 마타 도전에 CellularAutomaton
답이 있어야한다고 생각했습니다 .
CellularAutomaton[{If[#2<1,Max@##,#2]&@@#&,{},1},{#,0},{{{l=Length@#}},l-1}]&
이 함수는 많은 매개 변수를 사용합니다.
CellularAutomaton[{f,n,r},{i,b},{{{t}},d}]
그들이하는 일은 다음과 같습니다.
r
규칙의 범위입니다. 즉, 업데이트에 대해 몇 개의 이웃이 고려되는지 결정합니다. 우리는 양쪽에 이웃을 하나씩 원하기 때문에를 사용1
합니다.n
일반적으로 색상의 수 또는 색상 목록 (다른 셀 유형)이지만 규칙 번호 대신 사용자 지정 함수로 규칙을 지정하는 경우이 값은이어야합니다{}
.f
업데이트 규칙을 결정하는 함수입니다. 3 개의 셀 목록 (ifr = 1
)을 가져 와서 가운데 셀의 새 색상을 반환합니다.i
초기 조건입니다. 그게 입력입니다.b
배경입니다. 이것이 주어지지 않으면CellularAutomaton
, 우리가 원하지 않는주기적인 경계를 사용합니다. 대신 사용0
하면 데드 바운더리 조건이 부과됩니다.t
시뮬레이션 횟수입니다. 우리는 입력이 넓은 것보다 더 많은 단계를 필요로하지 않습니다. 그 후에 박테리아가 수렴 될 것t = Length@#
입니다. 일반적으로CellularAutomaton
모든 중간 단계를 반환합니다. 우리는t
두 개의 목록 으로 감싸서 피할 수 있습니다 .d
출력에 표시 할 셀을 결정합니다. 기본적으로 규칙의 영향을받을 수있는 모든 셀 (t*r
입력의 양쪽 끝에있는 추가 셀)을 가져옵니다.l-1
이것은 0부터 시작하는 인덱스가 사용되는 Mathematica의 몇 가지 상황 중 하나이기 때문에 제공합니다 .
답변
하스켈, 86 83 81 79 73 71 바이트
(0#r)l=max r l
(o#_)_=o
p!_=zipWith3(#)p(0:p)$tail p++[0]
id>>=foldl(!)
사용 예 : id>>=foldl(!) $ [7,0,3,0,0,0,0,0,8,0,9,1]
-> [7,7,3,3,3,8,8,8,8,9,9,1]
.
설명 할 것이 많지 않습니다 : 셀이 0이면 최대 인접 요소를 사용하십시오. 입력 시간을 반복하십시오. 이를 위해 x
via를 통해 반복 foldl
하지만의 두 번째 인수는 무시하십시오 p
.
편집 : @Mauris는 6 바이트를 저장하고 @xnor는 다른 두 개를 찾았습니다. 감사!
답변
CJam, 27 24 바이트
{_,{0\0++3ew{~@e>e|}%}*}
이렇게하면 이름없는 블록이 푸시되어 스택의 목록을 새 목록으로 변환합니다.
설명
_, e# Duplicate the input and get its length N.
{ e# Run this block N times (convergence won't take that long)...
0\0++ e# Wrap the list in two zeroes.
3ew e# Get all sublists of length 3.
{ e# Map this block onto each sublist...
~ e# Dump all three elements on the stack.
@ e# Pull up the left neighbour.
e> e# Maximum of both neighbours.
e| e# Logical OR between centre cell and maximum of neighbours.
}%
}*
답변
J, 24 23 바이트
(+=&0*(0,~}.)>.0,}:)^:_
용법:
((+=&0*(0,~}.)>.0,}:)^:_) 0 1 5 0 0 0 6
1 1 5 5 6 6 6
방법은 Mauris의 솔루션 과 유사합니다 .
( )^:_ repeat until change
0,}: concat 0 and tailless input
(0,~}.) concat headless input and 0
>. elementwise maximum of the former two lists
=&0* multiply by input_is_0 (zeroing out the list at nonzero input positions)
+ add to input
Zgarb 덕분에 1 바이트가 절약되었습니다.
답변
매스 매 티카, 77 74 66 62 바이트
Martin Büttner 덕분에 12 바이트가 절약되었습니다.
#//.i_:>BlockMap[If[#2<1,Max@##,#2]&@@#&,Join[{0},i,{0}],3,1]&