Inspiré par le carrelage domino de Fibonacci , ce problème concerne la génération de l'art ASCII représentant une autre séquence combinatoire célèbre.
Un diagramme de montagne en n étapes est un dessin d'une chaîne de montagnes, utilisant exactement n '/' et n '\' caractères, de sorte que les caractères dessinent une courbe continue qui ne plonge jamais en dessous de son "altitude" initiale. Par exemple,
/\/\
/\/ \
et
/\
/\/ \/\
sont tous deux des diagrammes de montagne en 4 étapes, mais
/\ /\/\
\/
n'est pas.
Contribution
Le programme doit accepter un entier n de stdin ou comme paramètre d'une fonction.
Production
Imprimez tous les diagrammes de montagne à n étapes sur la sortie standard. Les diagrammes peuvent être dans n'importe quel ordre, mais doivent être séparés par une sorte d'espace blanc. Vous pouvez décider si différents diagrammes seront générés horizontalement, verticalement, etc.
Comme pour le problème de carrelage domino, vous pouvez utiliser les espaces que vous souhaitez. Cela inclut les retours à la ligne supplémentaires avant ou après la sortie imprimée.
Exemple
Quelques exemples de sorties valides pour n = 3:
Sortie valide A:
/\
/\ /\ / \ /\/\
/\/\/\ / \/\ /\/ \ / \ / \
Sortie valide B:
/\
/\/ \
/\/\
/ \
/\/\/\
/\
/ \
/ \
/\
/ \/\
Sortie valide C:
/\
/ \ /\
/ \ /\/ \
/\/\
/\ / \
/ \/\ /\/\/\
C'est le golf de code; le programme le plus court (en octets) gagne.
la source
Réponses:
Python 2: 151 caractères
Wow, c'est un gâchis.
La première idée est d'utiliser les nombres
0 to 2**N-1
pour encoder toutes les séquences deN
mouvements ascendants et descendants dans leurs bits. Nous lisons ces bits un par un en les répétant%2
et en les répétant/2
enexec
boucle.Nous stockons la chaîne de montagnes en cours d'exécution dans une liste de chaînes transposée
L
. À chaque fois, nous générons une nouvelle ligne d'espaces et remplaçons une case de la nouvelle ligne par/
ou\
selon qu'un mouvement vers le haut ou vers le bas s'est produit.L'index de cet espace est les
c
espaces de la fin, oùc
est la hauteur de course. Le faire de face mettrait les montagnes à l'envers. Nous le déplaçonsb
alignant les mouvements vers le haut et vers le bas, en obtenant[b-c]
. Commencerc
à 1 plutôt qu'à 0 corrige une erreur de coupure.Pour éliminer les cas où les
c
baisses en dessous de la valeur de départ1
, lorsque cela se produit, nous nous mettonsi
à0
, ce qui provoque tous les mouvements ultérieurs vers le bas, ce quic
devient plus négatif. Ensuite, lorsque nous vérifions s'ilc
s'est terminé à1
, nous vérifions également s'il estc
jamais tombé en dessous. Nous seulementprint
la chaîne de montagnes sic
est1
.Pour imprimer, nous faisons
zip(*L)
transposons la plage de la verticale à l'horizontale et imprimons chaque chaîne jointe. Beaucoup de problèmes dans cette réponse sont dus au fait que Python traite les chaînes comme immuables, nous avons donc travaillé avec elles comme des listes de caractères et les avons jointes uniquement en chaînes pour l'impression.Merci à @flornquake pour son aide et ses améliorations.
la source
' '
place de" "
si vous voulez boucler en utilisantexec
. :) Btw, vous n'avez pas besoin d'échapper à la barre oblique inverse.' '
et essayé de remplacer la chaîne par des guillemets avec une variable pour elle. Cela donnait toujours un indice hors de portée:for _ in[0]*N:exec("b=i%2;c+=2*b-1;L+=[[" "]*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
exec("b=i%2;c+=2*b-1;L+=[[' ']*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
, c'est-à-dire que les guillemets intérieurs doivent être différents des guillemets extérieurs.APL (88)
Sortie pour
n=3
:Explication:
(N/2)⊤⍳2*N←2×⍵
: obtenir un champ de bits pour chaque nombre de0
à2^⍵
.Z←↓⍉¯1+2×
: multipliez par 2 et soustrayez 1, en donnant1
pour haut et-1
pour bas. Stockez un vecteur de vecteurs, chaque vecteur contenant la représentation pour un nombre, dansZ
.{
...}¨Z
: pour chaque élément deZ
:∧/0≤+\⍵
: vérifiez que la somme cumulée ne descend jamais0
(ne descend pas en dessous du niveau du sol),(0=+/⍵)
: et que la somme totale est0
(se retrouve au niveau du sol).{
...}¨Z/⍨
: sélectionnez ces éléments dansZ
pour lesquels cela est vrai. Pour chacun d'eux:K←(⍵≠1)++\⍵
: recherchez la hauteur de chaque personnage et enregistrez-laK
. Soulevez chacun\
vers le haut, afin qu'ils s'alignent/
correctement avec le s. Cela rend la hauteur du sol1
.¯1+2×K=⊂⌽⍳⌈/K
: pour chaque colonne, faites une liste[1..max(K)]
et marquez la position du caractère dans cette colonne avec1
et le reste comme-1
. (La réplication par -1 remplit cette position avec un espace.)'\/'[1+⍵=1]/⍨¨
: recherchez le caractère correct pour chaque colonne et répliquez-le par la liste de cette colonne.⍉↑
: transformez le résultat en matrice et mettez-le à l'endroitla source
Python,
261241236 caractèresCela commence à prendre un certain
n=5
temps ...la source
JavaScript (ES6) 159
163Tout comme ma réponse pour Fibonacci Domino Tiling, j'examine toutes les séquences de n + n bits, avec 1 marquant un '/' et 0 marquant un '\' (juste pour la sortie, '2' est ajouté plus tard pour marquer une nouvelle ligne) . Lors de la construction du modèle ascii, je vérifie l'équilibre - mêmes nombres de 0 et 1, et ne descendant jamais en dessous de la ligne de base de départ - et affiche ce qui obéit aux règles.
Sortie effectuée avec 'alert', qui est standard pour JS codegolf mais assez ennuyeux, et peut-être contraire aux règles. En utilisant console.log, le nombre de caractères passe à 165.
Moins golfé
Testez dans la console FireFox / FireBug.
Production
la source
-b-b
et-n-n
au lieu de-2*b
?2*b+1
->b-~b
)CJam, 84 octets
Notez que ce programme imprime les montagnes dans une boucle infinie afin que l'interprète en ligne ne vous aide pas; invoquer sur la ligne de commande en utilisant
ou pour essayer une utilisation en ligne
et appuyez simplement sur le bouton d'exécution plusieurs fois de suite et imaginez que la sortie est concaténée.
L'idée de base est que nous savons qu'une chaîne de montagnes de taille Q a Q de chaque transition vers le haut et vers le bas.
Ensuite, si elle est valide, nous l'imprimons, sinon nous la sortons de la pile pour qu'elle ne déborde pas.
Le routage d'impression construit essentiellement chaque colonne comme des espaces de hauteur Q, puis le symbole, puis suffisamment d'espaces pour atteindre Q + 1 au total, puis nous transposons et imprimons les lignes avec des retours à la ligne entre elles.
la source
C, 179
excluant les espaces inutiles.
Une stratégie similaire à edc65. Je passe en
n*2
revue toutes les valeurs binaires -bit, en considérant/
= 1 et\
= 0.Je
n
formate une chaîne unique contenant des sauts de ligne tous lesn*3
caractères. Comme écrit, la chaîne contient 1 000 caractères, donc il y a généralement beaucoup d'espaces imprimés après la montagne. (Cela peut être corrigé en ajoutants[n*n*3]=0
avant leputs
.) Quoi qu'il en soit, cela me permet de sortir la montagne entière avec un seulputs
après avoir vérifié qu'elle est conforme aux règles.J'essaierai de le convertir en fonction et de le réduire à une seule
for
boucle plus tard.Sortie (notez la quantité massive d'espaces à droite)
la source
Haskell, 140 octets
Après plusieurs tentatives infructueuses, je me suis retrouvé avec cette implémentation Haskell. Je suis content d'être juste dans un facteur 2 de la solution APL!
Solution golfée:
Non golfé et commenté:
Le programme construit récursivement l'ensemble des diagrammes de montagne à n étapes. Chaque diagramme est représenté par une liste de chaînes infiniment longues, représentant la montagne tracée latéralement, suivie d'espaces s'étendant à l'infini. Cela garantit que tous les diagrammes ont la même hauteur, ce qui facilite la récursivité. L'imprimante de montagne accepte un paramètre qui coupe la hauteur à une valeur finie.
Exemple d'utilisation:
la source
GolfScript 103 ( démo )
Le programme prend un paramètre entier essaye de rendre en montagnes toutes les représentations binaires des nombres de 0 à 2 ^ (n-1). Il ne rend pas les combinaisons invalides (ex: celles qui vont en dessous du niveau 0).
la source