Inspiré par cette question
Une autre façon de dérouler une image 2D dans une chaîne 1D consiste à utiliser une courbe de Hilbert.
Il existe de nombreuses versions de cette courbe, selon le nombre d'itérations utilisées lors du calcul. Ci-dessous, un exemple de courbes de Hilbert du premier au cinquième ordre.
La façon de calculer cette courbe est la suivante. D'abord, nous définissons la courbe de Hilbert de premier ordre comme celle représentée sur la figure (celle pour n = 1), de sorte qu'elle s'insère dans un carré 1x1. Nous faisons ensuite quatre copies de cette courbe, en les espaçant dans un carré 4x4, afin qu'elles présentent toutes la "concavité" vers le côté gauche. Nous inversons ensuite les deux courbes d'ordre 1 les plus à gauche, de sorte que la concavité du haut soit tournée vers le haut, tandis que celle du bas fait face au bas. Nous connectons enfin les coins des courbes de Hilbert adjacentes. Si vous voulez obtenir une courbe d'ordre (n + 1), il suffit de répéter le processus avec quatre courbes d'ordre n. Nous pouvons voir une visualisation du processus ici (j'ajouterai également une image détaillant le processus bientôt)
Votre tâche dans ce défi est de dérouler une matrice d'entiers le long de la courbe de Hilbert d'ordre le plus bas pour cette matrice.
Par souci de simplicité, nous aurons la courbe en partant du coin supérieur gauche de la matrice.
Vous pouvez recevoir l'entrée soit sous la forme d'une liste de liste d'entiers, où chaque sous-liste représente une ligne de la matrice.
Vous pouvez supposer que l'entrée sera une matrice carrée (n * n).
Par exemple:
Contribution:
[[ 1, 2,]
[ 3, 4 ]]
Production:
[ 1, 2, 4, 3 ]
Puisque nous utilisons la courbe de Hilbert de premier ordre illustrée sur la figure
Contribution:
[[ 1, 2, 3, 4, ]
[ 5, 6, 7, 8, ]
[ 9, 10, 11, 12, ]
[ 13, 14, 15, 16 ]]
Production:
[ 1, 5, 6, 2, 3, 4, 8, 7, 11, 12, 16, 15, 14, 10, 9, 13 ]
Utilisation de la courbe de Hilbert de second ordre
Comme d'habitude, les échappatoires standard ne sont pas autorisées.
C'est le code-golf, donc la réponse la plus courte en octets l'emporte.
la source
Réponses:
MATL ,
8685 octetsCette solution est basée sur l' entrée d'échange de fichiers de Jonas Lundgren qui utilise des nombres complexes pour générer la courbe de Hilbert. Ces nombres complexes sont ensuite convertis en valeurs d'index pour récupérer les éléments de la matrice qui tombent le long de la courbe.
Essayez-le en ligne!
Explication
la source
APL (Dyalog Unicode) , 41 octets SBCS
Économisez 30 octets (!) En consultant la sagesse de l'APL Orchard, en particulier @ngn et @ Sherlock9.
Essayez-le en ligne!
Explication comme suit:
Plus de détails sur le " scan de transposition monadique ".
Documentation Dyalog sur les protections d'erreur .
la source
Mathcad, 302 octets
Le programme Mathcad ci-dessous est basé sur le programme @ Sherlock9 Python. Il diffère en courbant les matrices rectangulaires en ignorant les parties de la courbe de Hilbert qui se trouvent en dehors des limites de la matrice. Notez que comme Mathcad a une gestion des chaînes relativement médiocre, j'ai mappé les symboles Lindenmayer à des entiers dans la fonction Hilbert.
Mathcad fonctionne via une interface 2D qui permet à l'utilisateur de placer (et de mélanger librement) des expressions mathématiques, des tracés, du texte, des entrées et des sorties. J'ai assimilé un octet à l'opération équivalente minimale du clavier utilisateur pour créer un symbole (par exemple, l'opérateur de définition (: =) est entré en tapant simplement:.
la source
Python 3,
327289275271239234 octetsC'est une solution que j'ai modifiée de ma réponse pour une autre question de courbe de Hilbert ici . Tous les conseils de golf sont appréciés.
Edit: changé la façon dont
g
est incrémentée et décrémentée. Maintenant en utilisanteval()
etstr.translate
. Ne plus utiliserl=len(s)
.Non golfé:
la source
Wolfram - 233
Basé sur la représentation en tant que système Lindenmayer :
la source
Rubis,
224221216 octetsCette réponse est basée sur ma réponse Python .
Ungolfing:
la source
CJam, 60
Essayez-le en ligne
Explication:
Je construis la fractale comme une série de directions de mouvement: 0 = droite, 1 = bas, 2 = gauche, 3 = haut.
la source