1D 실생활 모델 시뮬레이션


12

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

부울로 표시되는 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이며 바이트 단위의 최단 답변입니다!


8
Cellular Automata의 경우 +1 하지만이 규칙은 90이 아닌가?
HighlyRadioactive

2
첫 번째 테스트 사례가 결과가 아니어야합니까 [0, 1, 0, 0, 1, 0, 1, 1]?
TFeld

4
@jaaq 저는 기본 셀룰러 오토마타 규칙 (각 단계 또는 세대 간 변환) # 90을 말합니다. Wolfram | Alpha에 "Rule 90"을 입력하십시오.
HighlyRadioactive

12
STDOUT을 통해 결과 목록을 출력합니다 . 기본 I / O 방법 에만 의존하는 것이 좋습니다 .
Arnauld

5
@jaaq 모든 표준 1D Cellular Automata에 대해 규칙 #이 있기 때문에 그다지 우연이 아닙니다. 3 비트는 8 개의 가능한 상태 (왼쪽 이웃, 자기, 오른쪽 이웃)를 가지고 있기 때문에 각 가정에 대해 주어진 집이 켜져 있거나 꺼져 있다고하면 8 개의 참 / 거짓 값이 바이트에 완벽하게 매핑됩니다. 따라서 규칙 # 0-255는 바이트에서의 위치를 ​​기준으로 8 가지 상황 각각에서 이진 표현식을 결과 하우스 온 / 오프 상태로 설정함으로써 이러한 규칙 세트를 설명하는 속기로 사용할 수 있습니다. 90과 같은 일부 규칙은 눈에 띄는 것으로 간주되므로 인식 :)
Lunin

답변:


8

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

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

2

레티 나 , 51 바이트

1A`
"$+"{`(.).*(.)
$2$&$1
(.)(?=.(\1|(.)))?
$#2*$#3

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

1A`

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

"$+"{

그 횟수를 반복하십시오.

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

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

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

XOR 조작을 수행하십시오.


2

APL (Dyalog Extended) , 12 바이트 SBCS

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

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

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

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

 그것에 적용하십시오…

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

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

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




1

Pyth , 24 바이트

AQVH=Gmxhded.:+eG+GhG3;G

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

AQ                        # G, H = Q[0], Q[1] # Q = input in the form [[states],steps]
  VH                      # for i in range(H):
    =G                    # G = 
      m                   #     map(lambda d:                              )
       xhded              #                   d[0] ^ d[-1],
            .:       3    #         substrings(                 , length=3)
              +eG+GhG     #                     G[-1] + G + G[0]
                      ;   # (end for loop)
                       G  # print G

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.