汚染の最終段階


10

5x5の受信者の内部にウイルスがいます。汚染がどのように伝播するかを知っているので、あなたの使命は汚染の最終段階を出力することです。

受取人

これは、5x5の2次元配列として表されます。

0 0 0 0 1
0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1

場所1とは、ウイルスがすでに汚染されて0いる場所と、汚染されていない場所を意味します。

ウイルスの伝播方法

  1. 汚染された位置はきれいにできません。
  2. クリーンな位置は、隣接する位置(北、東、南、西のセル)の少なくとも2つが汚染されている場合にのみ、次の段階で汚染されます。
  3. 汚染の最終段階は、クリーンなセルを汚染できなくなったときに発生します。

サンプル

汚染の段階1として上記の受信者を使用すると、段階2は次のようになります。

0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1
0 1 1 1 1

汚染のステージ3は次のとおりです。

0 0 0 1 1
0 0 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1

汚染のステージ4は次のとおりです。

0 0 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1

そして、ステージ5(この例では、最後のステージ)は次のようになります。

0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1

チャレンジ

汚染の1つの段階を入力として指定すると、汚染の最後の段階を出力する必要があります。

完全なプログラムまたは関数を書くことができます。入力は、配列/リスト、区切られた数値、または文字列として受け取ることができます。あなたの言語に合った最良の方法を選択します。

バイト単位の最短の答えが勝ちます!

別のテストケース

Input:
1 1 0 0 1
0 0 0 0 0
0 1 0 0 1
0 0 0 0 0
1 0 0 0 1

Output:
1 1 0 0 1
1 1 0 0 1
1 1 0 0 1
1 1 0 0 1
1 1 0 0 1

Input:
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1

Output:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

Input:
1 0 0 1 0
0 0 1 0 1
0 0 0 0 0
1 0 0 0 0
0 0 1 0 0

Output:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

Input:
0 1 0 0 0
0 0 0 0 1
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0

Output:
0 1 0 0 0
0 0 0 0 1
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0

1
1 0 1出力でどのように発生する可能性がありますか?中心のゼロは2つ1のsに隣接していませんか?
Lynn

@Lynn ..更新しました;)...すみません
削除

1
1 0 0 1 0 \ 0 0 1 0 1 \ 0 0 0 0 0 \ 1 0 0 0 0 \ 0 0 1 0 0テストケースとして追加できますか?
Conor O'Brien

@CᴏɴᴏʀO'Bʀɪᴇɴ。追加の感謝
削除

2
これまでのすべてのテストケースでは、行と列が完全に空になっています。0 1 0 0 0 \ 0 0 0 0 1 \ 0 0 1 0 0 \ 1 0 0 0 0 \ 0 0 0 1 0変更しないでおくことをお勧めします。
xnor 2016年

回答:


12

これは基本的にはセルオートマトンについて話しているので、私はあなたに与えます。

Golly Quicklifeルール、10バイト

01234/234V

ルールを入力し、グリッドをGollyに貼り付け、パターンを実行します。結果のパターンは出力です。

説明:

01234 Survive on any number of neighbors
     /234 Born on >2 neighbors
         V Only directly adjacent neighbors count

または、完全なRuleLoaderルールを要求する場合は、89バイトです。

@RULE X
@TABLE
n_states:2
neighborhood:vonNeumann
symmetries:permute
011001
011101
011111

ルール名はXで、以前と同じ手順です。


3
これはプログラミング言語ですか?
Lynn

1
Golly Quicklife B3/S23は、何でもできるシミュレーションを実行できます。...しかし、それは厳密な入力フォーマットを持っています(プログラム全体が入力に含まれているように(他にどのようにしますか?))。しかし、なぜ楽しみを台無しにするのですか?
CalculatorFeline

さて、セルオートマトンの長期的な動作に要約される質問を待つ必要があるだけです!
CalculatorFeline

1
妥当性について疑問があります。Gollyが最終結果のみを表示した場合は問題ありませんが、中間結果も表示されます(私が間違っている場合を除きます)
Lirtosiast

1
@CatsAreFluffyあなたは私の賛成票を持っています。
リルトシアスト2016年

5

Python 2、97バイト

s=' '*6+input()
exec"s=s[1:]+('1'+s)[sum(s[i]<'1'for i in[-6,-1,1,6])>2or'/'>s];"*980
print s[6:]

オンラインでお試しください。入力は、各行が改行で区切られた引用符付き文字列として解釈されます。これ980は最適ではなく、35のより低い倍数で置き換えることができます。このプログラムの長さに影響はないので、読者の練習として最低安全上限の決定を残しました。


入力を囲む引用符と\ nエスケープされた改行が必要です。
CalculatorFeline

@CatsAreFluffy Ideoneリンクは、入力がどのように取得されるかをすでに明確にしていると思います。
xsot 2016年

入力は、各行が\ n sで区切られた引用符付き文字列として取得されます。
CalculatorFeline

わかりやすくするために編集します。
xsot 2016年

3

JavaScript(ES6)、91 89 87バイト

数値または文字列の配列として入力を受け入れる関数として。

Neilから-2バイト(y文字列変換との割り当ての組み合わせ)

-2バイト(変数を削除j

f=x=>(y=x.map((z,i)=>~(i%5&&x[i-1])+~(i%5<4&x[i+1])+~x[i-5]+~x[i+5]<-5|z))+[]==x?y:f(y)
<!-- Snippet demo with array <-> string conversion for convenience -->
<textarea id="input" cols="10" rows="5">0 0 0 0 1
0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1</textarea>
<button id="submit">Run</button>
<pre id="output"></pre>
<script>
strToArray=x=>x.match(/\d/g)
arrayToStr=x=>([]+x).replace(/(.),(.),(.),(.),(.),*/g, '$1 $2 $3 $4 $5\n')
submit.onclick=_=>output.innerHTML=arrayToStr(f(strToArray(input.value)))
</script>


(y=...)+''==x代わりに書き込むことで2バイトを節約します(y=...),y+''==x
Neil

2

MATL、22バイト

tn:"t5Bt!=~2X53$Y+1>Y|

これは、言語の現在のバージョン(15.0.0)で動作します。

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

入力フォーマットは、セミコロンで区切られた行を持つ2D配列です。したがって、4つのテストケースには次の入力があります。

[0 0 0 0 1; 0 0 0 0 1; 0 0 0 1 1; 0 0 1 1 1; 0 1 1 1 1]

[1 1 0 0 1; 0 0 0 0 0; 0 1 0 0 1; 0 0 0 0 0; 1 0 0 0 1]

[1 0 0 0 0; 0 1 0 0 0; 0 0 1 0 0; 0 0 0 1 0; 0 0 0 0 1]

[1 0 0 1 0; 0 0 1 0 1; 0 0 0 0 0; 1 0 0 0 0; 0 0 1 0 0]

説明

これは、次のマスクを使用して入力配列の2D畳み込みを繰り返し実行します。これは、どの近傍が汚染としてカウントされるかを定義します。

0 1 0
1 0 1
0 1 0

元の配列と同じサイズの結果を取得するために、最初にゼロのフレームが埋め込まれ、その後、畳み込みの「有効な」部分のみが保持されます(つまり、エッジ効果なし)。

しきい値2がたたみ込みの出力に適用され、結果は元の入力と要素ごとにORされます。

これは、最終状態に到達するために十分な回数実行する必要があります。これを満たす単純な基準は、入力配列のエントリ数と同じ回数(つまり、テストケースでは25回)繰り返すことです。

t          % get input 2D array implicitly. Duplicate
n:"        % repeat as many times as elements in the input array
  t        %   duplicate array
  5B       %   number 5 in binary: row vector [1 0 1] 
  t!       %   duplicate and transpose into column
  =~       %   compare for inequality with broadcast. Gives desired mask
  2X53$Y+  %   2D convolution. Output has same size as input 
  1>       %   true for elements equal or greater than 2
  Y|       %   element-wise OR with previous copy of the array
           % end loop. Implicitly display

1

TI-BASIC、151バイト

Prompt [A]
[A]→[B]
Lbl 0
[B]→[A]
For(Y,1,5
For(X,1,5
DelVar ADelVar BDelVar CDelVar D
If Y>1:[A](Y-1,X→A
If Y<5:[A](Y+1,X→B
If X>1:[A](Y,X-1→C
If X<5:[A](Y,X+1→D
max(A+B+C+D≥2,[A](Y,X→[B](Y,X
End
End
If [A]≠[B]:Goto 0
[B]

として入力し[[1,0,0,1,1][1,0,0,0,0]...]ます。


1
これは約100バイトになると思います。最初のヒント:Repeatループを使用します。
リルトシアスト2016年

1

Lua、236バイト

s=arg[1]u=s.sub while p~=s do p=s s=s:gsub("(%d)()",function(d,p)t=0 t=t+((p-2)%6>0 and u(s,p-2,p-2)or 0)t=t+(p-7>0 and u(s,p-7,p-7)or 0)t=t+(p+5<30 and u(s,p+5,p+5)or 0)t=t+(p%6>0 and u(s,p,p)or 0)return t>1 and 1 or d end)end print(s)

コマンドラインで入力を受け入れ、Luaの文字列操作を使用して回答を取得します。

非ゴルフ:

s=arg[1]
u=s.sub
while p~=s do
    p=s
    s=s:gsub("(%d)()", function(d, p)
                 t=0
                 t=t+((p-2)%6>0 and u(s,p-2,p-2)or 0)
                 t=t+(p-7>0 and u(s,p-7,p-7)or 0)
                 t=t+(p+5<30 and u(s,p+5,p+5)or 0)
                 t=t+(p%6>0 and u(s,p,p)or 0)
                 return t>1 and 1 or d
    end)
end
print(s)

1

APL、76 72 70バイト

{⍵∨1<¯1 ¯1↓1 1↓↑+/(1 0)(¯1 0)(0 ¯1)(0 1){⍺[1]⊖⍺[2]⌽⍵}¨⊂¯1⊖¯1⌽7 7↑⍵}⍣≡

これが何をするか:行列を7x7に拡張し、引数(オメガ)を中央に配置します。このマトリックスから、4つの「子」マトリックスを生成し、それぞれを異なる方向(上/下/左/右)にシフトし、それらを一緒に追加して(隣人の数を取得する)、フレームをドロップします( 5x5マトリックス)。または、この新しい「古い」マトリックスを使用して、プロセスでセルを削除しないようにします(つまり、端)。次に、⍣≡組み合わせを使用して固定小数点値を取得します。

{⍵∨1<¯1 ¯1↓1 1↓↑+/(1 0)(¯1 0)(0 ¯1)(0 1){⍺[1]⊖⍺[2]⌽⍵}¨⊂¯1⊖¯1⌽7 7↑⍵}⍣≡
                                                             7 7↑⍵    ⍝ Expand the matrix
                                                       ¯1⊖¯1⌽         ⍝ Center the original matrix
                  (1 0)(¯1 0)(0 ¯1)(0 1){⍺[1]⊖⍺[2]⌽⍵}¨⊂               ⍝ Construct 4 child matrices, each offset from the original one by the values on the left of {}
                +/                                                    ⍝ Sum each matrix into one giant matrix
               ↑                                                      ⍝ Mix
     ¯1 ¯1↓1 1↓                                                       ⍝ Transform the 7x7 matrix back to a 5x5 matrix
   1<                                                                 ⍝ Check which elements are smaller than 1
 ⍵∨                                                                   ⍝ "Or" this matrix and the generated matrix
{                                                                 }⍣≡ ⍝ Find the fixpoint

例(関数がに割り当てられていることを考慮contaminate):

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