Étant donné un seul entier impair positif en entrée, renvoyez un zigzag convergent sous forme de liste de chaînes, liste de listes de caractères ou chaîne séparée par des sauts de ligne, sous cette forme:
#
#
#
#
#
#
#
#
#
#
#
Vous pouvez remplacer #
par n'importe quel caractère non blanc cohérent. Les espaces de fin sur chaque ligne sont autorisés et les retours à la ligne de fin sont autorisés.
Le zig-zag commence à la colonne 1
et pour chaque ligne se déplace vers la droite d'une colonne, jusqu'à ce qu'il atteigne la colonne n
(où n
est l'entrée). Ensuite, il se déplace de gauche à 2
, puis de droite à n-1
, puis de gauche à 3
, avec les deux bornes convergeant jusqu'à ce que le zigzag se termine dans la colonne du milieu ( (n+1)/2
).
Cas de test
L'exemple ci-dessus est le cas de test pour 5
.
Voici des cas de test individuels:
3
#
#
#
#
7
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
1
#
Réponses:
C (gcc) , 89 octets
Essayez-le en ligne!
Fonctionne en analysant la séquence du nombre d'espaces comme (pour n = 7):
Et pour n = 3:
Nous pouvons voir que le nombre du milieu (
a
dans le code) va de [n-1, n / 2). Ensuite, la différence entre le premier nombre et le nombre du milieu est:Donc, si nous
b
traversons [- (2a-n), 2a-n],a-abs(b)
nous donnerons la séquence souhaitée. C'est essentiellement ce que fait le code.la source
Fusain ,
108 octetsEssayez-le en ligne! Le lien est vers la version détaillée du code. Edit: enregistré 2 octets grâce à @dzaima pour avoir souligné que je n'ai pas à utiliser
#
s.la source
Python 2 , 78 octets
Essayez-le en ligne!
la source
Gelée , 14 octets
Essayez-le en ligne!
Programme complet.
Les usages
1
.-1 merci à Jonathan Allan .
-1 merci à Jonathan Allan .
la source
’R
->Ṗ
pour un octet.”X
->1
pour un autre.Haskell , 72 octets
Essayez-le en ligne!
Nous définissons une liste infinie
r
étant la diagonale de#
s à partir du coin supérieur gauche.On définit ensuite une fonction
g
qui fait le gros du travail.g
prendra une liste et l'inversera à plusieurs reprises et supprimera son premier élément jusqu'à ce que la liste soit vide, puis concaténera le résultat de chaque action.Notre fonction principale ici est une fonction sans point. Cette fonction commence par prendre des
n
éléments de la liste infinier
, puis coupe le premier élément et appliqueg
. Enfin, nous devons ajouter un#
retour au début, c'est parce que les spécifications de la question sont un peu bizarres, je ne sais pas pourquoi la première diagonale est toujours une plus longue qu'elle ne devrait l'être, mais c'est le cas, nous devons donc ajoutez aa#
.la source
("#":).g.init.(
prendrer)
mais merci!SOGL V0.12 , 19 octets
Essayez-le ici!
la source
05AB1E , 22 octets
Essayez-le en ligne!
Utilise
8
.la source
05AB1E , 6 octets
Essayez-le en ligne!
la source
S
. Ainsi, la sortie deviendra deux fois plus longue. Je ne connaissais pas encore + et ×. Ils créent des motifs vraiment intéressants lorsque vous les combinez avec des nombresS
, mais je n'ai pas prêté assez d'attention à la sortie ..>.> Et le+
et×
sont fondamentalement intégrés pour[0,4,4,0,2,6,6,2]
et[1,5,5,1,3,7,7,3]
. Et8
sera réinitialisé à l'origine d'où vous êtes parti. Voici un peu plus d'informations.CJam , 29 octets
Essayez-le en ligne!
Utilise
8
.la source
Pyth, 23 octets
Essayez-le ici.
la source
JavaScript, 127 octets
Calcule l'objectif (
g
) à atteindre. Lorsque cet objectif est atteint, retournez-vous au prochain objectif. Utilise également une astuce pour éviter d'utiliserMath.round()
en ajoutant0.5
à chaque nombre inégal.la source
Haskell, 74 octets
Essayez-le en ligne!
Comment ça marche:
Chaque appel récursif
f
ajoute la diagonale suivante.la source
Husk , 19 octets
Essayez-le en ligne!
Explication
Cela semble un peu maladroit.
la source
Python 3 , 82 octets
Essayez-le en ligne!
la source
Rétine , 71 octets
Essayez-le en ligne! Explication: Les trois premières étapes convertissent l'entrée en la forme
:> :
où le nombre de caractères entre les:
s est le numéro d'entrée. Les deux dernières étapes font ensuite rebondir le>
(ou<
, en se déplaçant vers la gauche) entre le:
s. La quatrième étape boucle le rebond, imprimant à chaque fois les parties requises de la chaîne. Le;
empêche la chaîne d'être imprimée après la boucle.la source
05AB1E , 16 octets
Essayez-le en ligne!
Explication
la source
K (Kona), 27 octets
Produit la séquence numérique sous-jacente en inversant et en laissant tomber la tête d'un vecteur jusqu'à ce qu'elle soit vide.
la source
PHP, 65 octets
Exécuter en tant que pipe avec
-nF
ou tester en ligne .explication:
première itération:
$n
estNULL
, donc--$n
n'a aucun effet et est évaluée àNULL
-> set
$n
et$d
à l'argument pré-décrémenté1. incrémenter
$x
pour pair$d
, décrémenter pour impair$d
2. imprimer
X
, une nouvelle ligne et des$x
espacesitérations supplémentaires: décrément
$n
; quand il frappe0
, réinitialiser$n
(et$d
) à l'argument pré-décrémentéfinale: imprimez-en une de plus
X
.la source
Japt , 31 octets
Solution récursive qui renvoie un tableau de lignes.
Essayez-le en ligne! en utilisant le
-R
drapeau pour joindre la sortie aux sauts de ligne.la source
Python 2,
159145141 141136 octetsIl y a déjà eu des versions assez sympas de Python à ce problème mais je pensais que je posterais toujours mon horrible one-liner. (Mais sans point-virgule!)
Modifier: 14 octets vers le bas, en utilisant la somme au lieu de la compréhension de la double liste
Edit: Juste remarqué en python 2, vous pouvez utiliser l'entrée au lieu de raw_input. J'ai toujours utilisé ce dernier.
la source
Mathematica,
142102 bytes (independent)Cette solution a une saveur mathématique:
UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&
Cela calcule essentiellement le segment dans lequel nous nous trouvons (en inversant la fonction de nombre triangulaire), puis en se déplaçant vers la gauche ou la droite en ajoutant une puissance de -1.
Vous pouvez le tester sur le Wolfram Code Sandbox en collant le code comme
UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&@6//MatrixForm
et en appuyant sur Maj + Entrée ou Entrée du pavé numérique ou en cliquant sur Gear -> "Evaluer la cellule".Cela se trouve être de la même longueur que mon port incorrect d'origine de la solution Python 2 d' Erik (ce port donne la sortie pour une entrée plus élevée):
(Print[X];l=Range@#;Do[Do[Print[StringRepeat[" ",l[[j]]]<>"X"],{j,Length@l}];l=l[[-2;;1;;-1]],{i,#}])&
la source