Parfois, quand je m'ennuie vraiment ( vraiment m'ennuie), j'aime dessiner un segment de ligne et y dessiner des points.
Tout d'abord, je dessine un segment de ligne d'une certaine taille, qui est 2 ^ N pour une certaine valeur de N. La ligne sera représentée par une série de .
caractères.
................
Ensuite, je trace un point à l'extrémité gauche. Les points seront représentés par des X
caractères.
X...............
Ensuite, je suis un schéma. En partant du dernier point tracé (que j'appellerai A), j'avance jusqu'au prochain point tracé (B) sur la ligne (en faisant le tour si nécessaire). Ensuite, je passe au prochain point tracé sur la ligne (C). Ensuite, je trace un nouveau point à mi-chemin entre ce troisième point (C) et le prochain point déjà tracé (D).
Chaque fois que vous vous enroulez autour de la ligne, le "milieu" est déterminé de manière enveloppante. Le point nouvellement tracé est toujours à droite de C.
Disons que la ligne suivante était ma ligne actuelle. Voici comment je tracerais les deux points suivants. Pour cet exemple, je vais étiqueter chaque point important avec une lettre.
X...A...X.X...X.
^
X...A...B.X...X.
^
X...A...B.C...X.
^
X...A...B.C...D.
^
X...X...X.X.A.X.
^
X...X...X.X.A.B.
^
C...X...X.X.A.B.
^
C...D...X.X.A.B.
^
X.A.X...X.X.X.X.
^
Pour revenir à l'exemple précédent, le point suivant sera tracé au milieu de la ligne.
X.......X.......
C'est peut-être un petit cas particulier: passer au point suivant vous laisse simplement là où vous avez commencé. Le seul point à mi-chemin utile est le point à mi-chemin «cyclique» (le point à mi-chemin sur la ligne), par opposition au tracé d'un point au-dessus de lui-même.
Ci-dessous se trouve la série de points que je tracerais sur la ligne d'ici à la fin.
X.......X.......
X.......X...X...
X.......X.X.X...
X...X...X.X.X...
X...X...X.XXX...
X.X.X...X.XXX...
X.X.X...XXXXX...
Il n'y a plus de place pour tracer le point suivant, car il devrait être coincé entre deux points adjacents, j'ai donc atteint la profondeur maximale pour la valeur donnée de N = 4. La dernière ligne de la liste ci-dessus est "complète" . "
Le défi
Le but est d'écrire le programme le plus court / la fonction nommée qui imprimera / retournera la ligne complétée pour une valeur donnée de N. Ce qui précède montre N = 4.
Contribution
L'entrée sera un seul entier non négatif N. La longueur de la ligne générée sera alors de 2 ^ N.
Production
La sortie sera la ligne complète de longueur 2 ^ N, formée par les caractères .
et X
. Une nouvelle ligne de fin n'a pas d'importance.
Exemple d'E / S
0
X
1
XX
2
X.XX
3
X.X.XXX.
4
X.X.X...XXXXX...
5
X.X.X...X...X...X.XXX.XXX.......
(c%b+b)%b
? Vous attendez-vousc
à être négatif?c=0
etd=0
peut être raccourci en justec
etd
.int
les types définis au niveau de la classe sont automatiquement initialisés à 0.Haskell, 182 octets
Utilisation:
f 5
. Sortie:X.X.X...X...X...X.XXX.XXX.......
.Malheureusement, Haskell n'a pas de fonction de fusion dans les bibliothèques standard, je dois donc fournir la mienne (->
%
). Heureusement, je ne dois fusionner que des listes infinies, donc je n'ai pas à couvrir les cas de base, c'est-à-dire les listes vides. Il en coûte encore 40 octets.Comment ça marche: au lieu de mettre les
X
s directement dans un tableau, je garde une liste des positions où ils se trouvent. De plus je ne fais pas le tour2^N
mais continue d'augmenter les positions vers l'infini (par exemple pour N = 2 avec unX
à l'avant, la liste des positions ressemble[0,4,8,12,16,20,…]
). Je prends les 3e et 4e éléments (c
etd
), calcule la nouvelle position(c+d)/2
, la conserve pour la liste de sortie, fusionne l'ancienne liste de positions de la position 4 (lad
) avec une nouvelle commençant par(c+d)/2
et récidivant. Je m'arrête à(c+d)/2
égalitéc
. Enfin, j'ajoute un0
à la liste de sortie et j'imprime desX
s aux positions données et.
ailleurs.la source
Mathematica,
110102112108la source