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 golf golfowy , 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
Odpowiedzi:
Matlab,
120111 bajtówPomysł 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
źródło
Siatkówka ,
188168154152 bajtówBajty liczone jako ISO 8859-1.
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 ...źródło
APL (Dyalog) , 56 znaków lub 62 bajty *
Mój kolega Marshall zaproponował eleganckie rozwiązanie, o 21 znaków krótsze niż moje:
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ówni1∊
Wartość logiczna, jeśli jest prawdą* Wystarczy wymienić
⌺
z⎕U233A
pod klasyczny na jeden bajt na znak.źródło
Disp
funkcja nigdy nie zadziałała. Zaktualizowano, aby być operatorem. Dzięki.@
w klasycznym liczy się jako 1 bajt? zgaduję, że tak'-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕
(⎕io←0
)Java,
574562558549525523 bajtówźródło
'-'
mogą być45
. ObaMath.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żeint 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.APL (Dyalog Classic) , 61 bajtów
Wypróbuj online!
a←⎕
oceniać dane wejściowe i przypisywać doa
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 naX
, 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órkamii/⍨∨⌿↑
pobierz maskę bitów, których komórek to dotyczy, i wybierz te zi
'-'@( )⊢a
umieścić-
na tych pozycjachźródło