Marching Squares ist ein Algorithmus aus der Computergrafik, mit dem 2D-Isokonturen aus einem Raster von Stichproben wiederhergestellt werden (siehe auch den großen Bruder Marching Cubes für 3D-Einstellungen). Die Idee ist, jede Zelle des Gitters unabhängig zu verarbeiten und die Konturen, die durch diese Zelle verlaufen, basierend auf den Werten an ihren Ecken zu bestimmen.
Der erste Schritt in diesem Prozess besteht darin, zu bestimmen, welche Kanten durch Konturen verbunden sind, basierend darauf, ob die Ecken über oder unter dem Wert der Kontur liegen. Der Einfachheit halber werden nur Konturen entlang des Werts berücksichtigt 0
, sodass wir daran interessiert sind, ob die Ecken positiv oder negativ sind. Es gibt Fälle zu unterscheiden:24 = 16
Bildquelle: Wikipedia
Die Identifizierung von Weiß und Schwarz spielt hier keine Rolle, aber für die Bestimmtheit sagen wir, dass Weiß positiv und Schwarz negativ ist. Wir werden Fälle ignorieren, in denen eine der Ecken genau ist 0
.
Die Sattelpunkte (Fälle 5 und 10) bieten eine zusätzliche Schwierigkeit: Es ist nicht klar, welche Diagonalen verwendet werden sollen, wenn nur die Ecken betrachtet werden. Dies kann gelöst werden, indem der Durchschnitt der vier Ecken ermittelt wird (dh eine Annäherung an den Mittelwert) und die Diagonalen so gewählt werden, dass die Konturen die Mitte von den Ecken mit dem entgegengesetzten Vorzeichen trennen. Wenn der Durchschnitt genau ist 0
, kann jeder Fall gewählt werden.
Normalerweise werden diese 16 Fälle einfach in einer Nachschlagetabelle gespeichert. Dies ist sehr effizient, aber wir würden es natürlich vorziehen, wenn der Code hier kurz ist. Ihre Aufgabe ist es also, diesen Suchschritt auszuführen und eine ASCII-Darstellung des Falls in so wenig Code wie möglich zu drucken.
Die Herausforderung
Sie erhalten die Werte der vier Ecken (Ganzzahlen ungleich Null) in einer festen Reihenfolge Ihrer Wahl. Sie sollten dann das richtige Layout der Konturen generieren und die Sattelpunktfälle korrekt auflösen.
Sie können ein Programm oder eine Funktion schreiben, indem Sie Eingaben über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), den Funktionsrückgabewert oder den Funktionsparameter (out) ausgeben.
Die Eingabe kann in einem beliebigen geeigneten Zeichenfolgen- oder Listenformat erfolgen.
Die 16 Fälle werden in ASCII-Grafik mit einem der folgenden 5x5-Blöcke dargestellt:
o---o o---o o---o
| | | | | | |
| | |---| | | |
| | | | | | |
o---o o---o o---o
o---o o---o o---o o---o
|/ | | \| | | | |
| | | | | | | |
| | | | |\ | | /|
o---o o---o o---o o---o
o---o o---o
|/ | | \|
| | | |
| /| |\ |
o---o o---o
Sie dürfen keine führenden oder nachfolgenden Leerzeichen drucken, dürfen jedoch eine einzelne optionale neue Zeile drucken.
Dies ist Code Golf, daher gewinnt die kürzeste Antwort (in Bytes).
Testfälle
In den Testfällen wird davon ausgegangen, dass die Eingabe in der Reihenfolge oben links , oben rechts , unten links , unten rechts erfolgt . Testfälle werden in 9 Gruppen dargestellt, von denen eine jeder der 9 oben angegebenen Darstellungen entspricht (in derselben Reihenfolge, beginnend mit der leeren Zelle, endend mit den beiden Sattelpunkten).
[1, 2, 1, 3]
[-9, -2, -2, -7]
[4, 5, -1, -2]
[-1, -2, 3, 4]
[7, -7, 7, -7]
[-5, 5, -5, 5]
[1, -6, -4, -1]
[-2, 3, 3, 4]
[-1, 6, -4, -1]
[2, -3, 3, 4]
[-1, -6, 4, -1]
[2, 3, -3, 4]
[-1, -6, -4, 1]
[2, 3, 3, -4]
[3, -8, -9, 2]
[-3, 8, 9, -2]
[8, -3, -2, 9]
[-8, 3, 2, -9]
Darüber hinaus können die folgenden Testfälle einen der Sattelpunkte (Ihre Wahl) zurückgeben:
[1, -4, -2, 5]
[-1, 4, 2, -5]