Definieren wir eine Matrix von 9s als:
Definieren wir eine explodierende Zahl als eine Zahl an Position , die in gleiche ganze Zahlen zwischen allen benachbarten Nachbarn (einschließlich sich selbst) zerlegt werden kann und deren absoluter Wert größer als 0 ist.
Lassen Sie uns aus der vorherigen Matrix die Zahl an Position (0 indiziert)
Manchmal ist das Zerlegen des Ergebnisses in eine rationale Zahl größer als 1. Dies ist etwas, das wir beim Auflösen von Zahlen vermeiden müssen. In diesem Fall wird der Rest der explodierten Nummer zugewiesen.
Um dies zu demonstrieren, arbeiten wir weiter mit unserer vorherigen Matrix. Dieses Mal werden wir die Zahl an der Position explodieren
Hier haben wir 3 Nachbarn und die Nummer selbst. Hier ist die Gleichung was uns 2 für jede und 2 für den Rest gibt.
Manchmal ist eine Zahl auch nicht groß genug, um zu gleichen Teilen (wobei abs größer als 0 ist) zwischen seinen Nachbarn zerlegt zu werden (| rationale Zahl | <1). In diesen Fällen müssen wir von der explodierten Nummer "leihen" , um den Zustand "größer als 0" beizubehalten . Fahren wir mit unserem vorherigen Beispiel fort und explodieren die Zahl an Position .
Die Herausforderung besteht darin, bei einer Liste von Positionen und einem endlichen, nicht leeren Array von natürlichen Zahlen die aufgelöste Form zurückzugeben, nachdem jede Zahl aus der Positionsliste aufgelöst wurde.
Testfälle
Eingang: initial matrix: [[3, 3, 3], [3, 3, 3], [3, 3, 3]], numbers: [[0,0],[0,1],[0,2]]
Ausgabe: [[1, 0, 1], [5, 6, 5], [3, 3, 3]]
Eingang: Initial matrix: [[9, 8, 7], [8, 9, 7], [8, 7, 9]], numbers: [[0,0],[1,1],[2,2]]
Ausgabe: [[4, 11, 8],[11, 5, 10],[9, 10, 4]]
Eingang: Initial matrix: [[0, 0], [0, 0]], numbers: [[0,0],[0,0],[0,0]]
Ausgabe: [[-9, 3],[3, 3]]
Eingang: Initial Matrix: [[10, 20, 30],[30, 20, 10],[40, 50, 60]], numbers: [[0,2],[2,0],[1,1],[1,0]]
Ausgabe: [[21, 38, 13], [9, 12, 21], [21, 71, 64]]
Eingang: Initial Matrix: [[1]], numbers: [[0,0]]
Ausgabe: [[1]]
Eingang: Initial Matrix: [[1, 2, 3]], numbers: [[0,0], [0, 1]]
Ausgabe: [[1, 1, 4]]
Anmerkungen
Input / Output - Regeln gelten
Sie können davon ausgehen, dass die Eingabematrix niemals leer sein wird
Sie können davon ausgehen, dass Koordinaten immer gültig sind
Die Eingabekoordinate in Testfällen wird als (Zeile, Spalte) angegeben. Wenn Sie möchten, dass es (x, y) ist, können Sie die Werte austauschen. Wenn ja, geben Sie dies bitte in Ihrer Antwort an
Antworten:
C (GCC)
220216214212 BytesGutschrift an @ceilingcat für 2 Bytes
Führen Sie es hier aus
eine etwas weniger golfene Version
Die Vorwahl mit einem Beispiel
und die Ausgabe
quelle
JavaScript (ES7),
126 125 123121 Byte2 Bytes dank @Shaggy gespart
Übernimmt die Eingabe als
(matrix)(list)
. Ausgabe durch Ändern der Matrix.Probieren Sie es online!
Wie?
Stattdessen verwenden wir eine rekursive Funktion, die einen einfacheren Ablauf von Operationen ausführt und so oft wie nötig wiederholt:
Der Hauptvorteil ist, dass wir nur eine Schleife über der Matrix benötigen. Der zweite Vorteil ist, dass wir überhaupt keinen Quotienten berechnen müssen.
Beispiel
Nach Schritt 1 der ersten Iteration haben wir:
Und nach Schritt 2 der ersten Iteration :
Nach Schritt 1 der zweiten Iteration haben wir:
Und nach Schritt 2 der zweiten Iteration :
Wir zählen nun die Referenzzelle zweimal ( Schritt 4 von beiden Iterationen ) zum Endergebnis führt:
Kommentiert
quelle
(0)
durch 2 Backticks ersetzen.R ,
163162161159155146 BytesProbieren Sie es online!
Erläuterung
(Entspricht einer früheren Version des Codes)
quelle
Sauber ,
181167 BytesProbieren Sie es online!
In Form eines teilweise angewendeten Funktionswörters.
Erweitert (erste Version):
quelle
Rust - 295 Bytes
Dies ist ziemlich lang, da Rust eine vorzeichenlose Ganzzahl-Indizierung von Vektoren erfordert, aber vorzeichenbehaftete Ganzzahlen zur Subtraktion benötigt, was zu Negativen führt. Ich glaube jedoch, dass mein Algorithmus der "kürzeste Algorithmus" ist. Es besteht eigentlich keine Notwendigkeit, Kanten, Boden usw. zu erkennen.
Beachten Sie drei Dinge: Erstens ist die Summe aller Zellen immer konstant. Zweitens ist dies eine Teilungs- / Rest-Situation, sodass wir das Denken nach dem Bresenham-Algorithmus anwenden können. Drittens fügt die Frage allen Zellen innerhalb eines bestimmten Abstands von der Sonderpositionszelle immer die gleiche Nummer hinzu, bevor das "zusätzliche" Zeug in der Sonderposition behandelt wird.
Algorithmus:
Speichern Sie den ursprünglichen Wert der Zelle an Position P in M.
Schleife beginnen:
Iteriere über jede Zelle I in der Matrix. Wenn die Position von Zelle I innerhalb von 3 Quadrance (Quadratabstand) von der Position P liegt, subtrahieren Sie 1 von Zelle P und addieren Sie 1 zu Zelle I. Zählen Sie, wie oft dies in einer Iteration durch die Matrix erfolgt.
Wenn der in der Zelle an Position P verbleibende Wert kleiner oder gleich M / Count + M modulo Count ist, unterbrechen Sie die Schleife. Führen Sie andernfalls die Schleife erneut durch.
Die resultierende Matrix wird die Explosionsversion sein. Count ist im Grunde eine Möglichkeit, Nachbarn zu zählen, ohne mit Kanten umzugehen. Looping ist ein Weg, um das Teilungs- / Additionsmaterial in eine wiederholte einzelne Addition / Subtraktion von eins zu zerlegen. Der Modulo-Check stellt sicher, dass an Position P noch der Rest für Explosionen übrig ist, die sich nicht gleichmäßig auf die Nachbarn aufteilen lassen. Die do / while-Schleifenstruktur ermöglicht, dass P <0 ordnungsgemäß funktioniert.
Ungolfed-Version auf dem Rostspielplatz
quelle
f
wäre. Aber Sie könnten wahrscheinlich noch mehr Bytes sparen, indem Sie eine anonyme Funktion verwenden:|p:(i8,i8),v:&mut Vec<Vec<i8>>|{...}
Java 10,
194193191190184182171 BytesIterativer Port der JavaScript-Antwort von @Arnauld .
-17 Bytes dank @Arnauld .
Ändert die Eingabematrix, anstatt eine neue zurückzugeben, um Bytes zu sparen.
Probieren Sie es online aus.
Erläuterung:
quelle
m[y]
m[y][x]
undefined[x]
dies fehlschlagen würde. Wie auch immer, Ihr(x-X)**2+(y-Y)**2<3
Scheck ist ziemlich schlau. Denken Sie daran, wenn ich jemals Werte in einer Matrix in einem 3x3-Block (und innerhalb von Grenzen) überprüfen möchte. Ich denke, ich habe tatsächlich ein paar Antworten wie diese, bei denen ich jetzt einen Try-Catch verwende und in einem Fall schließlich versuche. Werde mir diese ansehen, wenn ich etwas Zeit habe.Common Lisp , 498 Bytes
Probieren Sie es online!
Verwenden Sie diese Funktion als
(print (c #2A((3 3 3) (3 3 3) (3 3 3)) '((0 0)(0 1)(0 2))))
Besser lesbare Version:
Ausgabebeispiel:
quelle
Python 2 , 171 Bytes
Probieren Sie es online!
quelle