Моделюйте 1D модель ігрового життя


12

Це питання просто переглядалося на перегляд коду, і я подумав, що вам може сподобатися його як виклик кодогольфа:

Вам надається не порожній список x будинків, представлених булевими. Кожен день будинки змагаються із суміжними. 1 являє собою "активний" будинок, а 0 являє собою "неактивний" будинок. Якщо сусіди з обох сторін даного будинку або активні, або обидва неактивні, то наступний день цей будинок стає неактивним. Інакше він стає активним.

def get_state_as_pos(thelist, pos):
    if thelist[pos-1] == thelist[pos+1]:
        return 0
    else:
        return 1

Наприклад, якби у нас була група сусідів [0, 1, 0], то будинок у [1] стане 0, оскільки і лівий, і правий будинок обидва є неактивними. Осередки на обох кінцях також перевіряють протилежну сторону, тож сусіди в індексі 0 знаходяться в індексі length-1та індексі1 і навпаки. Навіть після оновлення комірки ви повинні враховувати її попередній стан при оновленні інших, щоб інформація про стан кожної комірки оновлювалася одночасно.

Функція приймає масив станів і ряд кроків і повинна виводити стан будинків після заданої кількості кроків.

    input: states = [1, 0, 0, 0, 0, 1, 0, 0], steps = 1
   output should be [0, 1, 0, 0, 1, 0, 1, 1]

    input: states = [1, 1, 1, 0, 1, 1, 1, 1], steps = 2
intermediate state= [0, 0, 1, 0, 1, 0, 0, 0]
   output should be [0, 1, 0, 0, 0, 1, 0, 0]


    input: states = [1], steps=1
    output: states= [0]

Виконайте список і кроки, які вам подобаються, і виведіть отриманий список за допомогою вводу / виводу за замовчуванням . Стандартні лазівки заборонені. Це кодогольф, найкоротша відповідь у байтових перемогах!


8
+1 для стільникових автоматів. Чи це не правило 90?
ВисокоРадіоактивний

2
Чи не повинен привести перший тестовий випадок [0, 1, 0, 0, 1, 0, 1, 1]?
TFeld

4
@jaaq Я маю на увазі Правило елементарних стільникових автоматів (перетворення між кожним кроком або поколіннями) №90. Введіть "Правило 90" у Вольфрам | Альфа.
HighlyRadioactive

12
вивести отриманий список за допомогою STDOUT : настійно рекомендується просто покладатися на наші методи вводу / виводу за замовчуванням .
Арнольд

5
@jaaq Не так багато збігів, як існує правило # для кожного стандартного 1D стільникового автомата. Це тому, що 3 біти мають 8 можливих станів (лівий сусід, я, правий сусід), і якщо ви скажете, що для кожного з цих станів даний будинок буде увімкнено або вимкнено, це 8 справжніх / хибних значень, які трапляються ідеально зіставити байт. Таким чином, правило № 0-255 можна використовувати як скорочення для опису будь-якого з цих наборів правил, приймаючи бінарне вираження, що є результатом стану ввімкнення / вимкнення в кожній з 8 ситуацій на основі позиції в байті. Деякі правила вважаються помітними, наприклад 90, таким чином визнання :)
Лунін

Відповіді:


8

05AB1E , 14 13 10 9 6 байт

На основі рішення Japt Shaggy's

F©Á®À^

Спробуйте в Інтернеті!

F                  # repeat n times:
 ©Á                #  the list, rotated right
   ®À              #  the list, rotated left
     ^             #  xor (vectorizes)

Не зайве розумне 9-байтове рішення:

F¥DO.øü+É

Спробуйте в Інтернеті!

F                  # repeat n times:
                   #  (examples given for the initial state [0, 1, 1, 0, 1])
 ¥                 #  deltas of the list ([1, 0, -1, 1])
  D                #  duplicate
   O               #  sum (1)
    .ø             #  surround ([1, 1, 0, -1, 1, 1])
      ü+           #  pairwise addition ([2, 1, -1, 0, 2])
        É          #  modulo 2 ([0, 1, 1, 0, 0])




2

Japt -mh , 11 10 9 байт

Введення / виведення станів у вигляді однотонних 2D-масивів.

VÇí^Zé2)é

Спробуй це

VÇí^Zé2)é     :Implicit input of integer U=steps & array V=[states]
VÇ            :Modify the last element Z in V
  í           :Interleave with
    Zé2       :  Z rotated right twice and
   ^          :  Reduce each pair by XOR
       )      :End interleave
        é     :Rotate right once
              :Repeat U times and implicitly output V

2

Сітківка , 51 байт

1A`
"$+"{`(.).*(.)
$2$&$1
(.)(?=.(\1|(.)))?
$#2*$#3

Спробуйте в Інтернеті! Виконує кількість кроків у першому рядку та рядок 0s та 1s у другому рядку. Пояснення:

1A`

Видаліть кількість кроків із введення.

"$+"{

Повторіть це кількість разів.

`(.).*(.)
$2$&$1

Скопіюйте кінцеві цифри на інші кінці, щоб імітувати обгортання.

(.)(?=.(\1|(.)))?
$#2*$#3

Виконайте операцію XOR.


2

APL (Dyalog Extended) , 12 байт SBCS

Повна програма. Запрошує stdin для масиву станів, а потім для кількості кроків. Друкується до stdout.

1(⌽≠⌽⍢⌽)⍣⎕⊢⎕

Спробуйте в Інтернеті!

отримати оцінений вхід з консолі (масив станів)

 на цьому застосуйте…

1()⍣⎕ Наступна негласна функція, кількість разів вводиться, кожен раз із 1аргументом уліво:

⌽⍢⌽ обертати правий аргумент 1 крок ліворуч при зворотному напрямку (тобто повернути на один крок праворуч)

⌽≠ XOR з аргументом повернув на 1 крок вліво




1

Pyth , 24 байти

AQVH=Gmxhded.:+eG+GhG3;G

Спробуйте в Інтернеті!

AQ                        # G, H = Q[0], Q[1] # Q = input in the form [[states],steps]
  VH                      # for i in range(H):
    =G                    # G = 
      m                   #     map(lambda d:                              )
       xhded              #                   d[0] ^ d[-1],
            .:       3    #         substrings(                 , length=3)
              +eG+GhG     #                     G[-1] + G + G[0]
                      ;   # (end for loop)
                       G  # print G

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.