アボカドを搾り出すのを手伝ってください


14

このチャレンジでは、アボカドの分野があり、それを可能な限り迅速かつ完全に絞りたいと思っています。すべてのアボカドを完璧に搾り出す方法を見つけるのに役立つプログラムまたは関数を作成できますか?

入力として、アボカドを3から6の間の整数であるmx m正方形グリッドとして取得しますm。各正方形には1つのアボカドのみが含まれています。アボカドにはいくつかのジューシーな段階があります:

ステージ1:アボカドはまったく搾り出されていません。
ステージ2:アボカドは部分的に搾り出されています。
ステージ3:アボカドは完全に搾り出されています。
ステージ4:アボカドは過剰な水分摂取により爆発しました。

ジューシングツールを使用すると、そのジューシングツールの効果範囲内のアボカドが次の段階に移動します。爆発するアボカドには大きな力があり、アボカドのフィールド全体を破壊するため、アボカドが爆発しないようにしてください!

アボカドのグリッドの例を次に示します。これらの例では、0,0左下隅の座標2,2と右上隅の座標を使用しましたが、言語に合わせて座標系を調整できます。

112
221
231

目標は、すべてのアボカドを完全に搾り出すことです(つまり、ステージ3)。これを実現するには、3つの異なるジューシングツールを所有しています。各ジューシングツールの効果範囲は異なりますが、影響を受けるアボカドのジューシーさはすべて1増加します。

自由に使えるツールはすべてここにあります。ジューサーを使用するには、ツールの最初の文字を指定してから、ジュースにしたい座標を指定します。たとえば、square 5,2でスライサーを使用するには、を出力しますS 5,2

スライサー:ターゲット座標と両側のアボカドを絞り出します。

112     112     112
221 --> XXX --> 332
231     231     231

おろし金:ターゲット座標とアボカドを上下に絞ります。

112     1X2     122
221 --> 2X1 --> 231 --> kaboom!
231     2X1     241

ロケットランチャー:ターゲット座標と隣接するすべてのアボカドを絞り出します。

112     1X2     122
221 --> XXX --> 332
221     2X1     231

サンプルの入力と出力

323
212
323

G 1,1
S 1,1

3312
3121
1213
2133

R 0,0
R 1,1
R 2,2
R 3,3

22322
22222
22222
33233
33333

G 0,3
G 1,3
G 2,2
G 3,3
G 4,3

222332
333221
222332
333222
222333
333222

S 1,5
S 1,3
S 1,1
S 4,5
S 4,3
S 4,1
G 5,4

あなたはこれを明示的に言っていないようですが、解決策は間違いなく最小限の動きを取る必要がありますか?
FryAmTheEggman

1
これは、サンドボックスからの建設的なコメントを無視しました。1つは次のとおりです。ユーザーに座標系の選択を柔軟に許可する必要があると思います(たとえば、原点が0インデックスまたは1インデックスの場合)。
グレッグマーティン

3
@Pavelは、それを回答または質問として投稿しなかったことに深く感謝します。
-NoOneIsHere

1
この質問を見て、VTCに投票して、スパムとして報告する準備ができました。代わりに、+ 1。
-NoOneIsHere

1
@Pavel私はそれをタイトルにしたいと思いました...-
アブサン

回答:


1

Mathematica — 350バイト

非常に短い解決策ではありませんが、まったく解決策がないよりはましですか?

t[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}];""<>Cases[StringReplace[(First@Solve[(Table[G[i,j]+G[i-1,j]+G[i+1,j]+S[i,j]+S[i,j-1]+S[i,j+1]+R[i,j]+R[i-1,j]+R[i+1,j]+R[i,j-1]+R[i,j+1],{i,n=Length@#},{j,n}]/.(G|S|R)[___,0|n+1,___]->0)==3-#&&And@@t[#[i,j]>=0&],t[#[i,j]&],Integers])/.{(x_->m_):>ToString[m x]},{"["->" ","]"->"\n",", "->","}],Except@"0"]&

より読みやすいバージョン(余分なスペースとインデントなど):

t[x_] := Flatten@Table[x /@ {G, S, R}, {i, n}, {j, n}]; 
"" <> Cases[
   StringReplace[(First@
       Solve[(Table[
             G[i, j] + G[i - 1, j] + G[i + 1, j] + S[i, j] + 
              S[i, j - 1] + S[i, j + 1] + R[i, j] + R[i - 1, j] + 
              R[i + 1, j] + R[i, j - 1] + R[i, j + 1], {i, 
              n = Length@#}, {j, n}] /. (G | S | R)[___, 
              0 | n + 1, ___] -> 0) == 3 - # && 
         And @@ t[#[i, j] >= 0 &], t[#[i, j] &], 
        Integers]) /. {(x_ -> m_) :> ToString[m x]}, {"[" -> " ", 
     "]" -> "\n", ", " -> ","}], Except@"0"] &

入力は配列(例:){{3,2,3},{2,2,2},{3,2,3}}、出力は文字列です(末尾に改行があります。これが受け入れられない場合は、StringDrop[...,-1]15バイト余分に関数を囲みます)。(1,1)が左上隅、(n、n)が右下隅(nは行列の次元)と言う座標系を使用しました。ソリューションが同じ操作を複数回実行する必要がある場合、出力には3 G 2,2(「(2,2)3回でおろし金を使用する」など)が含まれる場合があります。それで大丈夫です。

説明:

  • Table[G[i,j]+G[i-1,j]+G[i+1,j]+S[i,j]+S[i,j-1]+S[i,j+1]+R[i,j]+R[i-1,j]+R[i+1,j]+R[i,j-1]+R[i,j+1],{i,n=Length@#},{j,n}](i、j)でおろし金を使用することによって影響を受ける各場所で変数G [i、j]を使用して配列を作成します。S[i、j]およびR [i、j]も同様です。これらの変数は、その位置でツールが使用される回数を表します。
  • .../.(G|S|R)[___,0|n+1,___]->0 アボカドフィールドの外側の位置でツールを使用する効果を削除します。
  • ...==3-# これを、入力と完全に絞り出されたアボカドのフィールドとの違いと比較します。
  • ...&&And@@t[#[i,j]>=0&]短縮形を使用して、変数G [i、j]、S [i、j]、R [i、j]が非負でなければならない(アボカドを無害化できない!)と言いますt[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}]
  • First@Solve[...,t[#[i,j]&],Integers] 変数G [i、j]、S [i、j]、R [i、j]に関する方程式の最初の整数解を見つけます。
  • /.{(x_->m_):>ToString[m x]} ゼロに等しい変数を非表示にすると同時に、解を素敵な文字列形式にします。
  • StringReplace[...,{"["->" ","]"->"\n",", "->","}]のような文字列をのような文字列に"2 G[1, 4]"変換"2 G 1,4"し、最後に改行を追加します。
  • ""<>Cases[...,Except@"0"]残り"0"のをすべて削除し、すべての文字列を結合します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.