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 kode-golf , 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
Jawaban:
Matlab,
120111 byteIdenya 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
sumber
Retina ,
188168154152 byteBytes dihitung sebagai ISO 8859-1.
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 ...sumber
APL (Dyalog) , 56 karakter atau 62 byte *
Rekan saya Marshall memberikan solusi yang elegan, 21 karakter lebih pendek dari saya:
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 itu1∊
Boolean jika ada yang benar* Ganti saja
⌺
dengan di⎕U233A
bawah Klasik untuk byte tunggal per karakter.sumber
Disp
Fungsi tidak pernah bisa bekerja. Diperbarui untuk menjadi operator. Terima kasih.@
dihitung sebagai 1 byte di klasik? Dugaan saya adalah ya'-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕
(⎕io←0
)Jawa,
574562558549525523 bytesumber
'-'
bisa45
. KeduanyaMath.max(...,0)
bisa...>0?...:0
(sama bisa dilakukan denganMath.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);
Bisaint 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.APL (Dyalog Classic) , 61 byte
Cobalah online!
a←⎕
mengevaluasi input dan menetapkana
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 untukX
, 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 seli/⍨∨⌿↑
dapatkan bitmask dari sel mana yang terpengaruh dan pilih dari manai
'-'@( )⊢a
taruh-
di posisi itusumber