Der Nahtschnitt-Algorithmus oder eine komplexere Version davon wird für die inhaltsbezogene Größenänderung von Bildern in verschiedenen Grafikprogrammen und Bibliotheken verwendet. Lass es uns spielen!
Ihre Eingabe wird ein rechteckiges zweidimensionales Array von Ganzzahlen sein.
Ihre Ausgabe ist dasselbe Array, eine Spalte enger, wobei ein Eintrag aus jeder Zeile entfernt wird, wobei diese Einträge einen Pfad von oben nach unten mit der niedrigsten Summe aller solcher Pfade darstellen.
https://en.wikipedia.org/wiki/Seam_carving
In der obigen Abbildung wird der Wert jeder Zelle in Rot angezeigt. Die schwarzen Zahlen sind die Summe aus dem Wert einer Zelle und der niedrigsten schwarzen Zahl in einer der drei darüber liegenden Zellen (auf die die grünen Pfeile zeigen). Die weiß hervorgehobenen Pfade sind die beiden Pfade mit der niedrigsten Summe, beide mit einer Summe von 5 (1 + 2 + 2 und 2 + 2 + 1).
In einem Fall, in dem zwei Pfade für die niedrigste Summe gebunden sind, spielt es keine Rolle, welche Sie entfernen.
Die Eingabe sollte von stdin oder als Funktionsparameter erfolgen. Es kann in einer Weise formatiert werden, die für die Sprache Ihrer Wahl geeignet ist, einschließlich Klammern und / oder Trennzeichen. Bitte geben Sie in Ihrer Antwort an, wie die Eingabe erwartet wird.
Die Ausgabe sollte in einem eindeutig begrenzten Format oder als Funktionsrückgabewert in der Entsprechung Ihrer Sprache zu einem 2D-Array (einschließlich verschachtelter Listen usw.) erfolgen.
Beispiele:
Input:
1 4 3 5 2
3 2 5 2 3
5 2 4 2 1
Output:
4 3 5 2 1 4 3 5
3 5 2 3 or 3 2 5 3
5 4 2 1 5 2 4 2
Input:
1 2 3 4 5
Output:
2 3 4 5
Input:
1
2
3
Output:
(empty, null, a sentinel non-array value, a 0x3 array, or similar)
BEARBEITEN: Die Zahlen sind alle nicht negativ und jede mögliche Naht hat eine Summe, die in eine vorzeichenbehaftete 32-Bit-Ganzzahl passt.
quelle
Antworten:
CJam,
5144 BytesDies ist eine anonyme Funktion, mit der ein 2D-Array aus dem Stapel entfernt und zurückgegeben wird.
Probieren Sie die Testfälle online im CJam-Interpreter aus . 1
Idee
Dieser Ansatz iteriert über alle möglichen Kombinationen von Zeilenelementen, filtert diejenigen heraus, die nicht den Nähten entsprechen, sortiert nach der entsprechenden Summe, wählt das Minimum aus und entfernt die entsprechenden Elemente aus dem Array. 2
Code
1 Beachten Sie, dass CJam nicht zwischen leeren Arrays und leeren Strings unterscheiden kann, da Strings nur Arrays sind, deren Elemente Zeichen sind. Somit ist die Zeichenfolgendarstellung sowohl für leere Arrays als auch für leere Zeichenfolgen gleich
""
.2 Während die zeitliche Komplexität des auf der Wikipedia-Seite gezeigten Algorithmus für eine n × m- Matrix 0 (nm) betragen sollte, ist diese mindestens 0 (m n ) .
quelle
{2ew::m2f/0-!},
Haskell, 187 Bytes
Anwendungsbeispiel:
So funktioniert es, Kurzversion: Liste aller Pfade (1) erstellen, pro Pfad entsprechende Elemente (2) entfernen und alle verbleibenden Elemente (3) summieren. Nimm das Rechteck mit der größten Summe (4).
Längere Version:
quelle
IDL 8,3, 307 Bytes
Meh, ich bin sicher, das wird nicht gewinnen, weil es lange dauert, aber hier ist eine einfache Lösung:
Ungolfed:
Wir erstellen iterativ das Energiearray und verfolgen, in welche Richtung die Naht verläuft, und erstellen dann eine Entfernungsliste, sobald wir die endgültige Position kennen. Entfernen Sie die Naht durch 1D-Indizierung und stellen Sie die neuen Abmessungen wieder her.
quelle
[0:n]
. Wenn das wahr ist, dann ist es leicht zu ersetzenr+=[0:z[1]-1]*z[0]
mitr+=indgen(z[1]-1)*z[0]
.JavaScript ( ES6 ) 197
209 215Schritt für Schritt Implementierung des Wikipedia-Algorithmus.
Vermutlich kann mehr gekürzt werden.
Testen Sie das Snippet in Firefox.
quelle
Pip, 91 Bytes
Dies wird keine Preise gewinnen, aber ich hatte Spaß daran zu arbeiten. Leerzeichen dienen nur kosmetischen Zwecken und sind nicht in der Byteanzahl enthalten.
Dieser Code definiert eine anonyme Funktion, deren Argument und Rückgabewert verschachtelte Listen sind. Es implementiert den Algorithmus von der Wikipedia-Seite:
a
(das Argument) sind die roten Zahlen undz
sind die schwarzen Zahlen.Hier ist eine Version mit Testgeschirr:
Ergebnisse:
Und hier ist die grobe Entsprechung in Python 3. Wenn jemand eine bessere Erklärung des Pip-Codes möchte, fragen Sie einfach in den Kommentaren.
quelle