Votre tâche: générer un flocon de neige Koch à la nième profondeur. Vous n'avez pas besoin de faire un flocon de neige Koch complet, juste un côté du triangle de départ. Wikipédia sur les flocons de Koch: https://en.wikipedia.org/wiki/Koch_snowflake .
Règles:
- Le programme doit générer un côté du flocon de neige de Koch à la nième profondeur.
- La sortie doit être ASCII.
- Vous pouvez générer le flocon de neige entier; ce n'est pas obligatoire.
- Des règles standard pour les entrées / sorties et les échappatoires et autres s'appliquent.
- L'espace n'a pas d'importance, tant que tous les personnages sont au bon endroit les uns par rapport aux autres.
- Le code le plus court gagne!
Cas de test:
n = 0:
__
n = 1:
__/\__
n = 2:
__/\__
\ /
__/\__/ \__/\__
n = 3:
__/\__
\ /
__/\__/ \__/\__
\ /
/_ _\
\ /
__/\__ __/ \__ __/\__
\ / \ / \ /
__/\__/ \__/\__/ \__/\__/ \__/\__
J'espère que cela a du sens. Notez que dans chaque cas de test, la fractale peut être divisée en trois parties de longueur égale. Notez également que la largeur de chaque flocon de neige est trois fois la largeur de la génération précédente du flocon de neige.
__/\__
avec deux soulignements, ce qui rend chaque itération 3 fois plus grande que la précédente. L'utilisation d'un seul soulignement semble donner des contradictions qui commencent à devenir vraiment gênantes dans n = 3. Par exemple, les parties extérieures ont une largeur 12 tandis que la partie médiane n'a qu'une largeur 10, en raison de la/_
et_\
qui sont trop à l'étroit. Et même avant cela, vous avez_
deux fois la largeur de/
et\
./_
et_\
sont la seule partie vraiment fatale - les soulignements doivent disparaître, car ils doivent être dans la même position que le/
et\
. Une fois cela fait, les choses peuvent s'étendre de 3 fois à partir de n = 1 (mais n = 0 ne correspond pas.)Réponses:
Haskell ,
308300299 octetsModifications:
zipWith(+)
dezipWith(-)
et réglage encodages et des compensations se sont débarrassés de tout signe de négation.#
utilisantr=reverse
au lieu d'une correspondance directe de modèle.zipWith(-)
.o=[0,0]
pour raccourcir les constantes de liste.?
.Essayez-le en ligne! (Malheureusement, tout ce qui est supérieur à n = 3 est horriblement enveloppé et illisible, mais vous pouvez le copier dans un autre programme pour le voir.)
Variations
[6]
en[6,4,4]
, vous obtenez un flocon de neige entier. Essayez-le en ligne!,3..gcd 3x
, vous obtenez une courbe dans le style avec lequel cette question a été donnée à l'origine. Essayez-le en ligne!Comment ça fonctionne
k
est la fonction principale, elle prend unInt
n
et retourne unString
.iterate(>>=(:[1,4,1]))[6]
génère une liste infinie contenant, pour chaque n, les tours entre les lignes consécutives dans cette itération de courbe, style graphique tortue, sous forme de nombres entre0
et5
. Chaque itération est juste la précédente avec les spires1,4,1
entrelacées. La seule raison pour laquelle les sous-listes commencent au6
lieu de0
est de faire l'gcd
affaire enf
évitantf 0
.scanl1(+)
convertit les virages en directions "absolues", jusqu'à modulo 6. A0
signifie vers la droite, puis chaque nombre supérieur est de 60 degrés dans le sens antihoraire par rapport au précédent. (Eh bien, ce serait 60 degrés s'il s'agissait d'un dessin approprié plutôt que ASCII.)f
convertit une direction absolue en une liste de paires (caractères, codage de décalage) qui code les caractères à ajouter à la courbe (pour les directions horizontales, elle génère deux paires, sinon une), et comment la position relative change.#
opérateur parcourt la liste précédente de paires (caractères, codage offset), générant des paires réelles (coordonnées, caractères)._/\
représente nominalement une ligne tracée d'un coin de départ à travers une cellule rectangulaire à un coin de fin différent.[y,x]
, de haut en bas, de gauche à droite, afin qu'elles soient triées dans l'ordre où nous voulons les imprimer. Les colonnes sont basées sur 1. Les listes sont utilisées à la place des tuples pour une arithmétique vectorielle plus courte avec(&)=zipWith(-)
.[y,x]
que la cellule en haut à gauche. Cela garantit que tous les décalages d'un coin vers les cellules voisines sont non négatifs, en évitant les constantes négatives.[y1,x1,x2,y2]
où[y1,x1]
est le décalage de coordonnées du coin de départ à la cellule de caractère et[y2,x2]
est le décalage du coin de fin à la cellule de caractère. Ça signifie:3
.. ne5
sont que l'inverse des listes pour0
..2
, ce qui permet de les générer avec[id,r]<*>
.(&)=zipWith(-)
une liste de codage ou son inverse.?
, ce qui génère la finale àString
partir d'elles.x?l@(([_,w],c):r)
x
est la coordonnée x du caractère précédent affiché sur cette ligne, ou0
si au début d'une ligne;l
est la liste actuelle entière,w
est la coordonnée x du caractère suivant à ajouter,c
est le caractère etr
est la liste restante.\
et/
, il est donc trié en dernier s'il chevauche un autre caractère à la même position. Ainsi, un trait de soulignement redondant est détecté en vérifiant qu'une coordonnée x a été répétée.la source