벌집의 이상한 삶


19

연구원들은 최근 무한한 벌집 분야에 사는 흥미로운 꿀벌 식민지를 발견했습니다.

벌집

각 세포는 꿀벌을 수용 할 수 있습니다. 사실, 그 생물들의 삶은 약간 혼란스러워 보입니다. 식민지는 항상 다음 패턴으로 시작한다고 계산할 수 있습니다.

초기 패턴

( Emimanuel BoutetWikimedia Commons 에 그린 비 .이 벌집 이미지는 CC-By-SA 에서 공개됩니다 . grumbles )

그 후 꿀벌의 수명주기는 소위 세대로 나뉩니다. 각 세대의 오래된 벌은 죽고 새로운 벌은 부화하며 주로 세포의 이웃에 달려 있습니다.

  • 꿀벌이 이웃이 두 개 미만인 경우 외로움으로 인해 사망합니다.
  • 꿀벌이 이웃이 3 명 이상이면 과밀로 인해 사망합니다.
  • 세포가 이웃 세포에 2, 3 또는 4 개의 살아있는 벌을 가지고 있다면, 새로운 꿀벌이 다음 세대에 부화합니다.

죽어가는 꿀벌은 세대가 끝날 때까지 죽지 않으므로 다음 세대에 꿀벌을 부화시킬 수있는 주변 세포에 영향을 미칩니다.

이제 우리는 그러한 식민지가 어떻게 작동하는지 알았으므로 여러 세대를 통해 시뮬레이션 할 수 있습니다.

입력

입력은 표준 입력에서 줄 바꿈으로 끝나는 단일 숫자 N 입니다. 0 ≤ N ≤ 150. 시뮬레이션 할 세대 수입니다.

산출

출력은 표준 출력에서 ​​단일 숫자이며 선택적으로 단일 줄 바꿈이 뒤 따릅니다. 이는 N 세대 이후의 살아있는 벌 수를 나타냅니다 .

표준 오류에 대한 추가 출력은 무시됩니다.

샘플 입력

0
5
42
100

샘플 출력

6
44
1029
5296

승리 조건

골프에서 관례 적으로 가장 짧은 코드가 승리합니다. 동점 인 경우에는 이전 솔루션이 우선합니다.

테스트 사례

동일한 테스트 사례를 포함하는 두 개의 테스트 스크립트가 있습니다.

두 경우 모두에서 호출은 다음과 같습니다 <test script> <my program> [arguments](예 : ./test ruby beehive.rb또는) ./test.ps1 ./beehive.exe.

151 대신 22 개의 테스트 만 있다는 것을 알고 있습니다 (주로 솔루션이 매우 느리기 때문에). 작업을 해결하는 대신 정확한 테스트 사례를 포함하지 마십시오. 이러한 스크립트는 변경으로 인해 프로그램이 여전히 올바르게 작동하는지 테스트하는 데 편리합니다. 코드를 특정 테스트 사례에 맞게 조정할 수는 없습니다.

다른 메모

이 과제는 2011-W24 년에 제 대학에서 열린 골프 대회의 일부였습니다. 참가자의 점수와 언어는 다음과 같습니다.

  • 336 – C
  • 363 – C
  • 387 – C
  • 389 – 하스켈
  • 455 – C

우리 자신의 해결책은

  • 230 – 루비

이것은 Conway의 인생 게임과 비슷합니다.
피터 올슨

물론이야; 그렇기 때문에 그렇게 태그 된 것입니다. 실제로 매우 가려져 있습니다.
Joey

답변:


9

루비 181 개 163 153 146 문자

h=[0]*4e4
[0,-200,201,202,2,3].map{|i|h[i]=1}
gets.to_i.times{h=h.map{[g=1,200,201].map{|x|g+=h[x]+h[-x]};g>5-h.rotate![-1]||g<3?0:1}}
p h.count 1

이 구현 은 각 요소가 (벌 없음) 또는 (벌 포함) 인 배열 h(차원 200x 200평면화)을 사용하는 표준 접근 방식을 따릅니다 . 배열 은 꿀벌의 초기 위치를 나타 냅니다 (초기 셀에 상대적).01[0,-200,201,202,2,3]

위에서 지정한 입력 및 출력은 정의 된 모든 테스트 사례를 통과합니다.

편집 1 : "추가 공간"-버전 대신 래핑 솔루션으로 다시 변경되었습니다 (중간 버전에서는 짧았지만 현재는 몇 자 더 깁니다).

편집 2 : 변수를 b완전히 제거했습니다 .

편집 3 : 경고 :이 편집으로 인해 프로그램이 엄청나게 느려졌습니다. 따라서 크기를 각각 200으로 줄였으며 여전히 150 회까지 반복 할 수 있습니다. 변수로 배열을 인덱싱하는 대신 배열을 계속 앞으로 회전시킵니다. 실제로 좋은 디자인은 아니지만 지금은 150 미만입니다.


7

파이썬, 152 자

P=[0,2,3,1j,1+1j,1-1j]
for i in' '*input():Q=[p+d for d in(1,-1,1j,-1j,1j-1,1-1j)for p in P];P=set(p for p in Q if 1<Q.count(p)<5-(p in P))
print len(P)

이 솔루션은 일련의 복소수로 꿀벌 위치를 추적합니다. 내부 루프가 벌의 수에서 2 차이 기 때문에 꽤 느립니다. 나는 최대 50까지 테스트했으며 작동합니다.


Python2.7은 이해력을 설정했습니다
gnibbler

나는 꿀벌을 추적하는 것을 생각했지만, 복잡한 숫자로 그것을하는 것은 정말 깔끔합니다! 또한 for 루프를 exec로 교체하여 3 개의 문자를 절약 할 수 있습니다 (내가했던 것처럼).
Jules Olléon 2016 년

P={0,2,3,1j,1+1j,1-1j}{p}<P
파이썬 2.7

5

파이썬, 171 개 169 158 문자

w=300
s=w*w
x=[0]*297
h=[1,1,0]+x+[1,0,1,1]+x+[1]+x*s
exec('h=[1<sum(h[(i+x)%s]for x in[-1,-w-1,-w,1,w+1,w])<5-h[i]for i in range(s)];'*input())
print sum(h)

나는 (300 * 300 = 900,000 1 차원 배열로 세계를 모델 h로하기 때문에 꿀벌이 1 빈은이고, 실제로 더 큰, 그러나 결국 사용하지 않는) 0 (300)의 크기는 벌금입니다 가장 성장이 될 것입니다 각 세대의 각 차원에서 2, 그리고 150 세대를 넘지 않습니다.

다음은 약간 ungolfed 및 주석이 달린 버전입니다.

w=300 # width and height of the world
s=w*w
# create initial grid
l=[1,1]+[0]*298+[1,0,1,1]+[0]*297+[1]+[0]*s

for k in range(input()):
  h=l[:]

  for i in range(s):

    # for each point, compute the number of neighbors
    n=sum(map(lambda x:h[(i+x)%s],[-1,-w-1,-w,1,w+1,w]))

    # if that number verifies the conditions, put 1 here, if not put 0
    l[i]=1<n<5-h[i]

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