Reakcja łańcuchowa bomb

32

Wprowadzenie:

Przed zadaniem jest to, co każdy element robi na mapie:

Plain land ( X): To nic nie robi.

Destroyed land ( -): To samo co zwykły ląd, ale zniszczone przez bombę.

Aktywna bomba ( !): na mapie zniszczy to wszystko na polu 3x3:

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

Pasywna bomba ( @): Nic nie robi, dopóki nie zostanie zdetonowana przez inną bombę. Ma również promień wybuchu kwadratowego 3x3 :

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

Ale:

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

Nuke ( ~): Nic nie robi, dopóki nie zostanie zdetonowany przez kolejną bombę. Różnica polega na tym, że ta bomba ma promień wybuchu kwadratowego 5 x 5 :

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

Ale:

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

Zadanie

  • Biorąc pod uwagę mapę 9x9 , wyślij mapę po reakcji łańcuchowej.
  • Możesz podać funkcję lub program.
  • To jest , więc wygrywanie z najmniejszą ilością bajtów wygrywa!

Przypadki testowe

Przypadek testowy 1 ( 3 kroki ):

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

Przypadek testowy 2 ( 2 kroki ):

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

Przypadek testowy 3 ( 2 kroki ):

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

Przypadek testowy 4 ( 1 krok ):

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

Przypadek testowy 5 ( 9 kroków ):

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

Przypadek testowy 6 ( 9 kroków ):

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

Przypadek testowy 7 ( 3 kroki ):

!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
źródło
4
Moja odpowiedź jest znacznie krótsza niż zaakceptowana.
Adám,
Czy część warsztatu może oprzeć to wyzwanie?
Adám

Odpowiedzi:

10

Matlab, 120 111 bajtów

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

Konwolucja jest kluczem do sukcesu.

Pomysł jest następujący: Znajdź aktywną bombę. Powiększ ten obszar do kwadratu 3x3. Znajdź nowe dotknięte bomby, powiększ odpowiadające im obszary do odpowiedniego rozmiaru i dodaj je do wcześniej zniszczonego obszaru. Powtórz to wystarczająco dużo razy (w moim przypadku tyle razy, ile mamy znaków wejściowych, tylko dlatego, że jest to najkrótszy wariant), aby mieć pewność, że osiągnęliśmy punkt stacjonarny (= nigdy więcej wybuchania bomb). Następnie ustaw cały zniszczony obszar na -i wyświetl wynik.

Zakłada się, że dane wejściowe są macierzą znaków, np

['!XXXXXXXX';
'X@XXXXXXX';
'XX@XXXXXX';
'XXX@XXXXX';
'XXXX@XXXX';
'XXXXX@XXX';
'XXXXXX@XX';
'XXXXXXX@X';
'XXXXXXXX@'];
wada
źródło
10

Siatkówka , 188 168 154 152 bajtów

Bajty liczone jako ISO 8859-1.

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

Wypróbuj online!

To bardziej dowód koncepcji. Istnieje ogromna ilość duplikatów między bombami i nuklearnymi, których spróbuję się pozbyć przed dodaniem wyjaśnienia. Cóż, pozbyłem się tego powielania, ale znacznie zwiększyło to złożoność, więc tak naprawdę nie przyniosło dużych oszczędności ...

Martin Ender
źródło
6

APL (Dyalog) , 56 znaków lub 62 bajty *

Mój kolega Marshall zaproponował eleganckie rozwiązanie, o 21 znaków krótsze niż moje:

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

Wypróbuj online!

{} Anonimowa funkcja, w której argument jest reprezentowany przez

'-'@()⍵Myślnik w pozycjach zamaskowanych przez następującą milczącą funkcję:

  '!'∘= Boolean, w którym wykrzyknik jest równy argumentowi

  ()⍣≡ Zastosuj następującą funkcję ukrytą, aż nic się nie zmieni:

   ×∘() Pomnóż przez następującą stałą:

    '~'=⍵ Boolean, gdzie tylda jest równa pierwotnemu argumentowi

    ()+ Do tego dodaj:

     'X'≠⍵ Boolean, gdzie X różni się od pierwotnego argumentu

   {}⌺5 5 Dla każdego zastosuj następującą funkcję w obszarze 5 × 5 na środku:

    4↑1 weź cztery pierwsze elementy jednego, wypełnienie zerami [1,0,0,0]

    1+ dodaj jeden [2,1,1,1]

    5⍴ przekształcaj cyklicznie w długość pięć [2,1,1,1,2]

    ∘.⌈⍨ maksymalny stół z samym sobą na obu osiach

    ⍵≥ Boolean, w przypadku którego odpowiadający sąsiedzi są równi

    1∊ Wartość logiczna, jeśli jest prawdą


* Wystarczy wymienić z⎕U233A pod klasyczny na jeden bajt na znak.

Adám
źródło
w łączu tio wejście (po lewej stronie „>”) jest takie samo jak wyjście (po prawej stronie „>”), czy tak ma wyglądać?
ngn
@ngn Ładnie zauważony. Ta Dispfunkcja nigdy nie zadziałała. Zaktualizowano, aby być operatorem. Dzięki.
Adám
... i pytanie: czy @w klasycznym liczy się jako 1 bajt? zgaduję, że tak
ngn
@ngn Tak.
Adám
oto pomysł na 61 bajtów: '-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕( ⎕io←0)
ngn
4

Java, 574 562 558 549 525 523 bajtów

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
źródło
Wiem, że minęło sporo czasu, odkąd to opublikowałeś. Ale możesz zagrać w golfa kilka rzeczy: Oba '-'mogą być 45. Oba Math.max(...,0)mogą być ...>0?...:0(to samo można zrobić, Math.min(...,9)ale może to być dokładnie ta sama liczba bajtów. 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);Może 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);i możesz zrobić z tego funkcję zamiast programu.
Kevin Cruijssen
1

APL (Dyalog Classic) , 61 bajtów

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

Wypróbuj online!

a←⎕ oceniać dane wejściowe i przypisywać do a

i←,⍳⍴a indeksy (pary współrzędnych) wszystkich komórek

('!'=,a)/ filtruj tylko początkowo aktywne bomby

{ }⍣≡ wykonaj transformację na liście, aż się ustabilizuje

  • 'X@~-'⍳a[⍵]zamień 0 na X, 1 na @itp., 4 na cokolwiek innego ( !)

  • 3|mod 3, aby uzyskać „promień” uderzenia; musi być większy lub równy ...

  • (↓⌈/¨|⍵∘.-i)≤ ... Manhattan odległości między komórkami na liście a wszystkimi komórkami

  • i/⍨∨⌿↑ pobierz maskę bitów, których komórek to dotyczy, i wybierz te z i

'-'@( )⊢aumieścić -na tych pozycjach

ngn
źródło