1D Yaşam Boyu Oyun Modelini Simüle Et


12

Bu soru sadece kod gözden geçirme eğilimi ve bir codegolf meydan okuma olarak adapte gibi olabilir düşündüm:

Boolean olarak temsil edilen x evlerinin boş olmayan bir listesi verilir. Her gün evler bitişiklerle rekabet ediyor. 1, "aktif" bir evi ve 0, "aktif olmayan" bir evi temsil eder. Belirli bir evin her iki yanındaki komşular ya aktif ya da her ikisi de aktif değilse, o ev ertesi gün pasif hale gelir. Aksi takdirde aktif olur.

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

Örneğin, bir grup komşumuz olsaydı [0, 1, 0], o zaman [1] 'deki ev 0 olur, çünkü hem sol hem de sağdaki evin ikisi de aktif değildir. Her iki uçtaki hücreler de karşı tarafı kontrol eder, böylece indeks length-10'daki komşular indeks ve indexn1'de bulunur veya bunun tersi de geçerlidir. Hücreyi güncelledikten sonra bile, her hücrenin durum bilgisinin aynı anda güncellenmesi için diğerlerini güncellerken önceki durumunu dikkate almanız gerekir.

İşlev, durum dizisini ve bir dizi adımı alır ve verilen adım sayısından sonra evlerin durumunu çıkarmalıdır.

    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]

İstediğiniz listeyi ve adımları uygulayın ve sonuç listesini varsayılan G / Ç yoluyla çıktılayın . Standart boşluklar yasaktır. Bu codegolf, baytlarda en kısa cevap kazanıyor!


8
Hücresel Otomata için +1. Yine de bu Kural 90 değil mi?
HighlyRadioactive

2
İlk test senaryosu sonuçlanmamalı [0, 1, 0, 0, 1, 0, 1, 1]mı?
TFeld

4
@jaaq Temel Hücresel Otomata Kuralından bahsediyorum (her adım veya nesiller arasındaki dönüşümün) # 90. Wolfram | Alpha içinde "Kural 90" yazın.
Oldukça Radyoaktif

12
sonuç listesinin STDOUT üzerinden çıktısını almanız yeterlidir : sadece varsayılan G / Ç yöntemlerimize güvenmeniz şiddetle tavsiye edilir .
Arnauld

5
@jaaq Her standart 1D Hücresel Otomata için bir Kural # olduğu için tesadüf değil. Bunun nedeni, 3 bitin 8 olası durumu (sol komşu, benlik, sağ komşu) olması ve bu eyaletlerin her biri için belirli bir evin açık veya kapalı olacağını söylerseniz, bir bayta mükemmel şekilde eşlenen 8 gerçek / yanlış değerdir. Böylece Kural # 0-255, bayttaki konuma bağlı olarak 8 durumun her birinde elde edilen ev açma / kapama durumu olarak ikili ifadeyi alarak bu kural kümelerinden herhangi birini tanımlamak için kısayol olarak kullanılabilir. Bazı kurallar 90 gibi dikkate değer kabul edilir, bu nedenle tanıma :)
Lunin

Yanıtlar:


8

05AB1E , 14 13 10 9 6 bayt

Dayanarak Shaggy Japt çözümü

F©Á®À^

Çevrimiçi deneyin!

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

Gereksiz yere akıllı 9 baytlık çözüm:

F¥DO.øü+É

Çevrimiçi deneyin!

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 bayt

Tekli 2D diziler olarak durumların I / O.

VÇí^Zé2)é

Dene

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

Retina , 51 bayt

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

Çevrimiçi deneyin! İlk satırdaki adım sayısını ve ikinci satırdaki 0s ve 1s dizesini alır . Açıklama:

1A`

Girişteki adım sayısını silin.

"$+"{

Bu sayıyı tekrarlayın.

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

Sarmayı simüle etmek için bitiş rakamlarını diğer uçlara kopyalayın.

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

XOR işlemini gerçekleştirin.


2

APL (Dyalog Genişletilmiş) , 12 bayt SBCS

Tam program. Durum dizisi ve sonra adım sayısı için stdin komutunu ister. Stdout'a yazdırır.

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

Çevrimiçi deneyin!

konsoldan değerlendirilmiş girdi al (durum dizisi)

 bunun üzerine uygula…

1()⍣⎕ Aşağıdaki tacit işlevi, giriş sayısı, her seferinde 1sol argüman olarak:

⌽⍢⌽ sağ argümanı tersine çevirirken 1 adım sola döndürme

⌽≠ Bağımsız değişken 1 adım sola döndürüldüğünde XOR




1

Pyth , 24 bayt

AQVH=Gmxhded.:+eG+GhG3;G

Çevrimiçi deneyin!

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.