이 질문 은 코드 검토에서 유행했으며 코드 골프 도전에 적합하다고 생각했습니다.
부울로 표시되는 x 개의 주택이 비어 있지 않은 목록이 제공됩니다. 매일 주택은 인접한 주택과 경쟁합니다. 1은 “활성”주택을 나타내고 0은 “비활성”주택을 나타냅니다. 주어진 집의 양쪽에있는 이웃이 모두 활동 중이거나 둘 다 비활성이면 다음 날에 그 집이 비활성화됩니다. 그렇지 않으면 활성화됩니다.
def get_state_as_pos(thelist, pos):
if thelist[pos-1] == thelist[pos+1]:
return 0
else:
return 1
예를 들어, 이웃 [0, 1, 0] 그룹이있는 경우 [1]의 집은 왼쪽과 오른쪽의 집이 모두 비활성화되므로 0이됩니다. 양쪽 끝의 셀도 반대쪽을 확인하므로 인덱스 0의 이웃은 인덱스 length-1
와 인덱스 n1에 있으며 그 반대도 마찬가지입니다. 셀을 업데이트 한 후에도 각 셀의 상태 정보가 동시에 업데이트되도록 다른 셀을 업데이트 할 때 이전 상태를 고려해야합니다.
이 함수는 상태의 배열과 여러 단계를 취하며 주어진 단계 수 후에 주택의 상태를 출력해야합니다.
input: states = [1, 0, 0, 0, 0, 1, 0, 0], steps = 1
output should be [0, 1, 0, 0, 1, 0, 1, 1]
input: states = [1, 1, 1, 0, 1, 1, 1, 1], steps = 2
intermediate state= [0, 0, 1, 0, 1, 0, 0, 0]
output should be [0, 1, 0, 0, 0, 1, 0, 0]
input: states = [1], steps=1
output: states= [0]
그러나 원하는대로 목록과 단계를 수행하고 기본 I / O 를 통해 결과 목록을 출력하십시오 . 표준 허점은 금지되어 있습니다. 이것은 codegolf이며 바이트 단위의 최단 답변입니다!
답변
05AB1E , 14 13 10 9 6 바이트
F©Á®À^
F # repeat n times:
©Á # the list, rotated right
®À # the list, rotated left
^ # xor (vectorizes)
불필요하게 영리한 9 바이트 솔루션 :
F¥DO.øü+É
F # repeat n times:
# (examples given for the initial state [0, 1, 1, 0, 1])
¥ # deltas of the list ([1, 0, -1, 1])
D # duplicate
O # sum (1)
.ø # surround ([1, 1, 0, -1, 1, 1])
ü+ # pairwise addition ([2, 1, -1, 0, 2])
É # modulo 2 ([0, 1, 1, 0, 0])
답변
파이썬 2 , 72 바이트
f=lambda s,n:n and f([a^b for a,b in zip(s[-1:]+s,s[1:]+s[:1])],n-1)or s
답변
Wolfram Language (Mathematica) , 31 바이트
CellularAutomaton[90,#,{{#2}}]&
CellularAutomaton
입력 목록이 주기적이라고 가정합니다.
답변
자바 스크립트 (ES6), 57 바이트
로 입력을 (steps)(array)
받습니다.
s=>g=a=>s--?g(a.map(_=>a[~-i++%l]^a[i%l],i=l=a.length)):a
답변
Japt -mh
, 11 10 9 바이트
싱글 톤 2D 어레이로서 상태의 I / O.
VÇí^Zé2)é
VÇí^Zé2)é :Implicit input of integer U=steps & array V=[states]
VÇ :Modify the last element Z in V
í :Interleave with
Zé2 : Z rotated right twice and
^ : Reduce each pair by XOR
) :End interleave
é :Rotate right once
:Repeat U times and implicitly output V
답변
레티 나 , 51 바이트
1A`
"$+"{`(.).*(.)
$2$&$1
(.)(?=.(\1|(.)))?
$#2*$#3
온라인으로 사용해보십시오! 첫 번째 줄의 단계 수 0
와 1
두 번째 줄 의 s 및 s 문자열 을 가져옵니다. 설명:
1A`
입력에서 단계 수를 삭제하십시오.
"$+"{
그 횟수를 반복하십시오.
`(.).*(.)
$2$&$1
줄 바꿈을 시뮬레이션하기 위해 끝 자리를 다른 쪽 끝에 복사하십시오.
(.)(?=.(\1|(.)))?
$#2*$#3
XOR 조작을 수행하십시오.
답변
APL (Dyalog Extended) , 12 바이트 SBCS
전체 프로그램. 상태 배열을 표시 한 다음 단계 수를 묻는 프롬프트를 표시합니다. stdout으로 인쇄합니다.
1(⌽≠⌽⍢⌽)⍣⎕⊢⎕
⎕
콘솔에서 입력을 평가받습니다 (상태 배열)
⊢
그것에 적용하십시오…
1(
… )⍣⎕
다음과 같은 암묵 함수, 입력 횟수, 매번 1
왼쪽 인수로 :
⌽⍢⌽
반대 방향으로 오른쪽 인수를 1 단계 왼쪽으로 회전 (즉, 한 단계 오른쪽으로 회전)
⌽≠
인수가 1 단계 왼쪽으로 회전 된 XOR