爆弾の連鎖反応


32

前書き:

タスクの前に、すべての要素がマップ上で行うことを以下に示します。

平地X):これは何もしません。

破壊された土地-):これは平地と同じですが、爆弾によって破壊されました。

アクティブな爆弾!):マップ上で、これは3x3の正方形のすべてを破壊します。

XXXXX                         XXXXX
XXXXX                         X---X
XX!XX     > will become >     X---X
XXXXX                         X---X
XXXXX                         XXXXX

受動爆弾@):別の爆弾で爆発するまで何もしません。これには、3x3の正方形の爆発半径もあります。

XXXXX                         XXXXX
XXXXX                         XXXXX
XX@XX     > will become >     XX@XX (nothing happened)
XXXXX                         XXXXX
XXXXX                         XXXXX

しかし:

XXXXX                         XXXXX
XXXXX                         X---X
XX@XX     > will become >     ----X (both bombs have exploded)
X!XXX                         ----X
XXXXX                         ---XX

~):別の爆弾で爆発するまで何もしません。違いは、この爆弾の爆発範囲は5x5の正方形であるということです。

XXXXX                         XXXXX
XXXXX                         XXXXX
XX~XX     > will become >     XX~XX (nothing happened)
XXXXX                         XXXXX
XXXXX                         XXXXX

しかし:

XXXXX                         -----
XXXXX                         -----
XX~XX     > will become >     ----- (both bombs have exploded)
X!XXX                         -----
XXXXX                         -----

タスク

  • 与えられた9x9のマップ、出力マップ後の連鎖反応。
  • 機能またはプログラムを提供できます。
  • これはであるため、バイト数が最小の提出が勝ちです!

テストケース

テストケース1(3ステップ):

XXXXXXXXX           XXXXXXXXX
----XXXXX           ----XXXXX
XXXX@XXXX           XXXX@XXXX
XXXXXXXX-           XXX---XX-
XXXX@XXXX     >     ------XXX
XXXXXXXX-           ------XX-
XX~XXXXXX           -----XXXX
X!XXXXXX-           -----XXX-
XXXXXXXXX           -----XXXX

テストケース2(2ステップ):

XXXXXXXXX           XXXXXXXXX
XXXXXXXXX           XXXXXXXXX
XX~XXXXXX           XX~XXXXXX
---------           ---------
XXXX!XXXX     >     XXX---XXX
XXXXXXXXX           XXX------
XXX@@X@!X           XXX@@----
XXXXXXXXX           XXXXX----
XXXXXXXXX           XXXXXXXXX

テストケース3(2ステップ):

XXXXXXXXX           XXXXXXXXX
XXXXXXXXX           XXXXXXXXX
XX~XXXXXX           XX~XXXXXX
XXXXXXXXX           XXX---XXX
XXXX!XXXX     >     XXX---XXX
XXXXXXXXX           XXX------
XXX@@X@!X           XXX@@----
XXXXXXXXX           XXXXX----
XXXXXXXXX           XXXXXXXXX

テストケース4(1ステップ):

XXXXXXXXX           XXXXXXXXX
XXXX-XXXX           XXXX-XXXX
XXXXXXXXX           XXX---XXX
XX-X!X-XX           XX-----XX
XXXXXXXXX     >     XXX---XXX
XX-----XX           XX-----XX
XXXX-XXXX           XXXX-XXXX
XXXXXXXXX           XXXXXXXXX
XXXXXXXXX           XXXXXXXXX

テストケース5(9ステップ):

!XXXXXXXX           ---XXXXXX
X@XXXXXXX           ----XXXXX
XX@XXXXXX           -----XXXX
XXX@XXXXX           X-----XXX
XXXX@XXXX     >     XX-----XX
XXXXX@XXX           XXX-----X
XXXXXX@XX           XXXX-----
XXXXXXX@X           XXXXX----
XXXXXXXX@           XXXXXX---

テストケース6(9ステップ):

XX@@@XXXX           ------XXX
XXXXXXXXX           ------XXX
~XXXXXXXX           ---XXXXXX
XXXXXXXXX           ---XXXXXX
~XXXXXXXX     >     ---XXXXXX
XXXXXXXXX           ---XXXXXX
~XXXXXXXX           ---XXXXXX
@XXXXXXXX           ---XXXXXX
!XXXXXXXX           ---XXXXXX

テストケース7(3ステップ):

!XXXXXXXX           ---XXXXXX
X@XXXXXXX           ----XXXXX
XX@XXXXXX           ----XXXXX
XXXXXXXXX           X---X----
XXXXXX@@!     >     XXXXX----
XXXXXXXXX           X---X----
XX@XXXXXX           ----XXXXX
X@XXXXXXX           ----XXXXX
!XXXXXXXX           ---XXXXXX

4
私の答えは受け入れられたものよりもかなり短いです。
アダム

ワークショップの一部をこの課題に基づいて行うことはできますか?
アダム

回答:


10

Matlab、120 111バイト

function f=c(f);c=@(x,i)conv2(x+0,ones(i),'s');a=c(f<34,3);for k=f;a=c(a&f<65,3)|a;a=c(a&f>99,5)|a;end;f(a)='-'

畳み込みは成功の鍵です。

アイデアは次のとおりです。アクティブな爆弾を見つけます。この領域を3x3の正方形に拡大します。影響を受けた新しい爆弾を見つけ、対応する領域を対応するサイズに拡大し、それらを以前に破壊された領域に追加します。これを十分な回数(私の場合は、入力文字の数だけ繰り返します。これが最も短いバリアントであるという理由だけで)、静止点(=爆弾が爆発しない)に到達したことを確認してください。次に、破壊されたすべてのエリアをに設定し-、結果を表示します。

入力は文字の行列であると仮定されます、例えば

['!XXXXXXXX';
'X@XXXXXXX';
'XX@XXXXXX';
'XXX@XXXXX';
'XXXX@XXXX';
'XXXXX@XXX';
'XXXXXX@XX';
'XXXXXXX@X';
'XXXXXXXX@'];

10

網膜188の 168 154 152バイト

ISO 8859-1としてカウントされるバイト。

+Tm`@~X!:`!:\-`(.)?.?.(.?(?<1>.)?)(?<=(:|(?(1)_)!|^(?(5)_)(?<-5>.)*(:|(?(1)_)!)(?<1>.*¶)?.*¶(.)*.|(?=(.)*¶.*(?<1>¶.*)?(:|(?(1)_)!)(?<-6>.)*(?(6)_)$))\2)

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

これは概念実証の詳細です。爆弾と核の間に恐ろしいほどの重複がありますが、説明を加える前にそれを取り除こうとします。まあ、私はその重複を取り除きましたが、複雑さを大幅に増やしたので、実際には大きな節約にはなりませんでした...


6

APL(Dyalog)、56文字または62バイト*

私の同僚のマーシャルは、私よりも21文字短いエレガントなソリューションを思いつきました。

{'-'@(({1∊⍵≥∘.⌈⍨51+41}⌺5 5×∘(('X'≠⍵)+'~'=⍵))⍣≡'!'∘=)⍵}

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

{... } 引数が表され匿名関数

'-'@(… 次の暗黙の関数によってマスクさた位置に)⍵ダッシュ ます。

  '!'∘= 感嘆符が引数と等しいブール

  ()⍣≡ 変更がなくなるまで、次の暗黙関数を適用します。

   ×∘() 次の定数を乗算します。

    '~'=⍵ チルドが元の引数と等しいブール

    ()+ それに、追加します:

     'X'≠⍵ Xが元の引数と異なるブール

   {}⌺5 5 それぞれについて、次の機能を中心にある5×5エリアに適用します。

    4↑1 1の最初の4つの要素を取得し、ゼロ[1,0,0,0]でパディングします

    1+ 1つ追加[2,1,1,1]

    5⍴ 周期的に長さ5 [2,1,1,1,2]に再形成する

    ∘.⌈⍨ 両方の軸にそれ自体を持つ最大テーブル

    ⍵≥ 対応する近傍がそれ以上のブール値

    1∊ 真の場合ブール


* 1文字につき1バイトの場合、Classicで置き換えてください⎕U233A


tioリンクでは、入力(「>」の左側)は出力(「>」の右側)と同じですが、そのように見えるはずですか?
NGN

@ngnきれいに発見されました。Disp機能が働いたことがない可能性があります。オペレーターに更新されました。ありがとう。
アダム

...そして質問:@クラシックでは1バイトとしてカウントされますか?私の推測では、イエスです
NGN


ここに61バイトのアイデアがあります:'-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕⎕io←0
ngn

4

Java、574 562 558 549 525 523バイト

import java.util.*;interface B{static char[][]g=new char[9][9];static void d(int i,int j,int r){g[i][j]=45;for(int x=Math.max(i-r,0);x<Math.min(i+r+1,9);x++)for(int y=Math.max(j-r,0);y<Math.min(j+r+1,9);y++)if(g[x][y]==64){d(x,y,1);}else if(g[x][y]>99){d(x,y,2);}else g[x][y]=45;}static void main(String[]a){Scanner q=new Scanner(System.in);for(int i=0;i<9;i++){int j=0;for(char c:q.nextLine().toCharArray())g[i][j++]=c;}for(int j=0;j<9;j++)for(int k=0;k<9;k++)if(g[j][k]==33)d(j,k,1);for(char[]z:g)System.out.println(z);}}

あなたがこれを投稿してからかなりの時間が経ったことを知っています。しかし、あなたはいくつかのことをゴルフする'-'ことができます:両方ができる45。どちらも、Math.max(...,0)することができます...>0?...:0(同じことを行うことができるMath.min(...,9)が、それはバイトの正確な同じ量です。for(int i=0;i<9;i++){int j=0;for(char c:q.nextLine().toCharArray())g[i][j++]=c;}for(int j=0;j<9;j++)for(int k=0;k<9;k++)if(g[j][k]==33)d(j,k,1);することができint i=0,j;for(;i<9;i++){j=0;for(char c:q.nextLine().toCharArray())g[i][j++]=c;}for(i=0;i<9;i++)for(j=0;j<9;j++)if(g[i][j]<34)d(i,j,1);そして、多分あなたは、プログラムの代わりに、それの機能を作ることができます。。
ケビンCruijssen

1

APL(Dyalog Classic)、61バイト

'-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕

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

a←⎕ 入力を評価して割り当て a

i←,⍳⍴a すべてのセルのインデックス(座標のペア)

('!'=,a)/ 最初にアクティブだった爆弾のみをフィルタリングする

{ }⍣≡ リストが安定するまで変換を実行します

  • 'X@~-'⍳a[⍵]0をX、1を@など、4を他のものに置き換えます(!

  • 3|影響の「半径」を取得するmod 3。それ以上でなければなりません...

  • (↓⌈/¨|⍵∘.-i)≤ ...リスト内のセルとすべてのセル間のマンハッタン距離

  • i/⍨∨⌿↑ 影響を受けるセルのビットマスクを取得し、それらを選択します i

'-'@( )⊢a-それらの位置に置く

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