Ceci est la version ASCII de ce défi . Le poste initial a été séparé par demande par Martin Ender
introduction
Semblable à la séquence de Fibonacci, la séquence de Padovan ( OEIS A000931 ) est une séquence de nombres qui est produite en ajoutant des termes précédents dans la séquence. Les valeurs initiales sont définies comme:
P(0) = P(1) = P(2) = 1
Les 0e, 1er et 2e termes sont tous 1. La relation de récurrence est indiquée ci-dessous:
P(n) = P(n - 2) + P(n - 3)
Ainsi, il donne la séquence suivante:
1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151, 200, 265, 351, ...
L'utilisation de ces nombres comme longueurs latérales de triangles équilatéraux produit une belle spirale lorsque vous les placez tous ensemble, un peu comme la spirale de Fibonacci:
Image reproduite avec l' aimable autorisation de Wikipedia
Tâche
Votre tâche consiste à écrire un programme qui recrée cette spirale par l'art ASCII, avec une entrée correspondant à quel terme. Puisqu'un triangle de longueur latérale 1 (1 caractère) est impossible à représenter correctement en ASCII, les longueurs latérales ont été dilatées d'un facteur 2. Ainsi, le triangle de longueur latérale 1 est en fait représenté comme suit:
/\
/__\
Ainsi, par exemple, si l'entrée était 5 (le 5ème terme), la sortie devrait être:
/\
/ \
/ \
/______\
\ /\
\ /__\
\ /\ /
\/__\/
Les 5 premiers termes étaient 1, 1, 1, 2, 2, donc le triangle avait des longueurs latérales 2, 2, 2, 4, 4 en raison de la dilatation. Un autre exemple pour l'entrée 8:
__________
/\ /\
/ \ / \
/ \ / \
/______\ / \
\ /\ / \
\ /__\/ \
\ /\ / \
\/__\/______________\
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\/
Règles
- Vous devez imprimer le résultat et l'entrée doit être un entier correspondant au numéro du terme
- Les retours à la ligne de fin et de début sont autorisés, les espaces de fin après les lignes sont également autorisés
- Votre soumission doit être en mesure de traiter au moins jusqu'au 10e trimestre (9)
- Votre soumission doit être un programme ou une fonction complète qui accepte les données et imprime le résultat
- Les rotations de la sortie sont autorisées, par multiples de 60 degrés, mais la taille des triangles doit rester la même, ainsi que la représentation
- Aller dans le sens antihoraire est également autorisé
- Les failles standard sont interdites
Vous pouvez supposer que l'entrée sera> 0 et que le format correct de l'entrée sera donné.
Notation
Il s'agit de code-golf , donc le code le plus court en octets l'emporte. Bonne année à tous!
Réponses:
Befunge,
871836798 octetsEssayez-le en ligne!
Comme c'est souvent le cas avec Befunge, l'astuce consiste à trouver un algorithme qui nous permet de rendre le motif de haut en bas, car il n'est tout simplement pas possible de le rendre en mémoire d'abord avec l'espace limité disponible.
La façon dont cela fonctionne consiste à construire d'abord une structure de données simple représentant les bords nécessaires pour dessiner la spirale. La deuxième étape analyse ensuite cette structure de haut en bas, rendant les fragments de bord requis pour chaque ligne de sortie.
En utilisant cette technique, nous pouvons prendre en charge jusqu'à n = 15 dans l'implémentation de référence avant de commencer à avoir un problème de débordement dans les cellules de mémoire 8 bits. Les interprètes avec une plus grande taille de cellule doivent pouvoir prendre en charge jusqu'à n = 25 avant de manquer de mémoire.
la source
aller, 768 octets
Ce n'est bien sûr pas optimal, mais ce n'est pas un mauvais début. Je sais que c'est probablement un peu simple pour les normes de golf, mais c'était amusant et j'espère que ça ne le dérange pas si je laisse quelques notes à moi-même.
Comment ça marche
Fondamentalement, je simule une «tortue de dessin» comme dans LOGO sur une grille de pixels ASCII, mais la tortue ne peut effectuer que ces trois commandes:
Maintenant, pour chaque triangle, je vais comme ceci, où P est 2x le nième nombre Padovan:
Le quatrième «fd» signifie que je retrace le premier côté de chaque triangle. Cela permet de revenir à un joli point de départ pour le prochain triangle. Le demi-virage à droite garantit que le prochain triangle sera dans la bonne orientation.
Pour jouer à la tortue, je stocke 5 variables d'état dans le tableau 态: position x, position y, vitesse x, vitesse y et «rune de dessin». À chaque image d'animation, x + = vitesse x, y + = vitesse y et la rune est dessinée.
Ensuite, j'ai mis en place la table 表 qui indique comment effectuer réellement le virage. Le code de tour est délicat en raison de la façon dont fonctionne l'art ASCII. Ce n'est pas un mouvement simple comme sur un affichage en pixels. La direction de la tortue, déterminée par la vitesse x et y, détermine les changements nécessaires pour que le virage soit correct.
Pour tourner, il examine la vitesse actuelle x et y et les combine en un index.
Cet index est utilisé pour rechercher un ensemble de 5 valeurs dans le tableau 表. Ces 5 valeurs du tableau 表 sont ensuite ajoutées à chacune des 5 variables de l'état 态. La tortue est ensuite efficacement retournée et prête pour le prochain «fd».
Pour rth, la moitié du virage à droite, il y a une section séparée du tableau 表. Il est compensé par 7 * 5, ou 35, entrées de la première table dans 表.
Enfin, j'ai fait un encodage simple des entiers de la table dans une chaîne ascii.
Je sais que je pourrais "économiser des octets" en supprimant le Hanzi mais comme je l'ai dit, ce n'est pas optimal et il y a plus de golf possible ... Je les supprimerai quand il n'y aura pas d'autre optimisation possible. Ces Hanzi ont en fait un sens vaguement basé sur leur signification réelle, et même si je ne connais pas le chinois, cela m'aide à penser au programme.
Pour tester le code, vous aurez besoin d'un fichier golang complet, avec cet en-tête
et ce pied de page
Merci
la source