(Es gibt verwandte Fragen zu unendlichen Sandhaufen und zum Auffinden von Identitätselementen von Sandhaufen .)
Bei einer Matrix nicht negativer Ganzzahlen geben Sie eine Matrix mit den gleichen Dimensionen zurück, die jedoch gestürzt wurde :
- Wenn die Matrix keine Werte größer als 4 enthält, geben Sie sie zurück.
- Jede "Zelle", die größer als 3 ist, wird um 4 verringert, und alle direkt benachbarten Zellen (oben, unten, links und rechts) werden inkrementiert, falls vorhanden.
- GOTO 1.
Beispiele:
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
(Sie müssen nur das Endergebnis zurückgeben. Der Pfad, auf dem Sie es erreichen, kann sich von dem hier gezeigten unterscheiden: Es spielt keine Rolle, in welcher Reihenfolge Sie die Sturzoperationen ausführen, sie führen alle zum gleichen Ergebnis.)
Für eine tiefere Erklärung und eine gewisse Motivation siehe dieses Numberphile-Video oder den Wikipedia-Artikel über das abelsche Sandpile-Modell .
Regeln:
- Sie können die Ein- und Ausgabe auf eine der Standardmethoden vornehmen
- Lücken sind verboten
- Input und Output können sein:
- eine verschachtelte Liste:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- eine einfache Liste:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
und die Form - eine Art nativer Matrixtyp
- eine Zeichenfolge, z
1 2 3\n4 5 6\n7 8 9
- oder was sonst noch in deiner Sprache funktioniert.
- eine verschachtelte Liste:
- Eingabe und Ausgabe müssen in derselben Form vorliegen
- Die Eingabe kann größere Zahlen als die hier gezeigten enthalten, die Größe ist jedoch möglicherweise an die Grenzen Ihrer Sprache gebunden (ggf. MAXINT-Äquivalente).
- Die Matrix kann eine beliebige Form haben (zB 1x1, 2x2, 3x3, 4x4, 2x7, 11x3, ...)
- Sie müssen den Fall nicht behandeln, in dem die Form 0xN oder Nx0 ist.
Testfälle
[[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]]
Dies ist Codegolf , der kürzeste Code (pro Sprache) gewinnt.
code-golf
array-manipulation
cellular-automata
L3viathan
quelle
quelle
Antworten:
MATL , 17 Bytes
Probieren Sie es bei MATL Online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Das Programm iteriert so oft wie die Summe der Eingaben. Dies ist eine lockere Obergrenze für die erforderliche Anzahl von Iterationen.
Bei jeder Iteration werden Einträge in der Sandpile-Matrix, die überschritten
3
werden, erkannt, was eine Matrix von1
und0
ergibt, die mit der 4-Nachbarn-Maske gefaltet wird. Die3
in der Sandpile-Matrix übersteigenden Einträge werden um reduziert4
, und das Ergebnis der Faltung wird addiert.Bei den letzten Iterationen, bei denen die Sandpile-Matrix keine Zahlen übersteigt
3
, werden Nullen abgezogen und hinzugefügt, sodass sie nicht betroffen sind.quelle
Mathematica, 65 Bytes
Erläuterung
Transformieren Sie die Eingabe wiederholt, indem Sie alle Stapel größer als 3 stürzen. Dieser Vorgang stoppt automatisch, wenn die Transformation die Matrix nicht ändert (dh wenn keine großen Stapel mehr vorhanden sind). Im folgenden Ausdruck wird die Matrix aufgerufen
s
.Erstellen Sie eine Matrix mit einer,
1
wenn die aktuelle Matrix eine4
oder mehr und andernfalls eine Null aufweist. Dies ist im Wesentlichen eine Maske, die angibt, welche Stapel gestürzt werden müssen. Nenne die Maskex
.Zuerst berechnen wir die Anzahl der Sande, die aufgrund umgestürzter benachbarter Pfähle zu jedem Pfahl hinzugefügt werden. Dies geschieht mit einer Faltung der folgenden Matrix über
x
:Im Wesentlichen wird für jeden von-Neumann-Nachbarn in der Maske eine Zelle zur aktuellen Zelle hinzugefügt.
Wir addieren das vorherige Ergebnis
s
und subtrahieren dann das Vierfache der Maske, um die umgestürzten Stapel zu reduzieren.quelle
Oktave, 65 Bytes
Das scheint nicht sehr gut zu sein, ich muss ein paar Tricks verpassen ...
quelle
input(0)
?>> version ans = 4.0.1
JavaScript (ES6),
101 bis95 ByteNimmt die Breite der Matrix
w
und ein Array von Wertena
in der aktuellen Syntax an(w)(a)
. Gibt ein Array von Werten zurück.Formatiert und kommentiert
Testfälle
Code-Snippet anzeigen
quelle
JavaScript (ES6),
118114104 Byte2 Bytes dank @Neil gespeichert
quelle
(i-=x)|y-j?i*i+
?a.find(...b.find(...c>3&&a.map(...)))&&f(a)
..map
nicht mutiert ...f=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 BytesNimmt Eingaben als Referenz auf einen Vektor von Vektoren und ändert sie direkt.
Probieren Sie es online!
quelle