Une courbe de Hilbert est un type de courbe de remplissage d'espace, et elle mappe essentiellement une ligne à un plan. Chaque point de la ligne correspond à un seul point du plan et chaque point du plan correspond à un seul point de la ligne. Les itérations 0 à 4 de la courbe de Hilbert sont illustrées:
Itérations de 0 à 4:
L'objectif de cette tâche: écrire du code qui dessine la quatrième itération de la courbe de Hilbert, comme défini ci-dessus. Votre code doit être complet - en d'autres termes, si vous créez une fonction pour dessiner la courbe de Hilbert, votre code doit appeler cette fonction. La sortie peut être affichée directement sur l'écran ou vous pouvez écrire la sortie dans un fichier image. La courbe peut être tournée ou inversée, mais les lignes doivent se croiser à angle droit et la sortie ne peut pas être étirée. L'art ASCII est apprécié mais ne sera pas accepté. Le code le plus court en octets gagne!
la source
Réponses:
R, 90 octets
Port R sans vergogne de l'algorithme utilisé dans le lien publié par @Luis Mendo.
Car
n=5
nous obtenons:la source
MATL ,
3938 octetsCela prend le nombre d'itérations en entrée. Si vous souhaitez le coder en dur, remplacez-le
i
par le numéro.Le programme est un portage du code Matlab de Jonas Lundgren montré ici .
Le résultat est illustré ci-dessous. Vous pouvez également l'essayer sur MATL Online! Il faut quelques secondes pour produire la sortie. Ce compilateur est expérimental; vous devrez peut-être actualiser la page et appuyer à nouveau sur "Exécuter" si cela ne fonctionne pas initialement.
Explication
la source
MATLAB,
264262161 octetsCela fonctionne toujours de la même façon, sauf que nous calculons essentiellement la "dérivée" de la courbe de hilbert, que nous "intégrons" ensuite via `cumsum '. Cela réduit la taille du code par un tas d'octets.
Ancienne version
Il s'agit simplement d'une approche récursive simple. J'ai utilisé des nombres complexes pour stocker des informations vectorielles pour plus de simplicité. Vous pouvez modifier la courbe de la pièce
h(0,1,1+i,4)
. Le premier argumentp=0
est la position initiale, le deuxième argumentf
est un indicateur pour l'orientation (+1
ou-1
), le troisième argumentd
est la direction / rotation dans laquelle la courbe doit être tracée et le quatrièmel
est la profondeur de récursivité.Voici à quoi cela ressemble dans les anciennes versions:
Voici à quoi cela ressemble en 2015b:
->la source
cumsum
idée qui est tout simplement géniale!MATLAB / Octave, 202 octets
J'ai remarqué la la version @LuisMendo liées
est- était beaucoup plus courte que les précédentes solution « fait main » mais utilise une approche tout à fait différente. Je poste une version golfée ici maintenant en tant que CW:Cette version est basée sur l'approche système Lindenmayer:
la source
JavaScript (ES6),
266...233232 octetsUn rendu SVG de la courbe de Hilbert.
1 octet enregistré grâce à Neil
la source
fill=none
Python 3,
177175171 octetsUne implémentation simple du système Lindenmayer pour la courbe de Hilbert. Suggestions de golf bienvenues!
Edit: -2 octets grâce à Kade. -3 octets issus de la restructuration de la construction de la courbe de Hilbert. -1 octet avec merci à ETHproductions.
Ungolfing
la source
t
peut sauver deux octets:t+=[[c,"+AF-BFB-FA+"][c=="B"],"-BF+AFA+FB-"][c=="A"]
. Puisque le motif est presque le même pour les deux, je me demande s'il y a un moyen de l'utiliser ..if c>"E":
pourif"E"<c:
enregistrer un octet?MSWLogo (version 6.5b), 136 octets
Basé sur le programme final de courbe de Hilbert ici .
Une fonction
h
est définie, qui prend le nombre d'itérations:n
(basé sur 1), l'angle:a
, la longueur:l
. Il est récursif, appelant une itération inférieure de lui-même avec l'angle:a
annulé dans deux cas pour obtenir l'orientation correcte.rt :a
,lt :a
tournez la tortue (triangle truc dont le chemin est tracé) à droite, à gauche par:a
degrés.fd :l
fait avancer la tortue par:l
étapes.Enfin, la fonction est appelée:
h 5 90 9
. La tortue peut être caché pour un supplément de 2 octets,ht
.la source
ht
.Mathematica 128 octets
Remplacez les 4 ci-dessus par un nombre différent d'itérations si vous le souhaitez.
Fait en tant que système Lindenmayer avec des séquences entières plutôt que des séquences de chaînes, la deuxième règle de production n'est donc que le négatif de la première règle. Cette version fait 151 octets.
Le port du code MATLAB de Jonas Lundgren n'est que de 128 octets.
Je vois que dans une future version de Mathematica, cela peut devenir très court, quelque chose comme:
http://mathworld.wolfram.com/HilbertCurve.html
la source
LindenMASM , 63 octets
Une autre question avec une réponse LindenMASM? Impressionnant!
Encore une fois, en raison de quelques bugs de dessin avec Python
turtle
, parfois lorsque vous exécutez cela, le dessin entier n'est pas là. Cependant, vous pouvez voir que cela fonctionne réellement:la source