J'aime la courbe de Hilbert .
Votre tâche pour ce défi est de prendre une image (strictement une image carrée où tous les côtés ont une puissance de deux pixels de large) et de la démêler ligne par ligne en zigzaguant et de la défiler en arrière dans une courbe pseudo-Hilbert .
Démêler
Pour démêler, vous commencerez avec le pixel dans le coin supérieur gauche et voyagerez à droite jusqu'à ce que vous arriviez au bord de l'image. Une fois que vous avez touché le bord de l'image, vous descendez à la ligne suivante et commencez à voyager à gauche jusqu'à ce que vous frappiez à nouveau le bord. Vous continuerez à démêler ligne par ligne en changeant de direction à chaque fois afin d'obtenir une courbe continue. Cela devrait ressembler à un jeu de serpent bien joué
Le résultat du démêlage doit être un ordre de pixels qui inclut chaque pixel exactement une fois
Reraveling
Une fois que vous aurez commandé les pixels, vous les réorganiserez sur un nouveau canevas de taille égale suivant le chemin d'une pseudo-courbe de Hilbert. Pour une 2**n
image carrée de taille, vous devez utiliser la nième itération de la courbe pseudo-hilbert. Chaque pixel sera placé exactement à un endroit sur la nouvelle toile. Vous devez redéfinir l'image afin que le point initialement en haut à gauche (le début de notre courbe de serpent) y reste et que le point en bas à droite (la fin de notre courbe de serpent) soit placé en haut à droite.
E / S
Votre programme ou fonction doit prendre une image des contraintes spécifiées via des méthodes standard et produire une autre image via des méthodes standard.
Notation
Il s'agit d' un programme de golf de code avec le moins de victoires d'octets.
Exemples
Contribution
Sortie
Contribution
Sortie
Contribution
Sortie
Je recommande également de tester sur une image vierge en blanc ou en couleur unie pour vous assurer qu'il ne manque aucun pixel.
N'hésitez pas à inclure vos propres résultats dans vos réponses!
la source
Réponses:
Mathematica,
286273 octetsPhew! Difficile mais amusant!
Explication
Convertissez un
Image
en un tableau de valeurs RVB.Générez un tableau
l
parl
avec tête1
, oùl
est la longueur de l'entrée (c'est-à-dire la largeur de l'image).Cela donne
{{1[1, 1], 1[1, 2], ..., 1[1, L]}, {1[2, 1], ..., 1[2, L]}, ..., {1[L, 1], ..., 1[L, L]}}
(l
écrit en majuscules pour réduire la confusion)Une
StringReplace
fonction qui remplace tout"L"
avec"+RF-LFL-FR+"
et"R"
avec"-LF+RFR+FL-"
Appliquer la
StringReplace
fonction auxString
"L"
, lesLog2[l]
temps.Convertissez le résultat
String
en unList
de caractères.Une fonction sans nom qui:
"-"
, multipliez le deuxième élément de la première entrée parI
."+"
, divisez le deuxième élément de la première entrée parI
."F"
, augmentez la première entrée deReIm
(sépare la partie réelle et imaginaire de l'entrée) de la deuxième entrée.En commençant par
{{1,1},I}
, appliquer cumulativement la fonction sans nom ci-dessus, en utilisant chaque élémentList
des caractères comme deuxième entrée. Ce code produit les sorties de toutes les itérations.Débarrassez-vous des seconds éléments de chacun
List
et supprimez les doublons. (Les étapes jusqu'à ce point génèrent uneList
des coordonnées de la courbe de Hilbert)Démêlez le tableau RVB d'entrée (inverse toutes les autres lignes et s'aplatit).
Créez des
Rule
objets, de telle sorte que le premier élément de la première entrée (les coordonnées de la courbe de Hilbert) soit associé au premier élément de la deuxième entrée (l'image démêlée), le deuxième élément avec la deuxième entrée, etc.Appliquez ces remplacements
Rule
àArray
partir de la deuxième étape.Convertir en tableau de valeurs RVB en un
Image
.Échantillon entrant / sortant
Contribution:
Sortie:
Contribution:
Sortie:
Fonction inverse (
266253 octets)la source
Octave 234 octets
Les noms de fichier des images d'entrée et de sortie doivent être fournis sous forme d'entrée standard. la taille du code sans entrée / sortie est de 194 octets .
Explication:
Le modèle de base des indices est le suivant:
Dans chaque itération, 4 copies du résultat de l'itération précédente effectuée et une transformation appliquée à chaque copie, puis tous les blocs concaténés pour former le résultat actuel.
nous avons donc:
Index de Hilbert triés et index des éléments triés renvoyés:
Démêlage appliqué en retournant toutes les lignes paires:
Ré-ondulation appliquée:
-S répété pour chaque canal-
permutation appliquée car en octave les données sont disposées en colonnes
Exemples d'images:
la source