16 Käsestapel werden auf ein 4x4-Quadrat gelegt. Sie sind von bis beschriftet . Der kleinste Stapel ist 1 und der größte ist 16 .
Die hungrige Maus ist so hungrig, dass sie immer direkt zum größten Stapel (dh ) geht und ihn sofort isst.
Danach geht es zum größten Nachbarhaufen und frisst diesen schnell auf. (Ja ... es ist wirklich hungrig.) Und so weiter, bis es keinen Nachbarhaufen mehr gibt.
Ein Stapel kann bis zu 8 Nachbarn haben (horizontal, vertikal und diagonal). Es gibt kein Umwickeln.
Beispiel
Wir beginnen mit folgenden Käsestapeln:
Die hungrige Maus frisst zuerst und dann ihren größten Nachbarstapel, nämlich .
Die nächsten Züge sind , , , , , , , , und in genau dieser Reihenfolge.
Es gibt keinen Käse mehr um die hungrige Maus, also hört es dort auf.
Die Herausforderung
In Anbetracht der anfänglichen Käsekonfiguration muss Ihr Code die Summe der verbleibenden Stapel drucken oder zurückgeben, sobald die hungrige Maus aufgehört hat, sie zu essen.
Für das obige Beispiel lautet die erwartete Antwort .
Regeln
- Da die Größe der Eingabematrix fest ist, können Sie sie entweder als 2D-Array oder als eindimensionales Array annehmen.
- Jeder Wert von bis wird garantiert genau einmal angezeigt.
- Das ist Code-Golf .
Testfälle
[ [ 4, 3, 2, 1], [ 5, 6, 7, 8], [12, 11, 10, 9], [13, 14, 15, 16] ] --> 0
[ [ 8, 1, 9, 14], [11, 6, 5, 16], [13, 15, 2, 7], [10, 3, 12, 4] ] --> 0
[ [ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12], [13, 14, 15, 16] ] --> 1
[ [10, 15, 14, 11], [ 9, 3, 1, 7], [13, 5, 12, 6], [ 2, 8, 4, 16] ] --> 3
[ [ 3, 7, 10, 5], [ 6, 8, 12, 13], [15, 9, 11, 4], [14, 1, 16, 2] ] --> 12
[ [ 8, 9, 3, 6], [13, 11, 7, 15], [12, 10, 16, 2], [ 4, 14, 1, 5] ] --> 34
[ [ 8, 11, 12, 9], [14, 5, 10, 16], [ 7, 3, 1, 6], [13, 4, 2, 15] ] --> 51
[ [13, 14, 1, 2], [16, 15, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12] ] --> 78
[ [ 9, 10, 11, 12], [ 1, 2, 4, 13], [ 7, 8, 5, 14], [ 3, 16, 6, 15] ] --> 102
[ [ 9, 10, 11, 12], [ 1, 2, 7, 13], [ 6, 16, 4, 14], [ 3, 8, 5, 15] ] --> 103
[[9, 10, 11, 12], [1, 2, 7, 13], [6, 16, 4, 14], [3, 8, 5, 15]]
Antworten:
Python 2 ,
133130 BytesProbieren Sie es online!
Nimmt eine abgeflachte Liste von 16 Elementen auf.
Wie es funktioniert
quelle
a[i+x]for x in[-6,-5,-4,-1,1,4,5,6]
für benachbarte Zellen kann auf abgekürzt werdena[i+j+j/3*2-6]for j in range(9)
(der Null-Eintrag ist harmlos). Python 3 kann sicher kürzer sein, wenn ein Längen-8-Bytestring hartcodiert wird, aber Python 2 ist möglicherweise insgesamt noch besser.a=[0]*5
for r in input():a=r+[0]+a
. Vielleicht gibt es eine noch kürzere Lösung für das Aufteilen von Strings, die keine Iteration erfordert.Python 2 , 111 Bytes
Probieren Sie es online!
An Bubbler angepasste Methoden- und Testfälle . Nimmt eine flache Liste auf STDIN.
Der Code prüft, ob zwei flache Indizes sich berühren
i
undj
stellt die sich berührenden Zellen dar, indem überprüft wird, ob sowohl Zeilenunterschiedei/4-j/4
als auch Spaltendifferenzeni%4-j%4
streng zwischen -2 und 2 liegen. Beim ersten Durchgang wird diese Prüfung automatisch erfolgreich durchgeführt, sodass der größte Eintrag unabhängig von der Nachbarschaft gefunden wird.quelle
MATL ,
504947 BytesDie Eingabe ist eine Matrix, die
;
als Zeilentrennzeichen verwendet wird.Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
PHP,
177 174171 BytesFühren Sie mit
-nr
, geben Sie Matrixelemente als Argumente an oder probieren Sie es online aus .quelle
JavaScript, 122 Byte
Ich habe mehr als ein paar falsche Kurven gefahren und jetzt habe ich keine Zeit mehr für weiteres Golfen, aber es funktioniert zumindest. Werde morgen wiederkommen (oder, wenn ich mich kenne, heute Abend im Zug nach Hause!), Wenn ich eine Minute finde.
Probieren Sie es online aus
quelle
flatMap()
: pR ,
128124123112110 BytesProbieren Sie es online!
Es erstellt eine 4x4-Matrix (die mir geholfen hat, Dinge zu visualisieren), füllt sie mit Nullen auf, beginnt dann mit 16 und durchsucht die umgebenden "Stapel" nach den nächstgrößeren und so weiter.
Abschließend wird eine Warnung ausgegeben, die jedoch keine Auswirkungen hat und das Ergebnis nicht ändert.
BEARBEITEN: -4 Bytes durch Komprimieren der Initialisierung der Matrix in 1 Zeile.
EDIT: -1 danke an Robert Hacken
EDIT: -13 Bytes, die die Vorschläge von Giuseppe und Robin Ryder kombinieren.
quelle
r==16
für das Sie Änderungen vornehmenr>15
.which
.m
als logische statt als ganze Zahl speichern und müssen daher nurwhich
einmal statt zweimal aufrufen .X%o%Y
ist ein Alias fürouter(X,Y,'*')
.outer
ist eine der praktischsten Funktionen, da sie als "Broadcast" -Funktion von Octave / MATLAB / MATL mit beliebigen (vektorisierten) Operatoren fungieren kann. Sehen Sie hier ; auch praktisch in seltenen fällen istkronecker
die auf dieser seite verlinkte.Kohle , 47 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Konvertieren Sie die eingegebenen Zahlen in alphabetische Zeichen (A = 0 .. Q = 16) und drucken Sie sie als 4x4-Raster.
Beginnen Sie mit dem Essen des Q, dh 16.
Wiederholen, während es etwas zu essen gibt.
Finden Sie heraus, wo sich der Stapel befindet. Dies ist eine lineare Ansicht in Hauptreihenfolge.
In Koordinaten konvertieren und zu diesem Ort springen.
Finde den größten benachbarten Stapel.
Iss den aktuellen Haufen.
Wandle die Stapel zurück in ganze Zahlen und nimm die Summe.
Löschen Sie die Zeichenfläche und geben Sie das Ergebnis aus.
quelle
Powershell,
143141136130122121 BytesWeniger Golf-Testskript:
Ausgabe:
Erläuterung:
Erster , fügen obere und untere Grenzen von 0 und ein eindimensionalen Array bilden:
Powershell gibt zurück,
$null
wenn Sie versuchen, den Wert hinter dem Ende des Arrays abzurufen.Zweitens begann die Schleife
biggest neighbor pile
von 16 bis zu einem Maximum ungleich Null. Und annullieren Sie es (die hungrige Maus isst es).Drittens die Summe der verbleibenden Stapel.
quelle
SAS,
236219 BytesEingabe auf Lochkarten, eine Zeile pro Raster (durch Leerzeichen getrennt), Ausgabe im Protokoll.
Diese Herausforderung wird durch einige Einschränkungen von Arrays in SAS etwas erschwert:
Aktualisierung:
infile cards;
Anweisung (-13)a:
für Array-Definition anstelle vona1-a16
(-4) verwendetGolf gespielt:
Ungolfed:
quelle
Haskell , 163 Bytes
Probieren Sie es online!
Die
f
Funktion nimmt die Eingabe als eine Liste von 4 Listen mit 4 ganzen Zahlen.Leicht ungolfed
quelle
JavaScript (ES7), 97 Byte
Übernimmt die Eingabe als abgeflachtes Array.
Probieren Sie es online!
Kommentiert
quelle
APL (Dyalog Unicode) ,
4241 Bytes SBCSProbieren Sie es online!
quelle
Java 10,
272248 BytesDie Zellen werden wie in meiner Antwort für die Herausforderung Alle die einzelnen Acht überprüft .
-24 Bytes dank @ OlivierGrégoire .
Probieren Sie es online aus.
Erläuterung:
quelle
int r,c,R=4,M=1,x,y,X,Y;for(r=c=X=Y=0;
, also danke. :)J 82 Bytes
Probieren Sie es online!
Ich plane dies morgen zum Golfplatz, und vielleicht eine J-ish Lösung ähnlich wie diese schreibe ein , aber ich dachte , ich würde den abgeflachte Ansatz versuchen , da ich das nicht vorher getan hatte.
quelle
]
ing
?Rot , 277 Bytes
Probieren Sie es online!
Die Lösung ist wirklich lang und ich bin nicht zufrieden damit, aber ich habe so viel Zeit damit verbracht, sie für die Arbeit in TIO zu reparieren (anscheinend gibt es viele Unterschiede zwischen der stabilen Win- und Linux-Version von Red), also poste ich sie trotzdem ...
Besser lesbar:
quelle
Jelly ,
31 3029 BytesDa die Methode viel zu langsam ist, um innerhalb von 60s mit der Maus ausgeführt zu werden,
16
beginnt sie damit9
und begrenzt ihre Fähigkeit so, dass sie nur9
s oder weniger essen kann. Probieren Sie es online aus! (also hier isst sie9, 2, 7, 4, 8, 6, 3
verlassen97
).Wie?
quelle
Nicht meine beste Arbeit. Es müssen einige Verbesserungen vorgenommen werden, von denen einige für den verwendeten Algorithmus von grundlegender Bedeutung sind. Ich bin sicher, dass nur ein verbessert werden kann
int[]
, aber ich konnte nicht herausfinden, wie Nachbarn auf diese Weise effizient aufgezählt werden können. Ich würde gerne eine PowerShell-Lösung sehen, die nur ein eindimensionales Array verwendet!PowerShell Core , 348 Byte
Probieren Sie es online!
Mehr lesbare Version:
quelle
(array|sort)[-1]
stattMeasure -max
zu arbeiten, im Kern falsche Ergebnisse lieferte. Keine Ahnung warum.(0..10|sort)[-1]
aber es gibt 10 auf PSv5 zurück, aber 9 auf PS Core. Dies liegt daran, dass es in lexikografischer Reihenfolge anstatt in numerischer behandelt wird. Schade, dass.C (gcc), 250 Bytes
Probieren Sie es online!
Hinweis: Diese Übermittlung ändert das Eingabearray.
s()
ist die Funktion, die mit einem Argument einer veränderlichen Variable aufgerufen werden sollint[16]
(das ist dasselbe im Speicher wie einint[4][4]
, als das esg()
interpretiert wird).s()
Findet die Position von16
im Array und übergibt diese Informationen an. Hierbeig
handelt es sich um eine rekursive Funktion, die eine Position annimmt, die Nummer an dieser Position auf 0 setzt und dann:Wenn sich eine positive Zahl daneben befindet, suchen Sie nach der Position der größten benachbarten Zahl
Anderenfalls geben Sie die Summe der Zahlen im Array zurück.
quelle
s(int*a){for(i=0;a[i]<16;++i);return g(a,i%4,i/4);}
Wolfram Language (Mathematica) , 149 Byte
Probieren Sie es online!
quelle
Add ++ , 281 Bytes
Probieren Sie es online!
Dies ist eine komplizierte Angelegenheit.
Überprüfen Sie alle Testfälle
Wie es funktioniert
Für diese Erklärung verwenden wir die Eingabe
Dies implementiert die beiden Hilfsfunktionen:
Schließlich wird t ausgegeben , dh die verbleibenden, nicht gesammelten Werte.
quelle
C # (.NET Core) , 258 Byte
Ohne LINQ. Das using System.Collections.Generic dient zur Formatierung nach - die Funktion benötigt es nicht.
Probieren Sie es online!
quelle
Perl 6 ,
151136126125119 BytesSuper schäbige Lösung. Übernimmt die Eingabe als abgeflachtes Array.
Probieren Sie es online!
quelle
Perl 5
-MList::Util=sum -p
, 137 BytesProbieren Sie es online!
quelle
K (ngn / k) , 49 Bytes
Probieren Sie es online!
Die Eingabe (
x
) ist ein 1D-Array(+!4 4)!x
ein Wörterbuch, das die Koordinatenpaare den Werten vonx
h::
einer globalen Variablen zuweisenh
*>
der Schlüssel, der dem Maximalwert entspricht{
}\
Wiederholen Sie diesen Vorgang bis zur Konvergenz und sammeln Sie die Zwischenwerte in einer Listeh[,x]:0
Die aktuelle Position auf Null setzen+x+0,'1-!3 3
Nachbarpositionen(
)#h
Filtern Sie sieh
als kleineres Wörterbuch*>
Welcher Nachbar hat den Maximalwert? Es wird die aktuelle Position für die neue Iteration+/h
Geben Sie zum Schluss die Summe derh
verbleibenden Werte zurückquelle
Wolfram Language (Mathematica) ,
124115 BytesProbieren Sie es online!
Dies nimmt ein 2D-Array, füllt es auf jeder Seite auf und glättet es dann sofort, damit wir keine Bytes für die Indizierung aufwenden müssen. Die einzigen Kosten hierfür sind
Join@@
die Abflachung. Danach geht es weiter wie unten.124-Byte-Version für ein 2D-Array: Probieren Sie es online aus!
Meistens meine eigene Arbeit, mit ein bisschen abgeleitet von der 149-Byte-Antwort von J42161217 .
Ungolfed:
quelle