1D Life-of-Life-ishモデルのシミュレーション


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セルはインデックスとindexn1にあり、その逆も同様です。セルを更新した後でも、他のセルを更新するときは以前の状態を考慮して、各セルの状態情報が同時に更新されるようにする必要があります。

この関数は、状態の配列といくつかのステップを受け取り、指定されたステップ数の後の家の状態を出力する必要があります。

    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]

リストとステップを自由に実行し、デフォルトのI / Oを介して結果のリストを出力します。標準の抜け穴は禁止されています。これはcodegolfで、バイト単位の最短の回答です。


8
セルラーオートマトンの場合は+1。しかし、これはルール90ではありませんか?
HighlyRadioactive

2
最初のテストケースの結果ではいけませんか[0, 1, 0, 0, 1, 0, 1, 1]
TFeld

4
@jaaq私はエレメンタリーセルラーオートマトンルール(各ステップまたは世代間の変換)#90を参照しています。Wolfram | Alphaで「ルール90」と入力します。
HighlyRadioactive

12
結果のリストをSTDOUT経由で出力しますデフォルトのI / Oメソッドのみに依存することを強くお勧めします
アーノールド

5
@jaaqすべての標準1Dセルラーオートマトンにルール番号があるので、あまり偶然ではありません。これは、3ビットには8つの可能な状態(左隣、自己、右隣)があり、これらの状態のそれぞれについて、特定の家がオンまたはオフになる場合、8つのtrue / false値がバイトに完全にマッピングされるためです。したがって、ルール#0-255は、バイトの位置に基づく8つの状況のそれぞれで、バイナリ式を結果のハウスオン/オフ状態にして、これらのルールセットのいずれかを記述するための省略表現として使用できます。90などのいくつかのルールは注目に値すると見なされ、したがって認識されます:)
Lunin

回答:


8

05AB1E14 13 10 9 6バイト

ShaggyのJaptソリューションに基づく

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 -mh11 10 9 バイト

シングルトン2D配列としての状態のI / O。

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

Retina、51バイト

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

オンラインでお試しください!最初の行でステップ数を取得し、2行目で0sと1sの文字列を取得します。説明:

1A`

入力からステップ数を削除します。

"$+"{

その回数を繰り返します。

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

終了桁を他の端にコピーして、折り返しをシミュレートします。

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

XOR演算を実行します。


2

APL(Dyalog Extended)、12 バイトSBCS

完全なプログラム。状態の配列を求めてstdinにプロンプ​​トを表示し、次にステップ数を要求します。stdoutに出力します。

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

オンラインでお試しください!

コンソールから評価された入力を取得する(状態の配列)

 その上で、適用…

1()⍣⎕ 次の暗黙関数、入力回数、1左引数として毎回:

⌽⍢⌽ 反転しながら右の引数を1ステップ左に回転します(つまり、1ステップ右に回転します)

⌽≠ 引数を1ステップ左に回転させたXOR




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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.