Uwaga: Historia opowiedziana w tym pytaniu jest całkowicie fikcyjna i wymyślona wyłącznie w celu wprowadzenia wstępu.
Jestem złym rolnikiem i aby podnieść cenę pszenicy w mojej okolicy, postanowiłem spalić pola wszystkich rolników wokół mnie. Naprawdę chciałbym zobaczyć, jak pola wybuchają w płomieniach (abym mógł użyć mojego złego śmiechu i pocierać moje ręce razem z radością), ale nie chcę też być przyłapany na oglądaniu, więc musisz symulować bycie polem spalone dla mnie.
Twoje zadanie:
Napisz program lub funkcję, która pobiera jako dane wejściowe pole i zwraca etapy jego spalania, aż całe pole zostanie popiołem. Określony odcinek płonącego pola jest reprezentowany przez liczbę całkowitą reprezentującą intensywność płomienia. Ogień zaczyna się od „1” i przechodzi do „2”, a następnie „3” i tak dalej. Gdy ogień osiągnie „4”, łapie wszelkie bezpośrednio (nie po przekątnej) sąsiednie obszary, które są łatwopalne w ogniu. Gdy osiągnie „8”, wypala się podczas następnej iteracji i zamienia się w popiół, reprezentowany przez „A”. Gdy obszar nie został jeszcze dotknięty przez ogień, jest reprezentowany przez „0”. Na przykład, jeśli pole wygląda tak:
100
000
Twój program powinien wypisać to:
100
000
200
000
300
000
410
100
520
200
630
300
741
410
852
520
A63
630
A74
741
A85
852
AA6
A63
AA7
A74
AA8
A85
AAA
AA6
AAA
AA7
AAA
AA8
AAA
AAA
Jeśli chcesz, możesz zastąpić powyższe symbole dowolnym wybranym przez siebie zestawem symboli, o ile są one spójne i różnią się od siebie.
Wkład:
Pozycja początkowa pola, w dowolnej standardowej formie, na przykład ciąg znaków rozdzielany znakami jak wyżej.
Wydajność:
Pole w każdej iteracji podczas spalania, albo jako tablica, albo jako ciąg ograniczony przez jakiś znak.
Przypadki testowe:
0301
000A
555
|
v
0301
000A
555
1412
010A
666
2523
020A
777
3634
030A
888
4745
141A
AAA
5856
252A
AAA
6A67
363A
AAA
7A78
474A
AAA
8A8A
585A
AAA
AAAA
6A6A
AAA
AAAA
7A7A
AAA
AAAA
8A8A
AAA
AAAA
AAAA
AAA
Punktacja:
To jest golf golfowy , najniższy wynik w bajtach wygrywa!
źródło
Odpowiedzi:
APL (Dyalog) , 52 bajty *
Zakłada, że
⎕IO←0
jest to domyślne w wielu systemach. Zajmuje pole za pomocą 0 dla pustych miejsc, 1 dla niepalnego pola, 2 dla nowego ognia, 5 dla rozprzestrzeniania ognia i 10 dla popiołu. Dane wejściowe muszą mieć co najmniej 3 × 3, co nie stanowi problemu, ponieważ dodatkowe wiersze i kolumny można uzupełnić zerami (spacje w formacie OP).Wypróbuj online!
Mój format utrudnia sprawdzenie poprawności, więc oto wersja z dodanym przetwarzaniem wstępnym i końcowym do tłumaczenia z formatu OP i na format OP.
⍣{
…}
Powtarzaj do:⍺
następne pokolenie≡
jest identyczny z⎕←⍵
obecna generacja, wyprowadzona{
…}⌺3 3
Zastąp każdą komórkę wynikiem tej funkcji zastosowanym w jej sąsiedztwie Moore:,⍵
ravel (spłaszcz) argument; daje listę dziewięciu elementówr←
przypisać do r4⊃
wybierz czwarty element; środek, tj. oryginalna wartość komórkic←
przypisać do c1=
czy jeden jest równy?:
jeśli tak, to:⍳2
najpierw do t ntegers; 0 19⍴
R eshape długości dziewięciu; 0 1 0 1 0 1 0 1 0r/⍨
użyj tego do filtrowania r (to dostaje tylko ortogonalnych sąsiadów)4∊
czy czwórka jest tego członkiem? (tj. czy będzie ich pięć w następnym pokoleniu?)1+
Dodaj jeden; 1, jeśli się nie zapali lub 2, jeśli się zapali⋄
else (tj. bieżąca wartość wynosi 0 lub ≥ 2)×c
podpis okc+
c plus to (tj. zwiększyć o jeden, jeśli się pali)10⌊
co najmniej dziesięć i to (ponieważ popiół się nie pali)* W Dyalog Classic, używając
⎕U233A
zamiast⌺
.źródło
fire '0A000\n0A0A0\n0A0A0\n000A1'
działa idealnie na sformatowanym, ale nie mogę uzyskać odpowiednika do pracy z pierwszym linkiem. Prawdopodobnie robię coś złego. To nie działa dla mnie:f ↑(0 0 0)(0 1 0)(0 0 0)
Python 3 , 232 bajty
Wypróbuj online!
-3 bajty dzięki Officialaimm poprzez połączenie drugiej lambdy w
f
(wygląda bałagan, ale oszczędza bajty i to wszystko, na czym nam zależy)-8 bajtów dzięki Mr. Xoder
-26 bajtów dzięki ovs
-6 bajtów dzięki ppperry
źródło
JavaScript (ES6),
217210207204193192190 bajtówZaoszczędzono 2 bajty dzięki sugestii @ Shaggy o użyciu
9
asA
.Używa
9
zamiastA
. Dane wejściowe jako tablica liczb całkowitych 2D. Dane wyjściowe jako tablica takich tablic.źródło
9
zamiastA
?Symulowanie świata (w emoji) , 1407 bajtów?
Czy nie lubisz używać wyjaśnień jako języka programowania? Wadą tego jest to, że zwykle nie jest bardzo dobrze zdefiniowany program, więc w tym przypadku używam eksportowanego JSON. (jeśli masz jakieś lepsze pomysły, daj mi znać)
Wypróbuj tutaj lub tutaj:
źródło
Siatkówka ,
1039688 bajtówWypróbuj online! Zastosowania
9
dla popiołu; można to zmienić przy użyciu 4 bajtówT`1-8`2-8A
. Edycja: Zapisano 6 bajtów dzięki @MartinEnder. Wyjaśnienie:Dodaj separator, aby wyjścia nie wpadały na siebie. (Pomaga również przy dopasowywaniu poniżej.)
Nie drukuj stanu końcowego (który jest taki sam jak poprzedni stan, który został już wydrukowany). Powtarzaj, aż przebieg nie zmieni stanu. Drukuj bieżący stan przed każdym przejściem.
Zwiększ intensywność całego ognia.
Oświetl odpowiednio nieoświetlone pola. Wyjaśnienie:
Zmierz numer kolumny tego nieoświetlonego pola.
Dopasuj nieoświetlone pole.
Poszukaj odpowiedniego pola po prawej stronie.
Poszukaj odpowiedniego pola w tej samej kolumnie (przy użyciu grupy bilansującej) w poniższym wierszu. Zauważ, że jeśli wejście może być zagwarantowane jako prostokątne, można to uprościć w
|.*¶(?>(?<-1>.)*)4
celu zaoszczędzenia 3 bajtów.Poszukaj odpowiedniego pola po lewej stronie. (Ponieważ patrzymy z prawej strony pola, widzimy również pole nieoświetlone).
Poszukaj odpowiedniego pola w tej samej kolumnie w wierszu powyżej. Ponieważ jest to wygląd zewnętrzny, a zatem dopasowanie od prawej do lewej, warunek grupy równoważącej musi pojawić się przed kolumnami, które zostały dopasowane przez grupę równoważącą.
źródło
Perl 5 , 365 bajtów
Wypróbuj online!
Używa „9” zamiast „A”, aby wskazać wypaloną lokalizację.
Wyjaśnił
źródło
Haskell , 162 bajty
Wypróbuj online! Użycie:
h
pobiera pole jako listę linii i zwraca listę pól. Pole jest wskazany przez niespalone@
i popiół przez9
, różne pożary są cyfry1
do8
.f
zarządza rozprzestrzenianiem się ognia od lewej do prawej, zastępując wszystkie niespalone@
pola, które są odpowiednie do płonącego3
pola0
.i
zwiększa każdą cyfrę, o ile jest mniejsza niż9
.g
stosuje sięf
do każdej linii, a następnie cofa linię, stosuje sięf
ponownie i cofa. Następnie lista linii jest transponowana i ponownie na każdej linii i na jej odwrocief
stosowana jest .h
stosujeg
się do danych wejściowych, dopóki nie zmieni się i nie zbierze wyników.źródło
_
. Jeśli nie jest to do zaakceptowania, obawiam się, że musiałbym usunąć odpowiedź, ponieważ jest ona skoncentrowana na użyciutranspose
i nie widzę sposobu, aby łatwo to naprawić bez wprowadzenia ton bajtów.C (gcc) ,
308305299297295291 bajtówTen program definiuje funkcję, która pobiera dwa dane wejściowe, wskaźnik do tablicy ciągów poprzedzonych jej długością, co jest dozwolone przez to domyślne ustawienie We / Wy. Dane wyjściowe do STDOUT z końcowym znakiem nowej linii.
Wypróbuj online!
źródło
80
.A
s, ale najwyraźniej pomyślałem, że źle. W każdym razie dzięki za informację. Teraz jest naprawione.Oktawa,
7269 bajtówDane wejściowe są traktowane jako tablica liczb 2D i puste miejsca oznaczone
Inf
.'A'
został zastąpiony przez9
. Wyniki pośrednie (jako tablica liczb) niejawnie wydrukowane.Wypróbuj online!
Wyjaśnienie:
W pętli funkcja
imdilate
(morfologiczne rozszerzenie obrazu) z pakietu obrazu służy do symulacji rozprzestrzeniania się ognia.źródło
[0 Inf 0 0 0;0 Inf 0 Inf 0;0 Inf 0 Inf 0;0 0 0 Inf 1]
- BardzoPython 2 , 325 bajtów
f
przyjmuje dane wejściowe jako tablicę liczb całkowitych 2D i puste miejsca oznaczone''
.'A'
został zastąpiony przez9
. Funkcja generuje generator wszystkich pól w czasie w tym samym formacie.Wypróbuj online!
źródło
Oktawa , 212 bajtów
Aby uruchomić, określ tablicę znaków, taką jak:
... następnie wykonaj:
Objaśnienie kodu do naśladowania ...
Wypróbuj online!
Note: I tried to run this code with tio.run, but I wasn't getting any output. I had to use another service.
źródło
PHP,
226 212 210 209 185177 bytestakes input with a trailing newline from a file named
m
;9
for ashes.Run with
-nr
or try it online.first approach: PHP 7.0, 209 bytes
takes input with a trailing newline from a file named
m
.Run with
-nr
or try it online.PHP version notes (for old approach)
$c-4|
with$g[$y+$p=[1,0,-1][$a]][$q+=$x]!="0"||$g[$y+$p][$q]=1;
[1,0,-1][$a]
with$a%2*~-($a&2)
a&$c
with""<$c
,+$c
with0<$c
and$c-4
with$c!=4
źródło
Octave,
419312 bytesTry it online!
This is my version it works, so now I still need to golf it. I think it can be a lot shorter if I find a way to find the indices of the 4 in a matrix, but I don't know how.
PS: A is a 9 in my code.
źródło
endif
endfor
andendwhile
you can writeend
Stencil (
∊
-mode), 22 bytesTry it online!
Just like in the test input, use integers separated by spaces for
0
-8
,' '
for blank and'A'
forA
. Remember to add trailing blanks too.źródło