태그 보관물: cellular-automata

cellular-automata

양자 주 정거장 @ @#####@ @ #

알코올의 영향을받는 격자 위의 사람은 모든 방향으로 갈 가능성이 동일하다는 것은 잘 알려져 있습니다. 그러나이 상식적인 진술은 아주 작은 술꾼 의 영역에는 적용되지 않으며 , 그 행동은 마치 한 번에 모든 가용 경로를 취하는 것처럼 행동 하며 가능한 경로가 서로 간섭 할 수 있습니다. 당신의 임무는 n단계 후 이러한 양자 취한 사람의 가능한 위치를 표시하는 것 입니다.

사양

문제의 음주는 정사각형 격자를 차지하며 다음과 같은 간단한 규칙을 따르는 Von Neumann (플러스 모양) 이웃을 사용하는 3 상태 셀룰러 오토 마톤으로 간주 될 수 있습니다.

  • Empty가는 Awake정확히 하나에 인접한 경우 Awake와 그렇지 않은 경우로 이동Empty
  • Awake 로 이동 Sleeping
  • Sleeping 로 이동 Sleeping

보드의 초기 상태 AwakeEmptys 의 무한 필드로 둘러싸인 단일 입니다.

도전

음이 아닌 정수가 주어지면 단계 n후 술고래의 ASCII 표현을 작성 n하십시오. 각 상태는 다른 문자로 표시되어야하며 솔루션은 어떤 문자가 어떤 상태를 의미 하는지를 명시해야합니다. 에 공백을 사용 Empty하는 경우 줄 끝에 공백 을 포함 할 필요가 없습니다.

이것은 이므로 가장 짧은 답변이 이깁니다. 표준 허점 적용, 선행 및 후행 공백 허용, 문자열 배열 / 2d 문자 배열 출력 허용 등

이 예제 Empty, @for Awake#for에 사용 Sleeping합니다.

n=0
@

n = 1
 @
@#@
 @

n = 2
  @
  #
@###@
  #
  @

n = 3
   @
  @#@
 @ # @
@#####@
 @ # @
  @#@
   @

n=6

      @
      #
    @###@
     @#@
  @  ###  @
  #@# # #@#
@###########@
  #@# # #@#
  @  ###  @
     @#@
    @###@
      #
      @

n=10
          @
          #
        @###@
         @#@
         ###
        # # #
       #######
      #  ###  #
  @  ##  ###  ##  @
  #@# ### # ### #@#
@###################@
  #@# ### # ### #@#
  @  ##  ###  ##  @
      #  ###  #
       #######
        # # #
         ###
         @#@
        @###@
          #
          @

재미있는 메모

OEIS에서 점유 된 세포의 수의 서열을 조사함으로써, 양자 술고래가 훨씬 더 잘 연구 된 이쑤시개 서열 과 동형이라는 것을 발견했다 . 그 지식을 더 나은 골프에 포함시킬 수 있다면 나는 감명받을 것입니다.



답변

Wolfram Language (Mathematica) , 92 91 바이트

Print@@@CellularAutomaton[{7049487784884,{3,{a={0,3,0},3-2a/3,a}},{1,1}},{j={{1}},0},{j#}]&

Mathematica의 내장 기능을 사용하는 완벽한 도전 CellularAutomaton!

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

비어 있음 = 0, 깨우기 = 1, 수면 = 2

처음 256 개의 반복 애니메이션 (흰색 = 비어 있음, 회색 = 깨어 있음, 검은 색 = 잠자기) :

여기에 이미지 설명을 입력하십시오

설명

CellularAutomaton[ ... ]

CellularAutomaton사양으로 실행 …

{7049487784884,{3,{a={0,3,0},3-2a/3,a}},{1,1}}

Von Neumann 이웃과 함께 3 색 전체 규칙 7049487784884를 적용하십시오 …

{j={{1}},0}

중간에 단일 1이 있고 0의 배경이있는 보드에서 …

{j#}

반복 <input>횟수 (로 {j#}평가 {{{#}}}) 테두리 외부의 셀이 배경과 같지 않으면 배열이 자동으로 확장됩니다.

7049487784884

이 규칙은 밑이 3 인 숫자에서 나옵니다 220221220221220221220221220. 이는 “모두 1또는 22변경 0하고 11주위에 홀수가있는 경우에만 변경 “을 의미 합니다.

Print@@@

배열을 인쇄하십시오.

” ‘odd 1s’의 반증 명은 ‘정확하게 하나 1‘ ‘와 같습니다.

이 5×5 격자 픽셀을 고려하십시오. 흰색은 셀 0또는 2깨어 있지 않은 픽셀이고 회색은 1셀입니다.

여기에 이미지 설명을 입력하십시오

1셀이 세 개의 0셀 주위에서 생성 된 경우 그리드는 다음과 같이 표시되어야합니다. 셀은 다음과 같이 1U 자형 (또는 회전 된 버전)으로 정렬됩니다.

여기에 이미지 설명을 입력하십시오

이 세포 성 오토 마톤의 자기 유사성으로 인해, 세포 성 오토 마톤에 나타나는 임의의 패턴은 (유도에 의해) 대각선에 나타나야한다. 그러나이 패턴은 대각선 대칭이 아닙니다. 즉, 대각선에서는 발생할 수 없으며 셀룰러 오토 마톤의 어느 곳에 나 나타날 수 없습니다.

깨어 / 잠자는 동등

• 그래도 참고 0셀이 정확히으로 1 년 또는 3 둘러싸여 할 수없는 2세포를 휴식 0그 전에 몇 가지 단계가, 셀이 1 년 또는 3의 이웃 한 것을 의미하는 것이기 때문에, 세포 1와로 전환해야합니다 – 세포를 1이미 (모순). 따라서, 구별 무시 괜찮다 1하고 2그리고 상태 “모든 변경 11하고, 0(A)에 1있는 경우에만이 제로 이웃 홀수가 있으면한다. ‘

그 결과로 생성 된 셀룰러 오토 마톤은 실제로 원래와 동일하지만, 유일한 차이점은 “깨어있는”및 “자고있는”술취한 사람 사이에 구별이 없다는 것입니다. 이 패턴은 OEIS A169707에 설명되어 있습니다.

Print@@@CellularAutomaton[{750,{2,{a={0,2,0},2-a/2,a}},{1,1}},{j={{1}},0},{j#}]&

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

처음 16 개의 반복을 나란히 비교 :

여기에 이미지 설명을 입력하십시오

두 개의 연속 반복을 추가하면 챌린지 사양 (94 바이트)을 따르는 결과가 나타납니다.

Print@@@Plus@@CellularAutomaton[{750,{2,{a={0,2,0},2-a/2,a}},{1,1}},{{{1}},0},{Ramp@{#-1,#}}]&

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


답변

파이썬 2 , 192 바이트

x=input()
o=c={x+x*1j}
R=range(x-~x)
exec"n=[C+k for k in-1j,1j,-1,1for C in c];n={k for k in n if(k in o)<2-n.count(k)};o|=c;c=n;"*x
print[[`(X+Y*1jin c)+(X+Y*1jin o|c)`for Y in R]for X in R]

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

Xcoder 덕분에 -17 바이트
Jonathan의 출력 형식을 사용하는 -9 바이트 -Lynn 덕분에
-11 바이트
ovs 덕분에 -3 바이트


답변

C, 360 354 343 319

#define A(i,b,e)for(int i=b;i<e;++i)
#define B(b,e)A(r,b,e){A(c,b,e)
#define W(n)(n<0?-(n):n)
#define C(r,c)b[W(r)*s+W(c)]
#define D C(r,c)

q(n){char N,s=n+2,(*b)[2]=calloc(s,2*s);C(0,0)
[1]=1;A(g,0,n+1){B(0,s)*D=D[1];}B(0,g+2){N=(*C
(r-1,c)+*C(r+1,c)+*C(r,c-1)+*C(r,c+1))&1;D[1]=
*D?2:N;}}}B(2-s,s-1)putchar(*D+32);puts("");}}

비줄 뒤의 #define줄 바꿈은 여기에 표시하기위한 것이므로 계산에 포함되지 않습니다. 래퍼 함수를 ​​포함 했으므로 함수가 계산되지 않고 n다른 곳에서 온 것으로 가정하면 -6 (313) 입니다. q(10)출력 :

          !
          "
        !"""!
         !"!
         """
        " " "
       """""""
      "  """  "
  !  ""  """  ""  !
  "!" """ " """ "!"
!"""""""""""""""""""!
  "!" """ " """ "!"
  !  ""  """  ""  !
      "  """  "
       """""""
        " " "
         """
         !"!
        !"""!
          "
          !

사용하여 빈을 위해 ", 그리고 수면을 위해 !깨어을 위해.

이것은 다음과 같이 작동합니다.

  • A(i,b,e)“∀i∈ [b, e)”, B(b,e)“∀r∈ [b, e) .∀c∈ [b, e)”입니다.

  • n 세대 후 보드는 2 n + 1 평방입니다.

  • 보드의 대칭으로 인해 오른쪽 하단 사분면 만 시뮬레이션하면되므로 나중에 이웃 조회를 위해 1 행 및 열의 패딩을 가진 n + 1 정사각형 행렬을 할당합니다 ( n + 2).

  • 로 할당 calloc하면 동시에 너비에 높이를 곱하고 보드를 0비 웁니다 (빈).

  • 좌표 ( CD) 로 셀을 찾을 때 행과 열의 절대 값 ( W)을 사용하여 좌표를 자동으로 미러링합니다.

  • 보드는 현재 세대와 이전 세대를 나타내는 정수 쌍의 배열로 저장됩니다. 문제의 정수 char는 피할 수 있습니다 sizeof.

  • (주변 테스트에 의해) 가장 자주 조회 된 세대는 과거 세대이므로 인덱스 0에 쌍으로 배치되어로 액세스 할 수 있습니다 *.

  • 각 세대 ( g)에서 현재 세대는 B루프를 사용하여 이전 세대에 복사 된 다음 새 세대는 이전 세대 에서 생성됩니다.

  • 각 셀은 0비우기, 1깨우기 및 2잠자기 용도로 사용됩니다. 네이버 링 카운트는 원래 4 개의 네이버 가 슬립 (sleep N)에 사용하여 플래그 ( ) 로 시프트 및 OR 될 때 셀의 하위 4 비트에 설정된 비트 수의 계산이었습니다 16. 그러나 홀수의 이웃이 정확히 1 이웃에 해당한다는 것을 관찰하면 1의 마스크를 사용하여 여러 문자를 저장할 수 있습니다.

  • 마지막으로 보드는 동일한 절대 값 좌표 트릭, 마이너스 패딩을 사용하여 오른쪽 아래 사분면을 반복하여 완전히 인쇄되어 보드에 외부 패딩을 인쇄하지 않습니다. 이것이 B외부 루프에 여분의 줄 바꿈 명령문이 있기 때문에 루프에 여는 중괄호가 포함 된 이유이기도합니다 .

  • ASCII 코드는 0 + 32 (비어 있음)를 공백에, 2 + 32 (sleeping) ~ "에, 1 + 32 (wake) ~에 편리하게 매핑 합니다 !.

전체적으로 나는 이것이 문제의 좋은 구조로 인해 놀랍도록 읽기 쉬운 골프라고 생각합니다.


답변

MATL , 39 바이트

QtE:=&*G:"tt0=w1Y6Z+Xj1=*w|gJ*+]Q|U31+c

이 표시

  • Empty(공간)
  • Awake 같이 #
  • Sleeping!.

온라인으로 사용해보십시오! 패턴 ASCII 아트 또는 그래픽 (수정 된 코드)으로 커지는 것을 볼 수도 있습니다.

설명

코드는 복잡한 번호를 사용 0, 1, j각각 자고, 빈, 웨이크 : 세 가지 상태를 나타냅니다.

Q         % Implicitly input n. Add 1
tE        % Duplicate and multiply by 2
:         % Range [1 2 ... 2*n]
=         % Test for equalty. Gives [0 ... 0 1 0... 0], with 1 at position n
&*        % Matrix of all pairwise products. Gives square matrix of size 2*n
          % filled with 0, except a 1 at position (n,n). This is the grid
          % where the walk will take place, initiallized with an awake cell
          % (value 1). The grid is 1 column and row too large (which saves a
          % byte)
G:"       % Do n times
  tt      %   Duplicate current grid state twice
  0=      %   Compare each entry with 0. Gives true for empty cells, false
          %   for the rest
  w       %   Swap: moves copy of current grid state to top
  1Y6     %   Push 3×3 matrix with Von Neumann's neighbourhood
  Z+      %   2D convolution, maintaining size
  Xj      %   Real part
  1=      %   Compare each entry with 1. This gives true for cells that
          %   have exactly 1 awake neighbour
  *       %   Multiply, element-wise. This corresponds to logical "and":
          %   cells that are currently empty and have exactly one awake
          %   neighbour. These become 1, that is, awake
  w       %   Swap: moves copy of current grid state to top
  |g      %   Absolute value, convert to logical: gives true for awake or
          %   sleeping cells, false for empty cells
  J*+     %   Mulltiply by j and add, element-wise. This sets awake and
          %   sleeping cells to sleeping. The grid is now in its new state
]         % End
Q         % Add 1, element-wise. Transforms empty, awake, sleeping
          % respectively from 0, 1, j into 1, 2, 1+j
|U        % Abolute value and square, element-wose. Empty, awake, sleeping
          % respectively give 1, 4, 2
31+c      % Add 31 element-wise and convert to char. Empty, awake, sleeping
          % respectively give characters ' ' (codepoint 32), '#' (codepoint
          % 35) and '!' (codepoint 33). Implicitly display


답변

비 펀지, 384 304 바이트

&:00p->55+,000g->>00g30p:40p\:50p\5>>40g!50g!*vv0g05g04p03-<
@,+55_^#`g00:+1$_^>p:4+4g5%2-50g+5#^0#+p#1<v03_>30g:!#v_:1>^
#v_>$99g,1+:00g`^ ^04+g04-2%5g4:\g05\g04\p<>g!45*9+*3+v>p:5-
 >\50p\40p\30p:#v_>>0\99g48*`!>v >30g:1-30^>>**\!>#v_>v^9 9<
$0\\\\0$        >\99g88*-!+\:4->#^_\>1-!48>^       >$3>48*+^

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

Befunge에서 이런 종류의 것을 구현하려고 할 때의 문제는 제한된 메모리 크기 (데이터와 코드 모두 2000 바이트)입니다. 따라서 이전 계산을 참조하지 않고 주어진 좌표에 대한 올바른 문자를 계산하는 알고리즘을 사용해야했습니다. 그것은 술 취한 사람이 그 지점에 도달하기 위해 따라 왔을 수있는 모든 가능한 경로를 재귀 적으로 되돌아 보면서이를 달성합니다.

불행히도 이것은 효율적인 솔루션이 아닙니다. 작동하지만 엄청나게 느리고 n 값이 클수록 기하 급수적으로 느려집니다 . 따라서 최대 약 127 (Befunge의 7 비트 메모리 셀 제한)까지 모든 n에서 작동 할 수는 있지만 실제로 결과를 기다리는 데 관심을 잃을 수는 없습니다. TIO에서는 약 6 초 (최고) 이상이면 60 초 시간 초과가 발생합니다. 컴파일러는 훨씬 더 잘 수행하지만, 심지어 10보다 훨씬 더 높은 것을 원하지 않을 것입니다.

아직도, 나는 그것이 Befunge에서 재귀적인 “함수”를 실제로 보여주기 때문에 제출할 가치가 있다고 생각했습니다.


답변

파이썬 2 , 214 바이트

def f(n):k=n-~n;N=k*k;A=[0]*N;A[N/2]=2;exec"A=[[2*([j%k>0and A[j-1],j%k<k-1and A[j+1],j/k>0and A[j-k],j/k<k-1and A[j+k]].count(2)==1),1,1][v]for j,v in enumerate(A)];"*n;print[map(str,A)[k*x:][:k]for x in range(k)]

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

설명

사용 0을 위해 empty, 1위해 sleeping2위해 awake. 2 차원 문자 (한 길이의 문자열) 목록을 인쇄합니다.
음수가 아닌 정수를받는 함수를 정의합니다 n. 원하는 상태에 도달 할 때까지 셀룰러 오토 마톤을 계속 진행합니다. 마지막으로, 내부 정수 값과 실제 문자 사이의 변환이 적용됩니다.


답변

루아 , 251 242 239 238 바이트

추가 선행 공백을 희생하여 배열 이니셜 라이저를 단순화하여 -8 바이트.
변경함으로써 -1 바이트 c=i==2+...and print(s)c=i~=2+...or print(s).
완전한 문자열을 먼저 작성하고 마지막에 한 번 인쇄하여 -3 바이트.
-1 바이트 감사 조나단 FRECH 재 작성함으로써 or(g(...)==1 andor(1==g(...)and.

function g(x,y)return(a[x]or{})[y]or 0 end a={{1}}for i=2,2+...do n={}s=""for x=-i,i do n[x]=n[x]or{}q=a[x]or{}for y=-i,i do n[x][y]=q[y]and 0or(1==g(x+1,y)+g(x,y+1)+g(x-1,y)+g(x,y-1)and 1)s=s..(q[y]or" ")end s=s.."\n"end a=n end print(s)

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

비우기 = 공간
깨우기 = 1
수면 =0

명령 행에서 입력을 가져 와서 stdout으로 인쇄합니다.

상태를 false/ nil로 표시 1하고 0내부적으로 “빈”감지는 코드가 필요하지 않으며 “정확하게 하나의 깨어”확인을 추가로 수행 할 수 있습니다.