삶의 규칙을 바꾸다


15

실제와 같은 셀룰러 오토 마톤 은 Conway의 Game of Life와 유사한 셀룰러 오토 마톤입니다. 각 셀마다 정확히 8 개의 이웃이 있으며 2 개의 상태 중 하나 인 살아남은 죽은 (이론적으로) 무한히 큰 정사각형 그리드에서 작동한다는 점에서 .

그러나 이러한 Like-like 버전은 중요한 방식으로 다릅니다. 주어진 셀의 규칙이 살아 나고 주어진 셀의 규칙이 다음 세대에도 살아남는 것입니다.

예를 들어, 고전적인 Game of Life는 규칙을 사용합니다 B3/S23. 즉, 3 개의 살아있는 세포가 새로운 세포를 탄생시키고 2 또는 3 명의 살아있는 이웃이 생존해야합니다. 이 과제를 위해, 이웃은 자신을 포함하지 않는다고 가정하므로 각 셀에는 정확히 8 개의 이웃이 있습니다.

당신의 작업은 시작 구성, 출생 규칙, 생존 규칙 및 양의 정수 (실행 할 세대 수)가 주어지면 가능한 가장 짧은 코드로 주어진 세대 수에 대한 규칙을 사용하여 실제와 같은 자동 장치를 시뮬레이션합니다 . 시작 구성은 정사각 행렬 / 2 차원 배열 또는 여러 줄 문자열입니다. 다른 것들은 합리적인 형식과 방법으로 주어질 수 있습니다.

예를 들어 출생 규칙이 12345678(살아있는 이웃이라면) 생존 규칙이었고 2357시작 구성은

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

다음 두 세대는

Generation 1:           Generation 2:

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

주어진 세대의 수가 10이라면, 출력은

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

입력 행렬이 제공 한 범위를 벗어난 변경 내용을 처리 할 필요는 없지만 행렬 외부의 모든 셀이 죽기 시작합니다. 따라서 입력 매트릭스는 언어가 지원할 수있는 최대 값까지 모든 크기가 될 수 있습니다. 세대간에 보드를 출력 할 필요는 없습니다.

이것은 이므로 가장 짧은 코드가 승리합니다.

테스트 사례

이들은 B/S표기법을 사용하여 사용 된 규칙을 나타냅니다.

B2/S2, generations = 100구성 :

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

산출:

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

B1357/S2468, generations = 12구성 :

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

산출:

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

더 많은 테스트 사례를 생성해야하는 경우이 훌륭한 시뮬레이터를 사용할 수 있습니다 . 보드 크기를 제한하십시오


시뮬레이션은 환상적입니까?
Outgolfer Erik

행렬이기 때문에 @EriktheOutgolfer에는, (이론적으로) 크기 무한 없음
coinheringaahing 케어 드

또한 주어진 행렬이 정사각형이라고 가정 할 수 있습니까?
Outgolfer Erik

2
@EriktheOutgolfer "무한히 큰 사각형 격자"
coinheringaahing 케어 드

그러나 그것은 당신이 ... 편집 할 것이라고 가정 할 수는 없습니다.
Erik the Outgolfer

답변:


9

MATL , 24 23 바이트

xx:"tt3Y6Z+1Gm<8M2Gmb*+

입력은 다음과 같습니다

  • 출생 규칙이있는 배열
  • 생존 규칙이있는 배열
  • 세대수
  • ;행 분리 자로 사용 되는 초기 셀 구성의 매트릭스 .

온라인으로 사용해보십시오! 또는 테스트 사례를 참조하십시오 : 1 , 2 .

몇 바이트 더 당신은 ASCII 예술진화를 볼 수 있습니다 .

설명

xx      % Take two inputs implicitly: birth and survival rules. Delete them
        % (but they get copied into clipboard G)
:"      % Take third input implicitly: number of generations. Loop that many times
  tt    %   Duplicate twice. This implicitly takes the initial cell configuration
        %   as input the first time. In subsequent iterations it uses the cell 
        %   configuration from the previous iteration
  3Y6   %   Push Moore neighbourhood: [1 1 1; 1 0 1; 1 1 1]
  Z+    %   2D convolution, maintaining size
  1G    %   Push first input from clipboard G: birth rule
  m     %   Ismember: gives true for cells that fulfill the birth rule
  <     %   Less than (element-wise): a cell is born if it fulfills the birth rule
        %   *and* was dead
  8M    %   Push result of convolution again, from clipboard M
  2G    %   Push second input from clipboard G: survival rule
  m     %   Ismember: gives true for cells that fulfill the survival rule
  b     %   Bubble up the starting cell configuration
  *     %   Multiply (element-wise): a cell survives if it fulfills the survival
        %   rule *and* was alive
  +     %   Add: a cell is alive if it has been born or has survived, and those
        %   are exclusive cases. This produces the new cell configuration
        % Implicit end loop. Implicit display

입력 순서를 변경하여 바이트를 절약 할 수 있습니까? xx시작시는 나에게 약간의 낭비를 보인다 ...
에릭 Outgolfer

@EriktheOutgolfer 어떻게 보지 못합니다. 처음 두 개를 삭제하고 나중에 여러 번 재사용 할 필요가 있습니다 (반복 당 하나씩). 다른 입력은 이미 암시 적입니다.
Luis Mendo

그래서 입력을 "삭제"하면 입력 목록에 추가됩니까?
Outgolfer Erik

@EriktheOutgolfer 예. MATL 입력은 대화식이므로 프로그램이 입력의 수를 미리 알지 못합니다. 여기서 빈 스택에서 삭제하면 입력이 암시 적으로 수행됩니다. 일단 입력되면 각 입력은 클립 보드 G에 복사되며 나중에 검색 할 수 있습니다.
Luis Mendo

3

Wolfram Language (Mathematica) , 144122 바이트

CellularAutomaton[{Tr[2^#&/@Flatten@MapIndexed[2#+2-#2[[1]]&,{#2,#3},{2}]],{2,{{2,2,2},{2,1,2},{2,2,2}}},{1,1}},#,{{#4}}]&

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

사용법 예 :

%[RandomInteger[1, {10, 10}], {2, 3}, {3}, 5]

10x10 랜덤 그리드를 시작으로 사용하고, 2 개 또는 3 개의 이웃으로 생존하고, 3 개의 이웃으로 태어난, 5 회 반복 결과를 플롯합니다.


내장이 너무 나쁘다 1 차원입니다 (내가 틀렸다면 나를 교정하십시오)
Zacharý

저는 9 개의 이웃 전체 규칙과 함께 내장 된“CellularAutomaton”을 사용하고 있습니다. 대부분의 코드는 생존 / 출생 입력을 규칙 번호로 변환합니다.
Kelly Lowder

1

R , 256 바이트

function(x,B,S,r){y=cbind(0,rbind(0,x,0),0)
n=dim(y)[1]
z=c(1,n)
f=function(h){w=-1:1
b=h%%n+1
a=(h-b+1)/n+1
'if'(a%in%z|b%in%z,0,sum(x[w+b,w+a])-x[b,a])}
while(r){x=y
for(i in 1:n^2){u=f(i-1)
y[i]=u%in%B
y[i]=(y[i]&!x[i])|(x[i]&(u%in%S))}
r=r-1}
y[-z,-z]}

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

슬프게도, 이것은 내가 바라는 것처럼 골프처럼 보이지 않습니다.

입력 : R 행렬 및 챌린지 매개 변수. 출력 : R 생성 후의 행렬

알고리즘은 경계를 처리하기 위해 행렬을 0으로 채 웁니다. 그런 다음 반복적으로 : 1) 출생 규칙을 적용하고 2) 생존 규칙을 통과하지 않은 기존 세포를 죽입니다. 돌아올 때 패딩이 제거됩니다.


좋은 바이트 수!
Giuseppe

나는 그것을 217 바이트 로 얻을 수 있었지만 우리가 정확히 하나 이상의 골프를 찾을 수 있다면, 우리는 216적어도 큐브 인 것을 얻을 수 있습니다 ...
Giuseppe

1

파이썬 (2) , 156 (149) 146 바이트

lambda R,g,c:g and f(R,g-1,[[`sum(sum(l[y+y/~y:y+2])for l in c[x+x/~x:x+2])-c[x][y]`in R[c[x][y]]for y,_ in e(c)]for x,_ in e(c)])or c
e=enumerate

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

입력을받습니다 :

  • Rules :의 [birth,survial]목록으로 규칙 string. 예 :( ['135','246'])
  • g포기 : int
  • configuration : 1/0또는의 정사각형 2D 배열True/False

의 2d 배열을 반환 True/False

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