Votre tâche: étant donné un entier n
, générez un motif hexagonal incorporé en suivant les règles ci-dessous, jusqu'à la nième profondeur.
Un hexagone intégré a la forme de base de ceci: ( n=0
)
__
/ \
\__/
Hexagones intégrés n=1
et n=2
:
____
/ \ \
/\__/ \
\ /
\____/
________
/ \ \ \
/\__/ \ \
/\ / \
/ \____/ \
\ /
\ /
\ /
\________/
La longueur de chaque côté est 2 fois la longueur du même côté dans la profondeur précédente multipliée par deux. Les côtés supérieur et inférieur sont de 2 caractères lorsque n=0
et le reste commence par 1 caractère. Les longueurs des côtés non supérieur-inférieur doivent être 2^n
longues ( OEIS: A000079 ) et les côtés supérieur et inférieur doivent suivre la règle 2^(n+1)
(même OEIS).
Les hexagones actuels sont indexés 0, vous pouvez choisir d'utiliser un index 1 si vous le souhaitez.
Il s'agit de code-golf , donc la réponse la plus courte l'emporte!
la source
n
?Réponses:
Fusain ,
4029 octets11 octets économisés grâce à @Neil en changeant la boucle while en une boucle for parmi d'autres astuces
Essayez-le en ligne!
Explication (obsolète)
Ce programme commence par générer le plus grand hexagone, puis fait les plus petits un par un dans une boucle while (indexé 1). Pour référence,
α
est le numéro d'entrée,β
est la variable qui contient2^(α-1)
etι
est la variable d'itération dans la boucle.la source
×_X²ι
c'était la même chose que×__β
, et quelques octets supplémentaires en convertissant votreW
en unF
, ce qui évite également d'avoir à stocker le numéro d'entrée. Essayez-le en ligne! .Haskell ,
230217207 octetsÉDITER:
#
pouvait être justemax
.zipWith
etp
pourrait être fusionné en un?
opérateur, et que j'avais (en quelque sorte!) Réimplémentéreplicate
.m
prend unInteger
et retourne unString
.Essayez-le en ligne!
Comment ça fonctionne
m
est la fonction principale. Il utilise&
pour générer les hexagones avec un rembourrage approprié, puis les plie aveco
.l&t
génère un petit hexagone de longueur latéralet
, rembourré à l'intérieur d'un grand de longueur latéralel
, sous forme de liste deString
lignes.a
est la ligne supérieure de l'hexagone, avec les traits de soulignement.b
est une liste des autres lignes dans la moitié supérieure de l'hexagone. Les lignes deb
sont centrées dans le rembourrage, qui est rectangulaire; cela permet à la prochaine étape de fonctionner.a
superposé au - dessus deb
ào
, alors inversée ( à la fois l' ordre de lignes et dans chaque ligne).c
prend deux arguments, une liste de longueurs et une chaîne, et génère une chaîne qui a autant de copies de chaque caractère dans l'original que la longueur correspondante, par exemplec[1,3,2]"abc" == "abbbcc"
. Il est utilisé&
pour générer les lignes.o
prend deux arguments représentant des images sous forme de listes de lignes et superpose le premier, le plus petit au-dessus du second.?
deux fois pour remplir la première image avec une infinité d'espaces vers le bas et vers la droite, puis en zippant les caractères correspondants avecmax
, qui sélectionne le caractère non-espace s'il y en a un.(f?e)l m
remplit une listel
en ajoutant une infinité d'éléments «e», puis zippe la liste résultante et la listem
avec laf
fonction.la source
(#)
possiblemax
.p
économiser des octets:o=max?' '?"";f?e=z f.(++repeat e)
. Pourrait être plus court sans point.(\n->(<$[1..n]))
estreplicate
.replicate
? Maintenant, c'est juste gênant. Je suis juste trop habitué<$[1..n]
ou[1..n]>>
presque toujours gagnant. Cependant, je ne vois pas comment raccourcir?
davantage. J'ai déjà essayé de faire sansp
point et le++
est juste au mauvais endroit, faisant exploser les choses avecflip
.JavaScript (ES6), 258 octets
Explication: Pour les hexagones après le premier, l'hexagone précédent est d'abord généré et complété de chaque côté (cela dépend de la sortie qui est un rectangle). (Pour le premier titre, un remplissage factice est créé.) Les côtés supérieur et supérieur de l'hexagone sont générés et tous les espaces fusionnés avec l'hexagone précédent. (Il y a une astuce pour aligner les hexagones; ce serait plus facile si des marges supplémentaires étaient autorisées.) Les côtés inférieurs de l'hexagone sont générés de manière analogue aux côtés supérieurs, et le bas de l'hexagone est ensuite rempli. Il faut prendre soin de renvoyer une sortie rectangulaire, y compris une nouvelle ligne de fin, pour que la récursivité fonctionne.
la source
/
sont populaires dans l'art ASCII et lareplace
méthode est un moyen relativement bon marché de les générer en JavaScript.1<<n>>1
: Symétrie sympa ;-)v
mais malheureusement, ce1
n'est symétrique dans aucune de mes polices habituelles.PHP, 337 octets
0 Indexation
Essayez-le en ligne!
Étendu
la source