Ich mag die Hilbert-Kurve .
Ihre Aufgabe für diese Herausforderung ist es, ein Bild (ausschließlich ein quadratisches Bild, bei dem alle Seiten eine Stärke von zwei Pixeln haben) aufzunehmen, zickzackförmig zeilenweise zu entwirren und es in einer Pseudo-Hilbert-Kurve wieder aufzurollen .
Auflösen
Zum Auflösen beginnen Sie mit dem Pixel in der oberen linken Ecke und bewegen sich nach rechts, bis Sie am Bildrand ankommen. Sobald Sie den Bildrand erreicht haben, springen Sie in die nächste Reihe und bewegen sich nach links, bis Sie den Bildrand erneut erreichen. Sie werden fortfahren, Reihe für Reihe zu entwirren, indem Sie die Richtung jedes Mal wechseln, so dass Sie eine kontinuierliche Kurve erhalten. Dies sollte wie ein gut gespieltes Schlangenspiel aussehen
Das Ergebnis des Auflösens sollte eine Pixelreihenfolge sein, die jedes Pixel genau einmal enthält
Umschiffen
Sobald Sie eine Reihenfolge für die Pixel festgelegt haben, ordnen Sie sie auf einer neuen Leinwand gleicher Größe neu an, die dem Pfad einer Pseudo-Hilbert-Kurve folgt. Für ein 2**n
quadratisches Bild sollten Sie die n-te Iteration der Pseudohilbert-Kurve verwenden. Jedes Pixel wird genau an einer Stelle auf der neuen Leinwand platziert. Sie sollten das Bild neu berechnen, sodass der Punkt oben links (der Anfang unserer Schlangenkurve) dort bleibt und der Punkt unten rechts (das Ende unserer Schlangenkurve) oben rechts platziert wird.
I / O
Ihr Programm oder Ihre Funktion sollte ein Abbild bestimmter Einschränkungen über Standardmethoden aufnehmen und ein anderes Abbild über Standardmethoden ausgeben.
Wertung
Dies ist ein Code-Golf- Programm mit den wenigsten Gewinnen.
Beispiele
Eingang
Ausgabe
Eingang
Ausgabe
Eingang
Ausgabe
Ich empfehle auch, ein leeres weißes oder einfarbiges Bild zu testen, um sicherzustellen, dass keine Pixel fehlen.
Fühlen Sie sich frei, Ihre eigenen Ergebnisse in Ihre Antworten einzubeziehen!
quelle
Antworten:
Mathematica,
286273 BytesPuh! Anspruchsvoll aber spaßig!
Erläuterung
Konvertieren Sie ein
Image
in ein Array von RGB-Werten.Generieren eines
l
vonl
Array mit Kopf1
, wobei diel
die Länge des Eingangssignals (dh , die Breite des Bildes).Dies ergibt
{{1[1, 1], 1[1, 2], ..., 1[1, L]}, {1[2, 1], ..., 1[2, L]}, ..., {1[L, 1], ..., 1[L, L]}}
(l
in Großbuchstaben geschrieben, um Verwirrung zu vermeiden)Eine
StringReplace
Funktion, die jedes"L"
mit"+RF-LFL-FR+"
und"R"
mit ersetzt"-LF+RFR+FL-"
Tragen Sie die
StringReplace
Funktion auf dieString
"L"
,Log2[l]
mal.Konvertieren Sie das Ergebnis
String
in einList
von Zeichen.Eine unbenannte Funktion, die:
"-"
, multiplizieren Sie das zweite Element der ersten Eingabe mitI
."+"
, dividieren Sie das zweite Element der ersten Eingabe durchI
."F"
, erhöhen Sie die erste Eingabe um denReIm
(trennt den Real- und Imaginärteil der Eingabe) der zweiten Eingabe.Wenden Sie beginnend mit
{{1,1},I}
die oben genannte unbenannte Funktion kumulativ an und verwenden Sie dabei jedes ElementList
der Zeichen als zweite Eingabe. Dieser Code liefert die Ausgaben aller Iterationen.Beseitigen Sie die zweiten Elemente
List
und löschen Sie Duplikate. (Die Schritte bis zu diesem Punkt erzeugen eine AnzahlList
von Koordinaten der Hilbert-Kurve.)Entwirre das Eingabe-RGB-Array (kehrt jede zweite Zeile um und flacht ab).
Erstellen Sie
Rule
Objekte, sodass das erste Element in der ersten Eingabe (die Koordinaten der Hilbert-Kurve) mit dem ersten Element der zweiten Eingabe (dem enträtselten Bild), dem zweiten Element mit der zweiten Eingabe usw. gepaart wird.Wenden Sie diese Ersetzungen
Rule
aufArray
den zweiten Schritt an.Konvertieren Sie in das Array von RGB-Werten in ein
Image
.Probe ein / aus
Eingang:
Ausgabe:
Eingang:
Ausgabe:
Inverse Funktion (
266253 Bytes)quelle
Oktave 234 Bytes
Dateinamen von Eingabe- und Ausgabebildern sollten als Standardeingabe bereitgestellt werden. Die Größe des Codes ohne Eingabe / Ausgabe beträgt 194 Bytes .
Erläuterung:
Das Grundmuster von Indizes ist:
In jeder Iteration werden 4 Kopien des Ergebnisses der vorherigen Iteration erstellt und eine Transformation auf jede Kopie angewendet. Anschließend werden alle Blöcke verkettet, um das aktuelle Ergebnis zu bilden.
also haben wir:
Hilbert-Indizes sortiert und Indizes der sortierten Elemente zurückgegeben:
Auflösen angewendet alle geraden Reihen spiegeln:
Reraveling angewendet: -
Wiederholt für jeden Kanal. -
Permutation angewendet, da die Oktavdaten spaltenweise angeordnet sind
Beispielbilder:
quelle