蜂の巣の奇妙な生活


19

研究者は最近、蜂の巣の無限のフィールドに住む興味深い蜂のコロニーを発見しました。

ハニカム

各セルには蜂を入れることも入れないこともできます。実際、それらの生き物の生活は少し混chaとしているように見えます。コロニーは常に次のパターンで始まると計算できます。

初期パターン

(ビーによって描か エマニュエルBOUTETウィキメディアコモンズ。このハニカム・アンド・ハチ画像はこのように下でリリースされる CC-BY-SAgrumbles

その後、ミツバチのライフサイクルはいわゆる世代に分割されます。各世代の古いミツバチは死に、新しいミツバチはhatch化します。そして、それは主に彼らの細胞の隣人に依存します:

  • ミツバチの隣人が2人以下の場合、孤独のために死にます。
  • ミツバチが3つ以上の隣人を持っている場合、過密のために死にます。
  • セルが隣接するセルに2つ、3つ、または4つの生きているミツバチを持っている場合、新しいミツバチが次世代でそこにthere化します。

死ぬミツバチは世代の終わりまで死なないので、次世代のミツバチをhatch化させるかもしれない周囲の細胞に影響を与えます。

そのようなコロニーがどのように機能するかがわかったので、何世代でもそれをシミュレートできます。

入力

入力は、標準入力で指定された単一の数値Nであり、改行で終了します。0≤ N ≤150これは、シミュレートする世代数です。

出力

出力は、標準出力では単一の数値であり、オプションで単一の改行が続きます。これは、N 世代後の生きているミツバチの数を表します。

標準エラーの追加出力は無視されます。

サンプル入力

0
5
42
100

サンプル出力

6
44
1029
5296

勝利条件

ゴルフで通例であるように、最短のコードが勝ちます。同点の場合、以前のソリューションが優先されます。

テストケース

同じテストケースを含む2つのテストスクリプトがあります。

呼び出しはどちらの場合でも:<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の人生のゲームに少し似ています。
ピーターオルソン

もちろん; それがそのようにタグ付けされている理由です。実際、非常に薄く覆われています。
ジョーイ

回答:


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

Python、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は理解を設定しています
ニブラー

私はミツバチを追跡することを考えましたが、そのような複雑な数でそれを行うことは本当にきれいです!また、forループをexecに置き換えることで3文字節約できます(私がしたように)。
ジュールオレオン

Python2.7にもリテラルが設定されているため、作成してP={0,2,3,1j,1+1j,1-1j}から{p}<Pメンバーシップをテストするために使用できます(1文字を保存)
-gnibbler

5

Pythonの、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 = 900000 1D配列としてモデル化します(h実際には大きくなりますが、終わりは使用されません)。ここで、蜂は1で空は0です。最も成長がであろう各世代の各ディメンションに2つあり、150世代以下です。

これは、わずかに未公開でコメント付きのバージョンです。

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.