蜂箱的奇特生活


19

研究人员最近发现了一个有趣的蜂群,它生活在无限的蜂窝区域中:

蜂窝

每个牢房可以容纳一只蜜蜂或不能容纳一只蜜蜂。实际上,这些生物的生活似乎有点……混乱。可以计算出一个殖民地总是以以下模式开头:

初始模式

(蜂绘制由 灵光布泰维基共享资源。这个蜂窝和蜜蜂图像从而被下发布的 CC-BY-SA牢骚

之后,蜜蜂的生命周期分为几代。每一代老蜜蜂死亡而新的蜜蜂孵化,这主要取决于它们细胞的邻居:

  • 如果一只蜜蜂的邻居少于两个,它会因孤独而死亡。
  • 如果一只蜜蜂有三个以上的邻居,则会因拥挤而死亡。
  • 如果一个小区在相邻小区中有两只,三只或四只活蜂,那么下一代会在那里孵化出一只新蜜蜂。

垂死的蜜蜂直到世代末期才死亡,因此它们仍会影响可能会孵化下一代的周围细胞。

现在我们知道了这样一个殖民地的工作方式,我们可以通过任何数量的世代对其进行模拟。

输入项

输入是标准输入给定的单个数字N,以换行符终止。0≤ Ñ ≤150。这是代模拟的数量。

输出量

输出是单个数字,在标准输出上,并且可以选择跟在一个换行符之后,该换行符表示N 代后的活蜂数量。

标准错误的附加输出将被忽略。

样本输入

0
5
42
100

样本输出

6
44
1029
5296

获奖条件

最短的代码胜出,这是高尔夫界的惯例。如果出现平局,则以较早的解决方案为准。

测试用例

有两个测试脚本,包含相同的测试用例:

在这两种情况下都调用:<test script> <my program> [arguments]例如./test ruby beehive.rb./test.ps1 ./beehive.exe

我知道只有22个测试,而不是151个(主要是因为解决方案通常很慢)。请避免嵌入确切的测试用例,而不是解决任务。这些脚本可以方便您测试更改是否仍导致程序正常运行。不是您可以使代码适应特定的测试用例。

另一个注意

该任务是2011-W24期间在我的大学举行的高尔夫比赛的一部分。参赛者的成绩和语言如下:

  • 336 – C
  • 363 – C
  • 387 – C
  • 389 –哈斯克尔
  • 455 – C

我们自己的解决方案是

  • 230 –红宝石

这听起来有点像Conway的生活游戏。
彼得·奥尔森

当然; 这就是为什么它也被这样标记的原因。确实,它很薄。
乔伊,

Answers:


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平)的标准方法,其中每个元素都是0(没有蜜蜂)或1(包括蜜蜂)。该数组[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)

该解决方案使用一组复数来跟踪蜜蜂的位置。这很慢,因为内部循环的蜜蜂数量是平方的。我已经测试了多达50个,并且有效。


Python2.7设定了理解力
gnibbler 2011年

我本来想跟踪蜜蜂,但是用这样的复杂数字进行实在是太好了!您也可以通过将exec替换为exec来节省3个字符(就像我一样)。
JulesOlléon2011年

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一维数组(h实际上更大,但不使用结尾),其中蜜蜂为1,空为0。300的大小很好,因为最多增长为每个世代的每个维度中有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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.