Дивне життя вулика


19

Нещодавно дослідники виявили цікаву бджолину колонію, яка живе в нескінченному полі соти:

Соти

Кожна клітина може розмістити бджолу чи ні. Насправді життя цих істот виглядає трохи ... хаотично. Можна обчислити, що колонія завжди починається з наступної схеми:

Початковий візерунок

(Бі намальовано Еммануель BOUTET на Вікісховища . Це стільники-і-бджола зображень , таким чином , випускаються під 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 -24. Оцінки та мови наших учасників конкурсу були такими:

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

Наше власне рішення було

  • 230 - Рубі

Це трохи схоже на гру життя Конвея.
Пітер Олсон

Звичайно; тому він також позначений таким чином. Дійсно, це дуже тонко завуальовано.
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вирівняні), де кожен елемент є 0(без бджоли) або 1(бджола не включена). Масив [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)

Це рішення відстежує місця розміщення бджіл із набором складних чисел. Це досить повільно, оскільки внутрішня петля квадратична за кількістю бджіл. Я перевірив до 50, і це працює.


Python2.7 встановив розуміння
gnibbler

Я думав відстежувати бджіл, але робити це з такими складними номерами, як це справді акуратно! Також ви можете зберегти 3 символи, замінивши цикл for на exec (як я це зробив).
Jules Olléon

Python2.7 також встановив літерали, тож ви можете писати, P={0,2,3,1j,1+1j,1-1j}а потім використовувати {p}<Pдля тестування на членство (зберігає 1 char)
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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.