Je trouve cela fascinant de voir à quel point les lettres "H" et "I" sont très similaires. "H" est un trait horizontal entouré de deux traits verticaux; "I" est un trait vertical entouré de deux traits horizontaux (selon votre police). Je parie que cela pourrait être imbriqué ... Vous savez ce que cela me rappelle? Fractales !!!
Définissons la pyramide "IHIH" comme suit: La première itération est cette représentation ASCII de la lettre "I":
---
|
---
La prochaine itération a un trait vertical de chaque côté.
| |
|---|
| | |
|---|
| |
Si vous considérez le "I" au milieu comme un trait horizontal unique, cette seconde itération est fondamentalement un "H". La troisième itération ajoute un trait horizontal en haut et en bas
-------
| |
|---|
| | |
|---|
| |
-------
Encore une fois, si vous considérez le "H" au milieu comme un trait vertical unique, cette itération est fondamentalement un "I". Ce motif continue, alternant entre "H" et "I" à chaque itération. Pour référence, voici les 6 premières itérations:
1:
---
|
---
2:
| |
|---|
| | |
|---|
| |
3:
-------
| |
|---|
| | |
|---|
| |
-------
4:
| |
|-------|
| | | |
| |---| |
| | | | |
| |---| |
| | | |
|-------|
| |
5:
-----------
| |
|-------|
| | | |
| |---| |
| | | | |
| |---| |
| | | |
|-------|
| |
-----------
6:
| |
|-----------|
| | | |
| |-------| |
| | | | | |
| | |---| | |
| | | | | | |
| | |---| | |
| | | | | |
| |-------| |
| | | |
|-----------|
| |
Le défi:
Ecrivez un programme ou une fonction générant la nième itération de la pyramide IHIH et une nouvelle ligne de fin optionnelle. Votre entrée sera un entier positif unique, quel que soit le format raisonnable que vous souhaitez. Vous n'avez pas besoin de gérer des entrées non valides, par exemple des nombres non entiers, des nombres inférieurs à 1, etc. Votre programme doit au moins produire la sortie correcte pour les entrées allant jusqu'à 20. S'agissant de code-golf , les échappements standard ne sont pas autorisés. et la réponse la plus courte en octets gagne!
Réponses:
Pyth ,
50403125 octetsSuite de tests.
Explication
Ceci est un algorithme récursif.
A chaque itération, nous effectuons trois actions:
"-"
ou en"|"
fonction du nombre d'itérations.Après les itérations, les sorties impaires seront transposées. Par conséquent, nous les transposons.
la source
Python,
165145133123 octetsUne solution récursive:
Appelé avec
print ("\n".join(i(int(sys.argv[1]))))
, où le paramètre est le numéro d'itération de la pyramide IHIH.Merci à @DJMcMayhem pour la sauvegarde de 20 octets. En prenant l’idée derrière ces suggestions, nous avons encore économisé 12 octets supplémentaires. Merci à @Maltysen pour les suggestions qui ont coupé quelques octets supplémentaires.
La fonction définit le délimiteur
d
sur"|"
et les espaces intermédiaires sur" "
(pour les itérations impaires), traite le retour dans le cas dégénéré, puis réinitialise le délimiteur" "
et les espaces intermédiaires sur"-"
des itérations paires. La fonction renvoie une liste de chaînes pour chaque ligne de l'IHIH, après avoir incorporé le résultat d'un appel récursif à la fonction au bon endroit dans la liste.la source
if e<1:return'|'
(pas de nouvelle ligne entre elles), puis supprimez le "else" et supprimez l'indentation supplémentaire.return
. En outre, vous pouvez fusionner les lignes sansif
point avec des points-virgules et économiser sur l'indentation.Cheddar ,
186177165154148131 octetsUtilise la récursivité. Ajoutera une explication une fois le golf terminé.
Essayez-le en ligne!
Explication
Celui-ci est un peu complexe aussi, gardez une trace de toutes les variables que j'utilise mais je vais essayer de rester simple:
C’était pénible pour le golf mais ses 55 octets sont plus courts que l’original.
la source
Python 2, 93 octets
Fuite Nun sauvé 7 octets.
la source
int(x/2.)
parce que je prenais,range(-n,n+1)
mais maintenant je peux simplement les utiliser. Merci!Matricks ,
8062 octetsUne solution itérative (La récursion dans Matricks est difficile ...)
Courir avec
python matricks.py ihih.txt [[]] <input> --asciiprint
Explication:
la source
JavaScript (ES6),
9290 octetsLa solution récursive fonctionne en prenant l'itération précédente, en ajoutant le
v
caractère sur les côtés, puis en ajoutant lec
caractère dans les coins et leh
caractère en haut et en bas. L'ensemble de caractères alterne simplement à chaque itération. Edit: 2 octets enregistrés en retournantv
quandn=0
.la source
Dyalog APL ,
5243 octetsv h s←'|- '
attribue les trois personnages à trois noms ( v ertical, h orizontal, s rythme)⊃
le premier, à savoir|
⍪
faire en 1 × 1 table{
...}⍣⎕
avoir son mot à dire et appliquer la fonction doublée plusieurs foisv=⊃⍵:
si le caractère en haut à gauche de l'argument est une verticale, alors:h⍪⍨
horizontales ci-dessoush⍪
horizontales ci-dessuss,
espaces à gauche de⍵,s
l'argument avec des espaces à droite⋄
autre:v,⍨
verticales à droite dev,
verticales à gauche des⍪
espaces ci-dessus⍵⍪s
l'argument avec des espaces ci-dessousTryAPL en ligne!
la source
Brachylog , 84 octets
Essayez-le en ligne!
Un portage de ma réponse en Pyth .
la source
C, 110 octets
Invoquer comme
f(n)
. Pour 111 octets, je pourrais faire:c'est-à-dire que l'
#define
enregistre exactement un octet.la source
Dyalog APL, 34 octets
{
...}⍣⍵⍪'|'
Appliquer la fonction entre accolades à⍵
partir de la matrice de caractère 1x1|
. Le résultat de chaque application est l'argument de la prochaine application.s b←' -|'~⊃⍵
s est l'espace et b est la barre pas dans le coin supérieur gauche de l'argument (' -|'~'-'
supprime la barre horizontale et laisse l'espace et la barre verticale)s,⍵,⊃s b
ajouter un espace à gauche et à droite (⊃
sélections s du vecteur sb)b,b,⍨⍉
transposer et ajouter b à gauche et à droitePour les nombres impairs, le résultat est transposé, une transposition finale est donc requise.
⍉⍣⍵
Transposez⍵
fois (une fois suffirait, mais plus court pour coder de cette façon)TryAPL en ligne
la source
Cheddar , 107 octets
Essayez-le en ligne!
la source
Cheddar, 85 octets
Ma première réponse au cheddar. Essayez-le en ligne!
Si j'essaie d'écrire
r=(-n|>n).map(v->abs v).map
, et alorsr(y->r(x->…))
, l'interprète se bloque. ; -;la source
v->abs v
en(abs)
(par exempler.map((abs))
) qui retournera une fonction qui a le comportement de la fonction abs. par exemple(+)(1,2)
->3
.(^)(2,6)
-> 64. Je suis également très impressionné par ma supériorité sur le golf de près de 50%Runtime Error: `abs` has no behavior for types `Number` and `Number`
(carmap
reçoit à la fois l'élément et son index, vraisemblablement.)APL (Dyalog Classic) , 34 octets
Essayez-le en ligne!
(les usages
⎕io←1
)⍳⎕
est1 2 ... N
(⌽,0,⊢)
est un train qui le transforme en-N ... -1 0 1 ... N
∘.( )⍨
exécute les parenthèses pour chaque paire de coordonnées⍺ ⍵
le train
(≤-(1+=)×2|⌈)
ou son équivalent en dfn{(⍺≤⍵)-(1+⍺=⍵)×2|⍺⌈⍵}
produit une matrice du type:'- |'[2+ ]
rend ces index valides⎕IO=1
et choisit les caractères correspondantsla source
Ruby,
817877 octetsCeci est basé sur la réponse de Lynn en Python . Les suggestions de golf sont les bienvenues.
Edit: 3 octets grâce à Lynn. Corrections et golf 1 octet grâce à Jordan.
Ungolfing:
la source
.map(&:abs)
?*
ne fait rien. Vous pouvez utiliser*""
au lieu de.join
. De plus, l'utilisationp
entoure chaque ligne de guillemets (elle appelleinspect
ses arguments), ce qui pourrait vous disqualifier.&:abs
(map &:abs
). Vous pourrez peut-être faire quelque chose avecArray#product
lesmap
s imbriqués , mais cela rendra les sauts de ligne difficiles.r.product(r).map
(bien que cela fonctionne) est plus long et ne semble pas permettre les sauts de ligne très facilement.MATLAB,
168163 octetsCe n'est probablement pas la façon la plus intelligente de le faire: Développer une chaîne de tous les côtés par
n
étapes:Utilisation: Enregistrer sous
g.m
(dois-je l’ajouter au nombre d’octets?) Et appeler par exempleg(15)
.Ungolfed:
la source
' '
par0
(Matlab traite le caractère 0 comme un espace) et'-'
par45
. Le nom du fichier ne doit pas obligatoirement figurer dans le nombre d'octetsEn fait ,
484544 octetsCeci est une tentative de porter ma réponse Ruby à En fait. C'est trop long et les suggestions de golf sont très appréciées.Essayez-le en ligne!
Voici une version de 46 octets qui sépare les fonctions imbriquées afin que nous puissions définir
"| -"
moins d’octets. Essayez-le en ligne!Ungolfing:
Premier algorithme
Deuxième algorithme
la source
u;±ux♂A╗╜`;2@%2╛%u╛(2±&<I"| -"E`#"╝╜%r£Mεj."%£M
est plus long que ce que vous avez actuellement (de 2 octets), mais vous pourriez trouver quelques idées pour réduire le temps que je ne vois pas.Toile ,
19181714 octetsEssayez-le ici!
Si je pouvais sortir toutes les deux sorties tournées de 90 °, les 4 derniers caractères pourraient être supprimés.
Explication (certains caractères ont été modifiés pour ressembler à ~ monospace):
la source
05AB1E ,
2928 octetsEssayez-le en ligne!
-1 grâce à Dzaima ...
C'est une solution itérative.
Ceci est essentiellement réalisé en créant le motif suivant:
Ensuite, par paire, transposez chaque élément ensemble et ajoutez le rembourrage.
En transposant après chaque itération, on crée un seul coin du motif.
Ensuite, nous pouvons utiliser les commandes de réflexion de 05AB1E.
la source
Mathematica,
158164 octetsCalcule mathématiquement le symbole correct aux coordonnées (i, j), où les deux vont de -n à n. Humain formaté:
la source
PHP, 166 octets
J'ai joué au golf à plus de 100 octets de ma première approche et c'est toujours la réponse la plus longue ici.
panne
non-golfé
la source
Perl 5 , 150 octets
Essayez-le en ligne!
la source
Haskell , 110 octets
Essayez-le en ligne!
Explication / Ungolfed
La fonction d'assistance
g
prend un caractère et une liste de chaînes, puis elle ajoute et ajoute ce caractère à chaque chaîne:Suivant l'opérateur
(!)
prend une fonction (g
), un nombre (n
) et un caractère (c
). Il calcule ensuite la sortie pourn-1
, lui applique la fonctiong
et ajoute une chaîne de même largeur composée dec
s au début et à la fin:Avec ceux-ci, nous sommes prêts à générer les sorties de manière récursive. Nous devons d'abord couvrir le cas de base:
Et puis la récursion:
la source
J , 37 octets
TIO
la source
Stax , 22 octets
Exécuter et déboguer
Déballé, non golfé et commenté, cela ressemble à ceci.
Exécuter celui-ci
la source