샌드 파일 만들기


59

아벨 sandpile는 , 우리의 목적을 위해, 모래의 처음에 빈 정수 좌표 무한 그리드입니다. 매초마다 모래 알갱이가 (0,0)에 배치됩니다. 그리드 셀에 4 개 이상의 모래 알갱이가있을 때마다 한 개의 모래 알갱이가 네 개의 이웃에 동시에 쏟아집니다. (x, y)의 이웃은 (x-1, y), (x + 1, y), (x, y-1) 및 (x, y + 1)입니다.

세포가 엎질러지면 이웃이 엎질러 질 수 있습니다. 몇 가지 사실 :

  • 이 폭포는 결국 멈출 것입니다.
  • 세포가 유출되는 순서는 관련이 없습니다. 결과는 같습니다.

3 초 후 그리드는

.....
.....
..3..
.....
.....

4 초 후 :

.....
..1..
.1.1.
..1..
.....

15 초 후 :

.....
..3..
.333.
..3..
.....

그리고 16 초 후 :

..1..
.212.
11.11
.212.
..1..

도전

가능한 한 적은 바이트로 단일 양의 정수 t 를 취하고 t 초 후에 sandpile의 그림을 출력하는 함수를 작성하십시오 .

입력

선택한 모든 형식 의 단일 양의 정수 t 입니다.

산출

문자를 사용하여 t 초 후 샌드 파일 사진

 . 1 2 3

편집 : 좋아하는 네 개의 다른 문자를 사용하거나 그림을 그립니다. ".123"또는 "0123"을 사용하지 않는 경우 답에서 문자가 의미하는 것을 지정하십시오.

예제와 달리, 출력에는 샌드 파일의 0이 아닌 부분을 표시하는 데 필요한 최소한의 행과 열이 포함되어야합니다.

즉, 입력 3의 경우 출력은

 3

4의 경우 출력은

 .1.
 1.1
 .1.

채점

표준 골프 득점이 적용됩니다.

규칙

샌드 파일이 무엇인지 이미 알고있는 언어 함수 나 라이브러리는 없습니다.

편집 : 출력 섹션이 편집되었으며 문자 세트 제한이 완전히 해제되었습니다. 원하는 네 가지 고유 한 문자 나 색상을 사용하십시오.


2
입력 t는 될 수 0있습니까? 그 출력은 무엇입니까?
Luis Mendo

1
주어진 단계에서 여러 개의 계단식이 연속으로 발생할 수 있습니까? 그래서 그 시간 단계에서 캐스케이드는 모든 셀이 다시 3 이하가 될 때까지 계속 발생합니까?
flawr

2
@flawr : 그렇습니다. t = 15와 t = 16의 차이를보십시오.
El'endia Starman

@LuisMendo 입력이 양의 t 로 지정 되었으므로 0은 유효한 입력이 아닙니다.
Eric Tressler

1
.빈 셀 이 있어야 합니까? 0유효한 빈 셀로 사용할 수 있습니까 ?
Andreï Kostyrka

답변:


56

R, 378 343 297 291 바이트

일반적으로 사용자는 scan()(이미 변수 t를 사용 했으므로 z대신 사용하십시오) 를 통해 입력을 제공 하므로 두 번째 줄은 별도로 시작한 다음 나머지를 실행해야합니다.

e=numeric
a=1%*%scan()
x=1
o=a>3
n=1
while(any(o)){
v=which(o,T)
if(any(v==1)){a=rbind(e(n+2),cbind(e(n),a,e(n)),e(n+2));x=x+1;n=n+2;v=which(a>3,T)}
q=nrow(v)
u=cbind(e(q),1)
l=v-u[,1:2];r=v+u[,1:2];t=v-u[,2:1];b=v+u[,2:1]
a[l]=a[l]+1;a[r]=a[r]+1;a[t]=a[t]+1;a[b]=a[b]+1
a[v]=a[v]-4
o=a>3}
a

의 값을 포함하는 어레이 출력 a에서 t번째 세대 (0, 1, 2 또는 3).

테스트 사례 :

z=3
     [,1]
[1,]    3
z=4
     [,1] [,2] [,3]
[1,]    0    1    0
[2,]    1    0    1
[3,]    0    1    0
z=16
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    1    0    0
[2,]    0    2    1    2    0
[3,]    1    1    0    1    1
[4,]    0    2    1    2    0
[5,]    0    0    1    0    0

이것은 수직 및 수평으로 대칭 적이라는 것을 의미합니다. 즉, 가장 왼쪽 지점이 4의 높이를 가짐을 의미합니다. 이는 가장 높은 지점, 가장 오른쪽 및 가장 낮은 지점도 4임을 의미합니다.

아, 그리고 당신은 아름다운 시각화를 할 수 있다고 말했습니까?

1000 방울 후 :

1000 단계 후의 아벨 리안 샌드 파일

50000 방울 떨어 뜨린 후 (≈4 초) :

50000 단계 후 Abelian sandpile

333333 방울 떨어 뜨린 후 (≈15 분) :

100000 단계 후 Abelian sandpile

당신도 그것을 그릴 수 있습니다!

image(1:n,1:n,a,col=colorRampPalette(c("#FFFFFF","#000000"))(4), axes=F, xlab="", ylab="")

이 작업은 10000 회 반복에 4 초가 걸리지 만 더 큰 배열 크기 (예 : 100000 회 반복에 몇 분)에서는 상당히 느려집니다. 그렇기 때문에 성장 속도가 느리고 ( 성장률τ (i) ≈ 689 · i ^ 1.08을 얻었으므로 i단계 이후에 전체 모래 더미가 침전 될 때까지 1 개의 추가 곡물 당 평균 시간이 1 보다 약간 큽니다) 곡물 수의 함수로서의 총 시간은 2 차보다 조금 느리게 성장합니다 (T (i) ≈0.028 * i ^ 1.74).

파일이 안정화 될 때까지 평균 반복

대략적인 계산 시간

그리고 이제 완전한 설명과 함께 :

e=numeric # Convenient abbreviation for further repeated use
a=1%*%scan() # Creates a 1×1 array with a user-supplied number
x=1 # The coordinate of the centre
o=a>3 # Remember which cells were overflown
n=1 # Array height that is going to change over time
while(any(o)){ # If there is still any overflow
  v=which(o,T) # Get overflown cells' indices
  if(any(v==1)){ # If overflow occurred at the border, grow the array
    a=rbind(e(n+2),cbind(e(n),a,e(n)),e(n+2)) # Growing
    x=x+1 # Move the centre
    n=n+2 # Change the height
    v=which(a>3,T) # Re-index the overflowed cells
    }
  q=nrow(v) # See how many indices are overflown
  u=cbind(e(q),1) # Building block for neighbours' indices
  l=v-u[,1:2];r=v+u[,1:2];t=v-u[,2:1];b=v+u[,2:1] # L, R, T, B neighbours
  a[l]=a[l]+1;a[r]=a[r]+1;a[t]=a[t]+1;a[b]=a[b]+1 # Increment neighbours
  a[v]=a[v]-4 # Remove 4 grains from the overflown indices
  o=a>3} # See if still overflown indices remain
a # Output the matrix

값이 a <- c(a, 1)큰 빈 행렬을 미리 할당하고 0을 사용하지 않는 점진적으로 채우는 것보다 객체를 키우는 것보다 훨씬 빨리 작동하는 것은 인생에서 처음 입니다.

최신 정보. 제거하여 18 바이트 Golfed arr.ind에서 which때문에 Billywob 및 교체 rep(0,n)e=numeric;e(n)때문에 5 개 인스턴스에 JDL 및 때문에 17 이상의 바이트 JDL .

업데이트 2. 샌드 파일은 Abelian이므로 원하는 높이의 스택으로 시작할 수 있으므로 중복 루프를 제거하고 생산성을 크게 향상 시켰습니다!


1
여분의 열에 대한 당신의 요점을 알 수 있습니다. 행 인덱스는 출력하고 있지만 출력은 단지 "답변"으로 제한하고 싶습니다. 그래도 사진을 포함해서 다행입니다.
Eric Tressler

1
좋은 답변 Andreï! 예를 들어 rep()6 번 사용하면 미리 정의하는 등 몇 바이트를 확실히 골프를 칠 수 있습니다. 둘째, 함수에 대한 arr.ind=T옵션 을 작성해야한다고 생각하지 않습니다 which(). 간단하게 사용하십시오 which(...,T).
Billywob

1
보다 적은 수의 문자 n=numeric이기 때문에 대신 정의 하고 사용하는 것이 골퍼 일 수 있습니다 . 나는 그림을 좋아한다. n(k)r(0,k)
JDL

1
또 다른 제안 : 1%*%0은보다 적은 문자 array(0,c(1,1))입니다. 또한 두 번째 인수 u <- cbind는 1 일 cbind수 있으며 기본적으로 첫 번째 인수의 길이로 확장됩니다.
JDL

1
@GregMartin이 문제를 해결했습니다. 그 죄송합니다; 제 1 언어에서, 우리는“자아”라는 단어를 사용하며 문제의 사람의 성별 (“남자를위한 작은 발걸음”과 같은)에 대해 결코 신경 쓰지 않습니다. 이 "를"해야 반면 여전히 가끔, 아주 드문 경우에, 내가 좋아하는, 당신이 주인이고,하지 않는 한, 개를 "그녀"또는 "고"전화 정말 당신의 anumal의 섹스 (강조하고 싶은 여성에게 남성에게 말하는 것이 그렇게 어렵지 않다는 사실에도 불구하고).
Andreï Kostyrka

13

MATL , 55 53 48 43 42 바이트

@flawr의 답변에서 영감을 얻었습니다 .

그래픽 출력 :

0i:"Gto~+XytP*+t"t4=t1Y6Z+b+w~*]]tat3$)1YG

MATL Online에서 사용해보십시오! . 입력하는 데 약 10 초가 걸립니다 30. 페이지를 새로 고침하고 작동하지 않으면 "실행"을 다시 눌러야 할 수도 있습니다.

입력 결과는 다음과 같습니다 100.

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

ASCII 출력 (43 바이트) :

0i:"Gto~+XytP*+t"t4=t1Y6Z+b+w~*]]tat3$)48+c

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

설명

0          % Push a 0. This is the initial array. Will be resized in first iteration
i:         % Take input n. Generate range [1 2 ... n]
"          % For each, i.e. repeat n times
  Gto~+    %   Push input and add negate parity. This "rounds up" n to odd number
           %   m = n or n+1
  Xy       %   Identity matrix with that size
  tP*      %   Multiply element-wise by vertically flipped copy. This produces a
           %   matrix with a 1 in the center and the rest entries equal to 0
  +        %   Add to previous array. This updates the sandpile array
  t        %   Duplicate
  "        %   For each column (i.e. repeat m times)
    t4=    %     Duplicate. Compare with 4 element-wise. This gives a 2D mask that
           %     contains 1 for entries of the sandpile array that equal 4, and 0
           %     for the rest
    t      %     Duplicate
    1Y6    %     Predefined literal: [0 1 0; 1 0 1; 0 1 0]
    Z+     %     2D convolution, maintaining size
    b      %     Bubble up to bring sandpile array to top
    +      %     Element-wise addition. This adds 1 to the neighbours of a 4
    w      %     Swap to bring copy of mask to top
    ~*     %     Multiply bu negated mask. This removes all previous 4
  ]        %  End
]          % End
t          % Duplicate the updated sandpile array
a          % 1D mask that contains 1 for columns that contain a 1. This will be
           % used as a logical index to select columns
t          % Duplicate. This will be used as logical index to select rows (this
           % can be done because of symmetry)
3$)        % Keep only those rows and columns. This trims the outer zeros in the
           % sandpile array
1YG        % Display as scaled image

3
나는 질투 1Y6합니다.
flawr

1
@flawr 그러나 당신 ~mod(spiral(3),2)은 훨씬 더 영리합니다 :-)
Luis Mendo

11

MATLAB, 160 (156) 148 바이트

n=input('');z=zeros(3*n);z(n+1,n+1)=n;for k=1:n;x=z>3;z=z+conv2(+x,1-mod(spiral(3),2),'s');z(x)=z(x)-4;end;v=find(sum(z));z=z(v,v);[z+48-(z<1)*2,'']

먼저 n중간에 어딘가에 너무 큰 행렬이 만들어 집니다. 그런 다음 계단식은 매우 편리한 2D 컨볼 루션으로 계산됩니다. 결국 초과분이 제거되고 모든 것이 문자열로 변환됩니다.

에 대한 예제 출력 t=100

...121...
..32.23..
.3.323.3.
123.3.321
2.23.32.2
123.3.321
.3.323.3.
..32.23..
...121...

언제나처럼 :

컨볼 루션은 성공의 열쇠입니다.


v=any(z)대신 v=find(sum(z))(내 대답에 사용하고 있습니다). 또한 2*~z대신(z<1)*2
Luis Mendo

컴퓨터가 입력을 멈췄습니다 n=500... n=400몇 초 동안 처리되었습니다 . 내가 뭔가 잘못하고 있습니까?
Andreï Kostyrka

@ AndreïKostyrka 그것은 나를 위해 일한다 (Matlab R2015b)
Luis Mendo

1
@ AndreïKostyrka n이 프로그램 의 입력을 위해 3*n x 3*n행렬을 생성 하므로 대략 9*n^2숫자 를 저장해야 합니다. 또한 1에서 n까지 완전히 불필요한 긴 반복이 있기 때문에 완전히 비효율적입니다. 그러나 다시 이것은 코드 골프 이며 프로그램을 효율적으로 만드는 것은 다른 차 한잔입니다.
flawr

@ AndreïKostyrka 희소 행렬 (두 번째 줄 :)을 사용 z=sparse(zeros(2*n+1))하고 for 루프를로 변경 하여 메모리 효율성을 높일 수 있습니다 while any(z(:)>3). 그런 다음 컨볼 루션 커널을 한 번만 계산할 수도 있습니다 kern = 1-mod(spiral(3),2).
flawr

9

파이썬 2, 195 +1 +24 = 220217

from pylab import*
ifrom scipy.signal import convolve2d as c
k=(arange(9)%2).reshape(3,3)
def f(n):g=zeros((n,n),int);g[n/2,n/2]=n;exec"g=c(g/4,k,'same')+g%4;"*n;return g[any(g,0)].T[any(g,0)]

n = 16에 대한 출력

array([[0, 0, 1, 0, 0],
       [0, 2, 1, 2, 0],
       [1, 1, 0, 1, 1],
       [0, 2, 1, 2, 0],
       [0, 0, 1, 0, 0]])

n"충분한"상한값 으로 사용하여 불필요한 패딩 및 반복이 많이 발생 하지만 n = 200은 1 초 안에 완료되고 n = 500은 약 12 ​​초 안에 완료됩니다

언 골프

from pylab import*
from scipy.signal import convolve2d as c
k=array([0,1,0],
        [1,0,1],
        [0,1,0])
def f(n):
  g=zeros((n,n))                 # big grid of zeros, way bigger than necessary
  g[n/2,n/2]=n                   # put n grains in the middle
  exec"g=c(g/4,k,'same')+g%4;"*n # leave places with <4 grains as is, convolve the rest with the kernel k, repeat until convergence (and then some more)
  return g[any(g,0)].T[any(g,0)] # removes surrounding 0-rows and columns

로 교체 하면 한 문자 return ximshow(x)추가되고 못생긴 보간 된 이미지 imshow(x,'gray',None,1,'nearest')가 출력됩니다. 추가 하면 흐릿한 보간이 제거되어 출력이 사양에 도달합니다.

n = 100


코드를 실행할 때 다음 오류가 발생 ImportError: No module named convolve2d합니다.. 문제 import scipy.signal.convolve2d as cfrom scipy.signal import convolve2d as c해결하도록 변경 scipy 버전 0.16.1을 사용하고 있습니다. 이전 버전 또는 최신 버전이 필요합니까? 아니면 다른 문제입니까?
앤드류 엡스타인

이상하게도 이제는 더 이상 나에게도 효과가 없다고 언급했습니다. 대화식 모드에서 처음으로 제대로 한 다음 짧게하고 오류를 무시했지만 함수는 메모리에 그대로있었습니다.
DenDenDo

6

펄, 157147 바이트

에 +1 포함 -p

STDIN의 수로 실행하고 0123STDOUT을 사용하여 맵을 인쇄합니다 .

sandpile.pl <<< 16

sandpile.pl:

#!/usr/bin/perl -p
map{++substr$_,y///c/2-1,1;/4
/?$.+=s%^|\z%0 x$..$/%eg+!s/\b/0/g:s^.^$&%4+grep{3<substr$\,0|$_+"@+",1}-$.-2,-2,0,$.^eg while/[4-7]/}($\="0
")x$_}{

5

파이썬 3 2 418 385 362 342 330 바이트

w='[(i,j)for i in r(n)for j in r(n)if a[i][j]>3]'
def f(z):
 a,x,r=[[z]],0,range
 for _ in[0]*z:
  n=len(a);v=eval(w)
  if[1for b,c in v if(b==0)+(c==0)]:n+=2;a=[[0]*n]+[[0]+a[i]+[0]for i in r(n-2)]+[[0]*n];x+=1;v=eval(w)
  for c,d in v:exec'a[c+%s][d+%s]+=1;'*4%(-1,0,1,0,0,-1,0,1);a[c][d]-=4
 for i in a:print''.join(map(str,i))

편집 : @ Qwerp-Derp 덕분에 6 바이트 저장

이것은 그의 R 코드를 파이썬으로 직접 변환하기 때문에 @ Andreï Kostyrka에 대한 모든 공로입니다.


할당을 a,x,r함수 인수로 옮길 수 있다고 생각합니다 .
Loovjo

1
코드를 몇 바이트 줄였습니다.별로 많지는 않지만해야 할 일입니다. 답변을 편집하고 Python 버전을 Python 2로 변경해도 괜찮습니까?
clismique

@ Qwerp-Derp : 부담없이! 당신이 한 일을보고 싶습니다.
앤드류 엡스타인

3

자바 스크립트, 418 416 406 400 393 바이트

콘솔에 출력을 표시하는 익명 함수를 작성합니다.

var f =
    t=>{a=(q,w)=>Math.max(q,w);c=_=>{x=a(p[0],x);y=a(p[1],y);m[p]=(g(p)+1)%4;if(!m[p]){s.push([p[0],p[1]]);}};x=y=0,m={};g=k=>{v=m[k];return!v?0:v;};m[o=[0,0]]=1;s=[];while(--t){m[o]=(m[o]+1)%4;if(!m[o]){s.push(o);}while(s.length){p=s.pop();p[0]++;c();p[0]-=2;c();p[0]++;p[1]++;c();p[1]-=2;c();p[1]++;}}s='';for(i=-x;i<=x;i++){for(j=-y;j<=y;j++){v=g([i,j]);s+=v==0?'.':v;}s+='\n';}console.log(s);}
<input id="i" type="number"><input type="button" value="Run" onclick="var v = +document.getElementById('i').value; if (v>0) f(v)">


1
경고 : 입력하지 않고 '실행'을 눌렀는데 화면이 충돌했습니다 (무한 루프). 나만큼 바보하지 마십시오.
roberrrt-s

1
@Roberrrt 나는 이것을 막기 위해 대답을 업데이트했습니다.
hetzi

3

님, 294 자

import os,math,sequtils,strutils
var
 z=parseFloat paramStr 1
 y=z.sqrt.toInt+1
 w=y/%2
 b=y.newSeqWith newSeq[int] y
 x=0
proc d(r,c:int)=
 b[r][c]+=1;if b[r][c]>3:b[r][c]=0;d r-1,c;d r,c+1;d r+1,c;d r,c-1
for i in 1..z.toInt:d w,w
while b[w][x]<1:x+=1
for r in b[x..< ^x]:echo join r[x..< ^x]

컴파일 및 실행

nim c -r sandbox.nim 1000

노트:

  1. 고정 테이블 크기를 사용하는 더 짧은 버전을 만들 수 있었지만 동적 버전을 선호하여 편집했습니다.
  2. 샌드 박스가 계산되면 x중간 행의 시작 부분에서 0 열의 수로 계산됩니다.
  3. 표시를 위해 x각 끝에서 행과 열을 제외하여 테이블이 분할됩니다 .

공연

nim c --stackTrace:off --lineTrace:off --threads:off \ 
      --checks:off --opt:speed sandbox.nim

time ./sandbox   10000       0.053s
time ./sandbox   20000       0.172s
time ./sandbox   30000       0.392s
time ./sandbox   40000       0.670s
time ./sandbox  100000       4.421s
time ./sandbox 1000000    6m59.047s

3

스칼라, 274 바이트

val t=args(0).toInt
val s=(Math.sqrt(t)+1).toInt
val (a,c)=(Array.ofDim[Int](s,s),s/2)
(1 to t).map{_=> ?(c,c)}
println(a.map{_.mkString}.mkString("\n"))
def?(b:Int,c:Int):Unit={
a(b)(c)+=1
if(a(b)(c)<4)return
a(b)(c)=0
?(b+1,c)
?(b-1,c)
?(b,c+1)
?(b,c-1)
}

용법:

scala sandpile.scala <iterations>

나는 이것에 대해 설명 할 것이 많지 않다고 생각합니다. 기본적으로 중앙에 한 알의 모래 만 추가합니다. 그런 다음 4보다 큰지 확인하고, 엎질러지면 4보다 큰 모든 이웃을 확인하고 엎질러지는 등을 확인하십시오. 매우 빠릅니다.

공연:

  • t = 10000 72ms
  • t = 20000 167ms
  • t = 30000 419ms
  • t = 40000 659ms
  • t = 100000 3413ms
  • t = 1000000 약 6 분

내 프로그램은 (0,0)을 중심으로 샌드 파일이 먼저 t = 1552에서 반경 15에 도달한다고 제안합니다. 저장하려면 31x31 배열이 필요합니다 (좌표 -15 ~ 15 포함). t = 5000을 통해 이것이 정확합니까?
Eric Tressler

논리가 맞다고 생각하지만 이것이 올바른지 확실하지 않습니까? t> 5593에서 범위 예외에서 배열 인덱스를 얻습니다.
AmazingDreams

내가 증가하고 유출을 즉시 확인하면 t = 1552에서 범위를 벗어납니다. 그것이 올바른 구현이라고 말하고 싶습니다. 코드를 업데이트했습니다.
AmazingDreams

컴파일러 최적화를 통해 C 또는 Fortran에서 직접 배열 조작을 통해서만 성능을 달성 할 수 있습니다. 부럽다
Andreï Kostyrka

@ AndreïKostyrka, 네, 스칼라가 빛나는 곳입니다! 내 출력은 사양을 준수하지 않으므로 그 작업을해야합니다.
AmazingDreams

2

J, 76 바이트

p=:0,.~0,.0,~0,]
p`(4&|+3 3([:+/@,*&(_3]\2|i.9));._3[:<.4%~p)@.([:*/4>{.)^:_

p입력 주위에 0의 경계를 채우는 동사 를 정의합니다 . 주동 사는 배열을 입력으로받습니다. 그런 다음 첫 번째 행에서 4 개 이상의 곡물이 포함 된 샌드 파일을 검사합니다. 그렇다면 패딩을 사용하여 채워진 것을 제외하고 동일한 배열을 출력 p하고 그렇지 않으면 떨어지는 곡물을 시뮬레이션하기 위해 2D 컨벌루션을 수행합니다. 주동 사는 전력 연산자를 사용하여 수렴 될 때까지 반복 ^:_됩니다.

용법

   p =: 0,.~0,.0,~0,]
   f =: p`(4&|+3 3([:+/@,*&(_3]\2|i.9));._3[:<.4%~p)@.([:*/4>{.)^:_
   f 15
0 3 0
3 3 3
0 3 0
   f 50
0 0 0 1 0 0 0
0 0 3 1 3 0 0
0 3 2 2 2 3 0
1 1 2 2 2 1 1
0 3 2 2 2 3 0
0 0 3 1 3 0 0
0 0 0 1 0 0 0
   timex 'r =: f 50000'
46.3472
   load 'viewmat'
   ((256#.3&#)"0<.255*4%~i._4) viewmat r

n = 50000 의 결과를 계산하는 데 약 46 초가 걸리며 , 결과는 viewmat단색 색 구성표가있는 애드온을 사용하여 표시 될 수 있습니다 .

그림


2

C 229 (경고가 많음)

G[99][99],x,y,a=99,b=99,c,d;S(x,y){if(++G[y][x]>3)G[y][x]=0,S(x+1,y),S(x-1,y),S(x,y+1),S(x,y-1);a=x<a?x:a;b=y<b?y:b;c=x>c?x:c;d=y>d?y:d;}F(t){for(;t--;)S(49,49);for(y=b;y<=d;y++){for(x=a;x<=c;x++)printf("%d ",G[y][x]);puts("");}}

/* call it like this */
main(_,v)char**v;{F(atoi(v[1]));}

좋아, 포기 : 왜 배열이 99 x 98입니까?
Eric Tressler

@EricTressler 테스트에서 어떻게 찾지 못했습니까?!
Jerry Jeremiah


1

PHP, 213 바이트

function d($x,$y){global$p,$m;$m=max($m,$x);$q=&$p[$y][$x];if(++$q>3){$q=0;d($x+1,$y);d($x-1,$y);d($x,$y+1);d($x,$y-1);}}while($argv[1]--)d(0,0);for($y=-$m-1;$y++<$m;print"\n")for($x=-$m;$x<=$m;)echo+$p[$y][$x++];

$p크기를 기억하면서 재귀 적으로 파일을 생성합니다 $m. 그런 다음 중첩 루프로 인쇄합니다.
로 실행하십시오 -r.

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