알코올의 영향을받는 격자 위의 사람은 모든 방향으로 갈 가능성이 동일하다는 것은 잘 알려져 있습니다. 그러나이 상식적인 진술은 아주 작은 술꾼 의 영역에는 적용되지 않으며 , 그 행동은 마치 한 번에 모든 가용 경로를 취하는 것처럼 행동 하며 가능한 경로가 서로 간섭 할 수 있습니다. 당신의 임무는 n
단계 후 이러한 양자 취한 사람의 가능한 위치를 표시하는 것 입니다.
사양
문제의 음주는 정사각형 격자를 차지하며 다음과 같은 간단한 규칙을 따르는 Von Neumann (플러스 모양) 이웃을 사용하는 3 상태 셀룰러 오토 마톤으로 간주 될 수 있습니다.
Empty
가는Awake
정확히 하나에 인접한 경우Awake
와 그렇지 않은 경우로 이동Empty
Awake
로 이동Sleeping
Sleeping
로 이동Sleeping
보드의 초기 상태 Awake
는 Empty
s 의 무한 필드로 둘러싸인 단일 입니다.
도전
음이 아닌 정수가 주어지면 단계 n
후 술고래의 ASCII 표현을 작성 n
하십시오. 각 상태는 다른 문자로 표시되어야하며 솔루션은 어떤 문자가 어떤 상태를 의미 하는지를 명시해야합니다. 에 공백을 사용 Empty
하는 경우 줄 끝에 공백 을 포함 할 필요가 없습니다.
이것은 code-golf 이므로 가장 짧은 답변이 이깁니다. 표준 허점 적용, 선행 및 후행 공백 허용, 문자열 배열 / 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
또는 2
로 2
변경 0
하고 1
그 1
주위에 홀수가있는 경우에만 변경 “을 의미 합니다.
Print@@@
배열을 인쇄하십시오.
” ‘odd 1
s’의 반증 명은 ‘정확하게 하나 1
‘ ‘와 같습니다.
이 5×5 격자 픽셀을 고려하십시오. 흰색은 셀 0
또는 2
깨어 있지 않은 픽셀이고 회색은 1
셀입니다.
1
셀이 세 개의 0
셀 주위에서 생성 된 경우 그리드는 다음과 같이 표시되어야합니다. 셀은 다음과 같이 1
U 자형 (또는 회전 된 버전)으로 정렬됩니다.
이 세포 성 오토 마톤의 자기 유사성으로 인해, 세포 성 오토 마톤에 나타나는 임의의 패턴은 (유도에 의해) 대각선에 나타나야한다. 그러나이 패턴은 대각선 대칭이 아닙니다. 즉, 대각선에서는 발생할 수 없으며 셀룰러 오토 마톤의 어느 곳에 나 나타날 수 없습니다.
깨어 / 잠자는 동등
• 그래도 참고 0
셀이 정확히으로 1 년 또는 3 둘러싸여 할 수없는 2
세포를 휴식 0
그 전에 몇 가지 단계가, 셀이 1 년 또는 3의 이웃 한 것을 의미하는 것이기 때문에, 세포 1
와로 전환해야합니다 – 세포를 1
이미 (모순). 따라서, 구별 무시 괜찮다 1
하고 2
그리고 상태 “모든 변경 1
을 1
하고, 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
비 웁니다 (빈). -
좌표 (
C
및D
) 로 셀을 찾을 때 행과 열의 절대 값 (W
)을 사용하여 좌표를 자동으로 미러링합니다. -
보드는 현재 세대와 이전 세대를 나타내는 정수 쌍의 배열로 저장됩니다. 문제의 정수
char
는 피할 수 있습니다sizeof
. -
(주변 테스트에 의해) 가장 자주 조회 된 세대는 과거 세대이므로 인덱스 0에 쌍으로 배치되어로 액세스 할 수 있습니다
*
. -
각 세대 (
g
)에서 현재 세대는B
루프를 사용하여 이전 세대에 복사 된 다음 새 세대는 이전 세대 에서 생성됩니다. -
각 셀은
0
비우기,1
깨우기 및2
잠자기 용도로 사용됩니다. 네이버 링 카운트는 원래 4 개의 네이버 가 슬립 (sleepN
)에 사용하여 플래그 ( ) 로 시프트 및 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
위해 sleeping
및 2
위해 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 and
로 or(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
내부적으로 “빈”감지는 코드가 필요하지 않으며 “정확하게 하나의 깨어”확인을 추가로 수행 할 수 있습니다.