(Istnieją pokrewne pytania dotyczące nieskończonych piaskowców i znajdowania elementów tożsamości piaskowców .)
Biorąc pod uwagę macierz nieujemnych liczb całkowitych, zwróć macierz o takich samych wymiarach, ale przewrócona :
- Jeśli macierz nie zawiera wartości większych niż 4, zwróć ją.
- Każda „komórka”, która jest większa niż 3, zostaje zmniejszona o 4, a wszystkie bezpośrednio sąsiadujące komórki (powyżej, poniżej, lewej i prawej) są zwiększane, jeśli istnieją.
- GOTO 1.
Przykłady:
0 1 0 0 2 0
2 4 0 -> 3 0 1
0 0 3 0 1 3
1 2 3 2 3 4 2 5 1 4 1 2 0 3 3 0 3 3 0 3 3
4 5 6 -> 2 4 4 -> 4 2 3 -> 0 5 4 -> 3 2 1 -> 3 3 1 -> 3 3 2
7 8 9 5 7 7 2 6 5 4 3 2 0 5 3 1 1 4 1 2 0
(Musisz tylko zwrócić wynik końcowy. Ścieżka, na którą do niego dojdziesz, może różnić się od pokazanej tutaj: nie ma znaczenia, w jakiej kolejności wykonujesz operacje obalenia, wszystkie prowadzą do tego samego wyniku).
W celu uzyskania głębszego wyjaśnienia i pewnej motywacji zobacz ten film Numberphile lub artykuł w Wikipedii na temat modelu Abelian Sandpile .
Zasady:
- Możesz pobierać dane wejściowe i wyjściowe na dowolny ze standardowych sposobów
- Luki są zabronione
- Dane wejściowe i wyjściowe mogą być:
- zagnieżdżona lista:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- prosta lista:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
i kształt - jakiś rodzimy typ macierzy
- ciąg, np
1 2 3\n4 5 6\n7 8 9
- lub cokolwiek innego, co działa w twoim języku.
- zagnieżdżona lista:
- Dane wejściowe i wyjściowe muszą być w tej samej formie
- Dane wejściowe mogą zawierać większe liczby niż te pokazane tutaj, ale rozmiar może być ograniczony przez ograniczenia twojego języka (odpowiedniki MAXINT, jeśli dotyczy)
- Matryca może mieć dowolny kształt (np. 1x1, 2x2, 3x3, 4x4, 2x7, 11x3, ...)
- Nie musisz zajmować się przypadkiem, w którym kształt ma wartość 0xN lub Nx0.
Przypadki testowe
[[2, 5, 4], [8, 6, 4], [1, 2, 3]] -> [[3, 3, 0], [1, 2, 2], [1, 3, 2]]
[[0, 0, 2], [1, 3, 3], [0, 0, 0]] -> [[0, 0, 2], [1, 3, 3], [0, 0, 0]]
[[9, 9, 9], [9, 9, 9], [9, 9, 9]] -> [[1, 3, 1], [3, 1, 3], [1, 3, 1]]
[[4, 5], [2, 3]] -> [[2, 3], [0, 1]]
[[2, 3, 5], [2, 2, 0]] -> [[3, 0, 2], [2, 3, 1]]
[[7]] -> [[3]]
code-golf
array-manipulation
cellular-automata
L3viathan
źródło
źródło
Odpowiedzi:
MATL , 17 bajtów
Wypróbuj w MATL Online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
Program iteruje tyle razy, ile suma danych wejściowych. Jest to luźna górna granica wymaganej liczby iteracji.
Dla każdej iteracji
3
wykrywane są przekroczenia matrycy stosu piasku , co daje macierz1
i0
, która jest spleciona z maską 4-sąsiednią. Wpisy przekraczające3
w macierzy piasku są zmniejszane o4
i dodawany jest wynik splotu.Dla ostatnich iteracji, w których macierz piasku nie ma żadnych liczb przekraczających
3
, zera są odejmowane i dodawane do niej, więc nie ma to wpływu.źródło
Mathematica, 65 bajtów
Wyjaśnienie
Wielokrotnie przekształcaj dane wejściowe, przewracając wszystkie stosy większe niż 3. Proces ten zatrzymuje się automatycznie, gdy transformacja nie zmieni matrycy (tj. Gdy nie ma już dużych stosów). W poniższym wyrażeniu wywoływana jest macierz
s
.Utwórz macierz, która ma
1
ilekroć bieżąca macierz ma a4
lub większą, a zero w przeciwnym razie. Zasadniczo jest to maska wskazująca, które stosy należy obalić. Zadzwoń do maskix
.Najpierw obliczamy liczbę piasku dodawanego do każdego stosu ze względu na przewrócone sąsiednie stosy. Odbywa się to poprzez splot następującej matrycy
x
:Zasadniczo dodaje jeden do bieżącej komórki dla każdego z sąsiadów von-Neumanna w masce.
Dodajemy poprzedni wynik,
s
a następnie odejmujemy od niego czterokrotnie maskę, aby zmniejszyć przewrócone stosy.źródło
Oktawa, 65 bajtów
To nie wydaje się zbyt dobre, chyba brakuje mi trików ...
źródło
input(0)
?>> version ans = 4.0.1
JavaScript (ES6),
10195 bajtówPobiera szerokość macierzy
w
i tablicę wartościa
w składni curry(w)(a)
. Zwraca tablicę wartości.Sformatowane i skomentowane
Przypadki testowe
Pokaż fragment kodu
źródło
JavaScript (ES6),
118114104 bajtówZaoszczędź 2 bajty dzięki @Neil
źródło
(i-=x)|y-j?i*i+
pomagaa.find(...b.find(...c>3&&a.map(...)))&&f(a)
..map
nief=a=>a.find((b,x)=>b.find((c,y)=>c>3&&a.map(b=>b.map((_,j)=>b[j]+=x|(j-=y)?x*x+j*j==1:-4)&x--)))&&f(a)
C ++,
261258250 bajtówPobiera dane wejściowe jako odniesienie do wektora wektorów i modyfikuje go bezpośrednio.
Wypróbuj online!
źródło