Reaksi berantai bom

32

Pengantar:

Sebelum tugas, inilah yang dilakukan setiap elemen pada peta:

Tanah biasa ( X): Ini tidak menghasilkan apa-apa.

Tanah yang hancur ( -): Ini sama dengan tanah biasa, tetapi dihancurkan oleh bom.

Bom aktif ( !): Pada peta, ini akan menghancurkan semua yang ada di kotak 3x3:

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

Bom pasif ( @): Tidak melakukan apa-apa, sampai diledakkan oleh bom lain. Ini juga memiliki radius ledakan 3x3 persegi:

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

Tapi:

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

Nuke ( ~): Ia tidak melakukan apa-apa, sampai diledakkan oleh bom lain. Perbedaannya adalah bahwa bom ini memiliki radius ledakan 5x5 persegi:

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

Tapi:

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

Tugas

  • Diberikan peta 9x9 , output peta setelah reaksi berantai.
  • Anda dapat menyediakan fungsi atau program.
  • Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!

Uji kasus

Test case 1 ( 3 langkah ):

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

Test case 2 ( 2 langkah ):

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

Test case 3 ( 2 langkah ):

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

Test case 4 ( 1 langkah ):

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

Test case 5 ( 9 langkah ):

!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---

Test case 6 ( 9 langkah ):

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

Test case 7 ( 3 langkah ):

!XXXXXXXX           ---XXXXXX
X@XXXXXXX           ----XXXXX
XX@XXXXXX           ----XXXXX
XXXXXXXXX           X---X----
XXXXXX@@!     >     XXXXX----
XXXXXXXXX           X---X----
XX@XXXXXX           ----XXXXX
X@XXXXXXX           ----XXXXX
!XXXXXXXX           ---XXXXXX
Adnan
sumber
4
Jawaban saya jauh lebih singkat daripada jawaban yang diterima.
Adám
Bisakah mendasarkan bagian dari lokakarya pada tantangan ini?
Adám

Jawaban:

10

Matlab, 120 111 byte

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)='-'

Konvolusi adalah kunci kesuksesan.

Idenya adalah sebagai berikut: Temukan bom aktif. Perbesar area ini menjadi persegi 3x3. Temukan bom baru yang terkena dampak, perbesar area correspoding ke ukuran yang sesuai dan tambahkan ke area yang sebelumnya hancur. Ulangi ini cukup kali (dalam kasus saya sebanyak kita memiliki karakter input, hanya karena itu adalah varian terpendek) untuk memastikan bahwa kita mencapai titik stasioner (= tidak ada lagi bom meledak). Kemudian atur semua area yang hancur ke- dan tampilkan hasilnya.

Input diasumsikan sebagai matriks karakter, misalnya

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

Retina , 188 168 154 152 byte

Bytes dihitung sebagai ISO 8859-1.

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

Cobalah online!

Ini lebih merupakan bukti konsep. Ada duplikasi yang mengerikan antara bom dan nuklir, yang akan saya coba singkirkan sebelum menambahkan penjelasan. Yah, saya menyingkirkan duplikasi itu tetapi meningkatkan kompleksitas secara signifikan sehingga tidak benar-benar menghasilkan penghematan besar ...

Martin Ender
sumber
6

APL (Dyalog) , 56 karakter atau 62 byte *

Rekan saya Marshall memberikan solusi yang elegan, 21 karakter lebih pendek dari saya:

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

Cobalah online!

{... } fungsi anonim di mana argumen diwakili oleh

'-'@(... )⍵lari di posisi yang ditutupi oleh fungsi diam-diam berikut:

  '!'∘= Boolean di mana tanda seru sama dengan argumen

  (... )⍣≡ terapkan fungsi tersembunyi berikut hingga tidak ada lagi perubahan:

   ×∘(... ) kalikan dengan konstanta berikut:

    '~'=⍵ Boolean di mana tilde sama dengan argumen aslinya

    (... )+ untuk itu, tambahkan:

     'X'≠⍵ Boolean di mana X berbeda dari argumen aslinya

   {... }⌺5 5 untuk masing-masing, terapkan fungsi berikut pada area 5 × 5 yang berpusat di atasnya:

    4↑1 ambil empat elemen pertama dari satu, padding dengan nol [1,0,0,0]

    1+ tambahkan satu [2,1,1,1]

    5⍴ membentuk kembali secara siklis menjadi panjang lima [2,1,1,1,2]

    ∘.⌈⍨ meja maksimum dengan dirinya sendiri di kedua sumbu

    ⍵≥ Boolean di mana tetangga yang bersesuaian lebih besar atau sama dengan itu

    1∊ Boolean jika ada yang benar


* Ganti saja dengan di ⎕U233A bawah Klasik untuk byte tunggal per karakter.

Adm
sumber
di tautan tio, input (di sebelah kiri ">") sama dengan output (di sebelah kanan ">"), apakah seharusnya terlihat seperti itu?
ngn
@ ngn Baik terlihat. The DispFungsi tidak pernah bisa bekerja. Diperbarui untuk menjadi operator. Terima kasih.
Adám
... dan sebuah pertanyaan: apakah @ dihitung sebagai 1 byte di klasik? Dugaan saya adalah ya
ngn
@ ngn Ya.
Adám
inilah ide untuk 61 byte: '-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕( ⎕io←0)
ngn
4

Jawa, 574 562 558 549 525 523 byte

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);}}
SuperJedi224
sumber
Saya tahu sudah cukup lama sejak Anda memposting ini. Tapi Anda bisa bermain golf beberapa hal: Keduanya '-'bisa 45. Keduanya Math.max(...,0)bisa ...>0?...:0(sama bisa dilakukan dengan Math.min(...,9)tetapi jumlah byte yang sama persis. 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);Bisa 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);. Dan mungkin Anda bisa membuat fungsi dari itu bukan program.
Kevin Cruijssen
1

APL (Dyalog Classic) , 61 byte

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

Cobalah online!

a←⎕ mengevaluasi input dan menetapkan a

i←,⍳⍴a indeks (pasangan coords) dari semua sel

('!'=,a)/ saring hanya bom yang awalnya aktif

{ }⍣≡ melakukan transformasi pada daftar sampai stabil

  • 'X@~-'⍳a[⍵]ganti 0 untuk X, 1 untuk @, dll, 4 untuk apa pun (! )

  • 3|mod 3 untuk mendapatkan "radius" dampak; itu harus lebih besar atau sama dengan ...

  • (↓⌈/¨|⍵∘.-i)≤ ... Manhattan menjauhkan antara sel dalam daftar dan semua sel

  • i/⍨∨⌿↑ dapatkan bitmask dari sel mana yang terpengaruh dan pilih dari mana i

'-'@( )⊢ataruh -di posisi itu

ngn
sumber