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 방울 후 :
50000 방울 떨어 뜨린 후 (≈4 초) :
333333 방울 떨어 뜨린 후 (≈15 분) :
당신도 그것을 그릴 수 있습니다!
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이므로 원하는 높이의 스택으로 시작할 수 있으므로 중복 루프를 제거하고 생산성을 크게 향상 시켰습니다!
0
있습니까? 그 출력은 무엇입니까?