4回目はインフルエンザになりますように


12

明日は5月4日であるため、明日来るすべての悪いジョークに精神的に準備するための小さなスターウォーズテーマの投稿があります。

バックストーリー

銀河上院のセッション中、すべての上院議員はn*nグリッドに座っています。JarJarインフルエンザの突然の発生(これは永久に続き、感染者がJarJar Binksのように話す)により、上院議員の一部が感染します。

感染した上院議員がいる6*6グリッドの例を次に示しXます[[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[0,5]]。対応するリストは次のとおりです。

ここに画像の説明を入力してください

その後、感染は段階的に広がり始めます。2つの上院議員は、グリッド上のエッジ全体を共有する場合(つまり、上、下、右、左)に隣接します。つまり、対角線を除外します。

上院議員が他の2、3、または4人の上院議員に隣接できると結論づけ、感染に関する次の規則を主張できます。

  • 感染した上院議員は永遠に感染したままです
  • 上院議員は、前のステップで2人以上の感染した上院議員に隣接していた場合、そのステップで感染します。

感染の最初の2つのステップを示す前のグリッドの例を次に示します。

ここに画像の説明を入力してください

次のステップの後、すべての上院が感染します

あなたのタスク

コードは、リストのような無効な入力や、n*n区別できない座標を処理する必要はありません。

あなたのコードは入力としていくつかの整数のリスト(またはバイナリグリッドまたはあなたの言語に適した他のフォーマット)と整数n(リスト以外のフォーマットを使用する場合は不要な場合があります)を取ります:

8 [[1,2],[1,1],[7,4],[2,7],[4,3]]

nはグリッドの側面であり、グリッドはan * nグリッドであり、整数のペアのリストは最初に感染した上院議員のセルの座標です。

グリッドの左下は[0,0]で、右上は[n-1、n-1]です。左上は[0、n-1]です。

コードは整数を出力する必要があります:

-1 または、グリッド全体が完全に感染することはない場合、またはグリッド全体を感染させるのに必要な最小ステップ数である場合は、偽の値またはエラー

テストケース

6 [[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[5,0]] => 7

4 [[1,1][0,3][1,0][3,0][3,3]] => 9

これはであるため、バイト単位の最短回答が優先されることに注意してください。




の最小値はn?最大値はありますか?
mbomb007

@ mbomb007理論的には最大値はありませんが、計算可能でなければなりません。最小値については、0または-1を出力する1と言います

2
Mathematicaの仕事のように見えCellularAutomatonます
...-mbomb007

回答:


2

MATL、29 28バイト

tn:"tlY6Z+1>Z|t?@.]]Nl=?l_]&

入力は、1と0の2D行列の形式です

MATL Online試しください

説明

        % Implicitly grab user input as a 2D matrix
t       % Duplicate the inputs
n:      % Count the number of elements in the input (N) and create the array [1...N]
"       % Loop this many times (maximum number of steps we analyze)
  t     % Duplicate the top element
  lY6   % Push the 2D array => [0 1 0; 1 0 1; 0 1 0]
  Z+    % Perform 2D convolution (and maintain the size)
  l>    % Find all values that are >= 2
  Z|    % Perform an element-wise OR with the previous state
  t?    % If all elements are 1's
    @.  % Push the current index and break out of the loop
  ]     % End of if 
]       % End of for loop
Nl=?    % If there is only one element on the stack
  l_    % Push a negative one
]       % End of if statement
&       % Display the top stack element

となっ-1したがって、「真」になり、コンボリューションの出力でいくつか0のがあるので、私はそうは思いません残念ながら@LuisMendo
Suever

どうtn:"tlY6Z+1>Z|t?x@D.]]N?xl_?(私はあまりテストしていません)。ある時点ですべての要素が1の場合、ループインデックスをすぐに表示し、スタックを削除します。ループの最後で、スタックが空でない場合、削除とプッシュ-1
ルイスメンドー

3

APL(Dyalog 16.0)、54文字または60バイト

囲まれた行列を引数として取り、感染を完了するステップ番号を返します。つまり、1 =すでに完全に感染しています。0 =完全に広がりません。これは、1 + OPの数字です。

54文字(Unicode):

(≢×0=0∊⊃){(⊢≡f←⊢∨2≤{+/,⍵×3 3⍴0 1}⌺3 3)⊃⍵:⍵⋄(⊂f⊃⍵),⍵}⍣≡

60バイト(クラシック):

(≢×0=0∊⊃){(⊢≡f←⊢∨2≤{+/,⍵×3 3⍴0 1}⎕U233A 3 3)⊃⍵:⍵⋄(⊂f⊃⍵),⍵}⍣≡

に等しい ⎕U233A

例の実行:

      g←(≢×0=0∊⊃){(⊢≡f←⊢∨2≤{+/,⍵×3 3⍴0 1}⌺3 3)⊃⍵:⍵ ⋄ (⊂f⊃⍵),⍵}⍣≡
      ⎕IO←0
      b←⊂⊖⍉~@(⎕JSON'[[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[5,0]]')⊢0⍴⍨2⍴6
      g b
8
      b←⊂⊖⍉~@(⎕JSON'[[1,1],[0,3],[1,0],[3,0],[3,3]]')⊢0⍴⍨2⍴4
      g b
10

手順は次のとおりです。

┌─────────────┬┬─────────────┬─────────────┬───────── ──────┬─────────────┬─────────────┬─────────────────── ─────────────┐
│XX│XXX│XXXX│XXXXX│XXXXX│XXXXX│XXXXX│XXXXXX│
│X│XXX│XXXX│XXXXX│XXXXX│XXXXX│XXXXXX│XXXXXX│
│XX│XXX│XXXX│XXXX│XXXXX│XXXXXX│XXXXXX│XXXXXX│
││X│XXX│XXXXX│XXXXXX│XXXXXX│XXXXXX│XXXXXX│
│X│XX│XXX│XXXXX│XXXXXX│XXXXXX│XXXXXX│XXXXXX│
│XX│XXXX│XXXX│XXXX│XXXXX│XXXXXX│XXXXXX│XXXXXX│
└─────────────┴┴─────────────┴─────────────┴───────── ──────┴─────────────┴─────────────┴────────────────── ─────────────┘
┌─────────┬─────────┬─────────┬─────────┬─────────── ┬─────────┬─────────┬─────────┬─────────┬─────────── ┐
│XX│XX│XX│XX│XX│XX│XXX│XXXX│XXXX│XXXX│
│││││X│XX│XXX│XXXX│XXXX│XXXX│
│X│X│XX│XXX│XXX│XXX│XXX│XXX│XXXX│XXXX│
│XX│XXX│XXX│XXX│XXX│XXX│XXX│XXX│XXX│XXXX│
└─────────┴─────────┴─────────┴─────────┴─────────── ┴─────────┴─────────┴─────────┴─────────┴─────────── ┘


2

Python、231バイト

g=input()
q=lambda r,c:g[r][c]if(0<=r<m)*(0<=c<m)else 0
m=len(g);p=t=0;n=range(m)
while not all([r for k in g for r in k]):h=[[g[r][c]or sum([q(r+1,c),q(r-1,c),q(r,c+1),q(r,c-1)])>1 for c in n] for r in n];t+=1;0/(g!=h);g=h
print t

不可能な場合はエラーが発生します。

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


0/0から2バイトを保存しますraise。たぶん1/(g!=h)うまくいくでしょうか?(その後、全体whileをインライン化することもできます)。
ジョナサンアラン

@JonathanAllan入力をありがとう、私はそれを更新しました。
ニール

q=lambda r,c:g[r][c]if(0<=r<m)*(0<=c<m)else 0あなたは()の間のスペースを削除することができます12セーブ1forし、(B)]for、あまりにも。
ジョナサンアラン

@JonathanAllan再び更新されました。ありがとう
ニール

1

JavaScript(ES6)、132バイト

f=s=>(w=s.search`\n`,t=` `.repeat(w+1),t+=s+t,t=s.replace(/0/g,(_,i)=>1-t[i]-t[i+=w]-t[i+=2]-t[i+w]>>>31),t==s?0/!/0/.test(s):1+f(t))

where \nは、リテラルの改行文字を表します。入力を改行区切りの配列0のsおよび1sの文字列として受け取ります。NaNグリッドが完全に感染することがない場合に返します。

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