태그 보관물: cellular-automata

cellular-automata

1D 실생활 모델 시뮬레이션 중이거나 둘

이 질문 은 코드 검토에서 유행했으며 코드 골프 도전에 적합하다고 생각했습니다.

부울로 표시되는 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 바이트

Shaggy의 Japt 솔루션 기반

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

온라인으로 사용해보십시오! 첫 번째 줄의 단계 수 01두 번째 줄 의 s 및 s 문자열 을 가져옵니다. 설명:

1A`

입력에서 단계 수를 삭제하십시오.

"$+"{

그 횟수를 반복하십시오.

`(.).*(.)
$2$&$1

줄 바꿈을 시뮬레이션하기 위해 끝 자리를 다른 쪽 끝에 복사하십시오.

(.)(?=.(\1|(.)))?
$#2*$#3

XOR 조작을 수행하십시오.


답변

APL (Dyalog Extended) , 12 바이트 SBCS

전체 프로그램. 상태 배열을 표시 한 다음 단계 수를 묻는 프롬프트를 표시합니다. stdout으로 인쇄합니다.

1(⌽≠⌽⍢⌽)⍣⎕⊢⎕

온라인으로 사용해보십시오!

콘솔에서 입력을 평가받습니다 (상태 배열)

 그것에 적용하십시오…

1()⍣⎕ 다음과 같은 암묵 함수, 입력 횟수, 매번 1왼쪽 인수로 :

⌽⍢⌽ 반대 방향으로 오른쪽 인수를 1 단계 왼쪽으로 회전 (즉, 한 단계 오른쪽으로 회전)

⌽≠ 인수가 1 단계 왼쪽으로 회전 된 XOR