Un Flow Snake, également connu sous le nom de courbe de Gosper , est une courbe fractale dont la taille augmente de façon exponentielle à chaque ordre / itération d'un processus simple. Voici les détails de la construction et quelques exemples pour diverses commandes:
Commandez 1 Flow Snake :
____
\__ \
__/
Ordre 2 Flow Snake :
____
____ \__ \
\__ \__/ / __
__/ ____ \ \ \
/ __ \__ \ \/
\ \ \__/ / __
\/ ____ \/ /
\__ \__/
__/
Ordre 3 Flow Snake :
____
____ \__ \
\__ \__/ / __
__/ ____ \ \ \ ____
/ __ \__ \ \/ / __ \__ \
____ \ \ \__/ / __ \/ / __/ / __
____ \__ \ \/ ____ \/ / __/ / __ \ \ \
\__ \__/ / __ \__ \__/ / __ \ \ \ \/
__/ ____ \ \ \__/ ____ \ \ \ \/ / __
/ __ \__ \ \/ ____ \__ \ \/ / __ \/ /
\ \ \__/ / __ \__ \__/ / __ \ \ \__/
\/ ____ \/ / __/ ____ \ \ \ \/ ____
\__ \__/ / __ \__ \ \/ / __ \__ \
__/ ____ \ \ \__/ / __ \/ / __/ / __
/ __ \__ \ \/ ____ \/ / __/ / __ \/ /
\/ / __/ / __ \__ \__/ / __ \/ / __/
__/ / __ \ \ \__/ ____ \ \ \__/ / __
/ __ \ \ \ \/ ____ \__ \ \/ ____ \/ /
\ \ \ \/ / __ \__ \__/ / __ \__ \__/
\/ / __ \/ / __/ ____ \ \ \__/
\ \ \__/ / __ \__ \ \/
\/ \ \ \__/ / __
\/ ____ \/ /
\__ \__/
__/
Construction
Considérez l'ordre 1 Flow Snake à construire d'un chemin contenant 7 arêtes et 8 sommets (étiqueté ci-dessous. Agrandi pour la faisabilité):
4____5____6
\ \
3\____2 7\
/
0____1/
Maintenant, pour chaque prochaine commande, il vous suffit de remplacer les bords par une version pivotée de ce modèle de commande d'origine 1. Utilisez les 3 règles suivantes pour remplacer les bords:
1 Pour un bord horizontal, remplacez-le par sa forme d'origine tel quel:
________
\ \
\____ \
/
____/
2 Pour un /
bord ( 12
dans la construction ci-dessus), remplacez-le par la version pivotée suivante:
/
/ ____
\ / /
\/ /
/
____/
3 Pour un \
bord ( 34
et 67
au - dessus), remplacez-le par la version pivotée suivante:
/
/ ____
\ \ \
\ \ \
\ /
\/
Ainsi, par exemple, l'ordre 2 avec des sommets de l'ordre 1 étiqueté ressemblera à
________
\ \
________ \____ \6
\ \ / /
\____ \5___/ / ____
/ \ \ \
4___/ ________ \ \ \7
/ \ \ \ /
/ ____ \____ \2 \/
\ \ \ / /
\ \ \3___/ / ____
\ / \ / /
\/ ________ \/ /
\ \ /
\____ \1___/
/
0___/
Maintenant, pour tout ordre supérieur, vous divisez simplement le niveau actuel en bords de longueurs 1 /
, 1 \
ou 2 _
et répétez le processus. Notez que même après le remplacement, les sommets communs entre deux arêtes consécutives coïncident toujours.
Défi
- Vous devez écrire une fonction d'un programme complet qui reçoit un seul entier
N
via l'argument STDIN / ARGV / fonction ou l'équivalent le plus proche et imprime l'ordreN
Flow Snake sur STDOUT. - L'entier d'entrée est toujours supérieur à
0
. - Il ne doit pas y avoir d'espaces de tête qui ne font pas partie du motif.
- Il ne doit y avoir aucun espace de fin ou suffisamment d'espaces de fin pour remplir le motif afin de remplir complètement le rectangle de délimitation minimum.
- Le retour à la ligne est facultatif.
Faits amusants
- Flow Snakes est un jeu de mots de Snow Flakes, auquel ce modèle ressemble pour l'ordre 2 et au-dessus
- Le Flow et les serpents jouent en fait un rôle dans le motif car le motif est composé d'un seul chemin qui coule partout.
- Si vous le remarquez attentivement, le motif d'ordre 2 (et supérieur également) comprend des rotations de motif d'ordre 1 pivotant sur le sommet commun du bord actuel et du bord précédent.
- Il existe une variante non ASCII de Flow Snakes qui peut être trouvée ici et à plusieurs autres endroits.
C'est le code-golf donc le code le plus court en octets gagne!
Classement
Le premier post de la série génère un classement.
Pour vous assurer que vos réponses s'affichent, veuillez commencer chaque réponse par un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Réponses:
CJam, 144 octets
Ajout d'une nouvelle ligne pour éviter le défilement. Essayez-le en ligne
Le programme fonctionne en plusieurs étapes:
la source
Python 2,
428411388 octetsCelui-ci était assez délicat. Les motifs ne conservent pas leurs rapports après chaque étape, ce qui signifie qu'il est très difficile de produire une image procédurale à partir de son prédécesseur. Ce que ce code fait, bien qu'il soit assez illisible après un golf mathématique intense, est en fait de tracer la ligne du début à la fin en utilisant la
D
fonction définie de manière récursive .La taille était également un problème, et j'ai fini par commencer au milieu d'un
5*3**n
carré latéral et recadrer les choses par la suite, mais si je peux penser à une meilleure façon de calculer la taille, je pourrais la changer.la source
r=[s*[" "]for i in range(s)]
->r=[[" "]*s]*s]
va raser quelques octets*
répétition des objets mutables .l
, en basculantprint'\n'.join()
vers l'impression dans une boucle for, en utilisantreturn[...][t]+x,
et en supprimant les parenthèses(t%2)
. Vous pouvez également l'utilisermin(c.find('\\')%s for c in S)
si vous modifiez le nom de la listeS
afin qu'elle n'écrase pas la valeur initiale des
.JavaScript ( ES6 ), 356
362 370C'est difficile ...
Chaque forme est stockée sous forme de chemin. Il y a 6 blocs de construction de base (3 + 3 en arrière)
0
diagonale de gauche à droite en bas (4
arrière)1
diagonale en bas de gauche à haut à droite (en5
arrière)2
horizontal gauche à droite (6
arrière)Pour chacun, il y a une étape de remplacement à appliquer lors de l'augmentation de l'ordre:
0
->0645001
(arrière4
->5441024
)1
->2116501
(arrière5
->5412556
)2
->2160224
(arrière6
->0664256
)valeurs préremplies dans le
h
tableau, même si les éléments 4..6 peuvent être obtenus à partir de 0..2 en utilisantPour obtenir la forme pour l'ordre donné, le chemin est construit dans la variable p en appliquant les substitutions à plusieurs reprises. Ensuite, la boucle principale itère sur la variable p et trace la forme à l'intérieur du tableau g [], où chaque élément est une ligne.
À partir de la position (0,0), chaque indice peut devenir négatif (indice y à des ordres élevés). J'évite que les indices y négatifs déplacent tout le tableau g chaque fois que je trouve une valeur y négative. Je me fiche que l'indice x devienne négatif, car dans JS, les indices négatifs sont autorisés, juste un peu plus difficiles à gérer.
Dans la dernière étape, j'analyse le tableau principal à l'aide de .map, mais pour chaque ligne, je dois utiliser une boucle explicite pour (;;) en utilisant la
b
variable qui contient le moins d'index x atteint (qui sera <0).dans le
console.log
la version il y a un retour à la ligne de début pratique, qui peut être facilement fait un retour à la ligne de fin en échangeant 2 lignes, comme dans la version d'extrait.Extrait pratique à tester (dans Firefox):
la source
Haskell, 265 octets
(Remarque: sur GHC avant 7.10, vous devrez ajouter
import Control.Applicative
ou remplacerabs<$>
parmap abs$
.)Exécutez en ligne sur Ideone.com
f n :: Int -> IO ()
dessine len
couloir de niveau . Le dessin est calculé dans l'ordre du bitmap plutôt que le long de la courbe, ce qui permet à l'algorithme de s'exécuter dans l'espace O (n) (c'est-à-dire logarithmique dans la taille du dessin). Près de la moitié de mes octets sont consacrés au calcul du rectangle à dessiner!la source
Perl,
334 316309Paramètre pris sur l'entrée standard. Testez- moi .
la source
Haskell,
469419390385365 octetsla fonction f :: Int-> IO () prend un entier en entrée et imprime le serpent de flux
la source
$
dans la définition dek
et remplacer(!!)a
par(a!!)
ce qui peut éliminer certaines parenthèses. En dehors de cela, vous semblez connaître beaucoup de trucs par vous-même. NiceC,
479474468427 octetsIl n'y a pas lieu de battre les gars de Perl et Haskell, je suppose, mais puisqu'il n'y a pas encore de soumission C ici:
Pour économiser de l'espace sur un appel atoi (), le nombre d'arguments transmis au programme est utilisé pour le niveau.
Le programme s'exécute en O (n ^ 3) ou pire; le chemin est d'abord calculé une fois pour trouver les coordonnées min / max, puis pour chaque paire (x, y), il est calculé une fois pour trouver le caractère à cet emplacement spécifique. Terriblement lent, mais économise sur l'administration de la mémoire.
Exemple exécuté sur http://codepad.org/ZGc648Xi
la source
X,Y,K,L,M,N,i,j,c;
place deint X,Y,K,L,M,N,i,j,c;
etmain(l)
au lieu devoid main(int l)
Python 2,
523502475473467450437 octetsPffft, m'a coûté environ 3 heures, mais c'était amusant à faire!
L'idée est de diviser la tâche en plusieurs étapes:
Voici le code sous forme non golfée:
Edit: j'ai changé la langue en python 2, pour être compatible avec ma réponse pour # 3 (et cela économise également 6 octets de plus)
la source
l.extend(x)
àl+=x
. Vous pouvez aussi probablement utiliser codegolf.stackexchange.com/questions/54/… au lieu de celui que.split()
vous utilisez (j'ai fait quelque chose de similaire dans ma réponse)extend
Pari / GP, 395
Faire une boucle sur les positions des caractères x, y et calculer le caractère à imprimer. Tentatives modérées de minimisation, marquées avec des espaces et des commentaires supprimés.
Chaque char est le premier ou le second d'une cellule hexagonale. Un emplacement de cellule est un nombre complexe z divisé en base b = 2 + w avec les chiffres 0, 1, w ^ 2, ..., w ^ 5, où w = e ^ (2pi / 6) sixième racine de l'unité. Ces chiffres sont conservés comme un 1 à 7 distinctif, puis pris de haut en bas dans une table d'états pour une rotation nette. C'est dans le style du code flowsnake d'Ed Shouten (
xytoi
) mais uniquement pour la rotation nette, sans faire des chiffres dans un index "N" le long du chemin. Les étendues sont relatives à une origine 0 au centre de la forme. Tant que la limite n'est pas un point de terminaison, ils sont au milieu d'un hexagone à 2 caractères et un seul de ces caractères est nécessaire. Mais lorsque le début et / ou la fin du serpent sont la limite X, 2 caractères sont nécessaires, qui est k = 0 début et k <3 fin. Pari a des "quads" comme sqrt (-3) intégré mais la même chose peut être faite avec des parties réelles et imaginaires séparément.la source