Странная жизнь улья

19

Исследователи недавно обнаружили интересную пчелиную колонию, которая живет в бесконечном поле сот:

ячеистый

Каждая клетка может содержать пчелу или нет. На самом деле, жизнь этих существ выглядит немного ... хаотично. Можно посчитать, что колония всегда начинается со следующей схемы:

Начальная картина

(Биография Эммануэля Буте из Wikimedia Commons . Таким образом, изображение с сотами и пчелами публикуется под CC-By-SA . Ворчит )

После этого жизненные циклы пчелы делятся на так называемые поколения. Каждое поколение старых пчел умирает, а новые вылупляются, и это в первую очередь зависит от соседей их клетки:

  • Если у пчелы меньше двух соседей, она умирает из-за одиночества.
  • Если у пчелы более трех соседей, она умирает из-за переполненности.
  • Если в соседней камере есть две, три или четыре живые пчелы, то в следующем поколении появляется новая пчела.

Умирающие пчелы не умирают до конца поколения, поэтому они все еще влияют на окружающие клетки, которые могут вывести пчел в следующем поколении.

Теперь, когда мы знаем, как работает такая колония, мы можем моделировать ее через любое количество поколений.

вход

Ввод - это одно число 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.

Я знаю, что есть только 22 теста вместо 151 (в основном потому, что решения часто бывают довольно медленными). Пожалуйста, воздержитесь от встраивания точных тестовых случаев вместо решения задачи. Эти сценарии удобны для вас, чтобы проверить, вызывает ли изменение правильное поведение программы; Нельзя сказать, что вы можете адаптировать свой код для конкретных тестовых случаев.

Еще одна заметка

Эта задача была частью соревнования по гольфу, проводимого в моем университете в течение 2011-W24. Баллы и языки наших конкурсантов были следующими:

  • 336 - С
  • 363 - С
  • 387 - С
  • 389 - Хаскелл
  • 455 - С

Наше собственное решение было

  • 230 - Рубин
детеныш
источник
Это немного похоже на игру жизни Конвея.
Питер Олсон
Конечно; вот почему это тоже помечено. Это очень тонко завуалировано, действительно.
Джои

Ответы:

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(размеры 200х 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
Я думал об отслеживании пчел, но делать это с помощью сложных чисел, как это действительно здорово! Также вы можете сохранить 3 символа, заменив цикл for на exec (как я сделал).
Жюль Оллеон
В Python2.7 также установлены литералы, поэтому вы можете написать, P={0,2,3,1j,1+1j,1-1j}а затем использовать {p}<Pдля проверки членства (сохраняет 1 символ)
gnibbler
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 = 900000 1D ( 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)
Жюль Оллеон
источник