Encore une fois inspiré par une tâche de programmation 101, voici un autre défi.
Contribution:
- Un entier positif
n >= 3
. (doit être étrange)
Sortie:
n
lignes d'astérisques, où la première ligne a desn
astérisques et chaque nouvelle ligne a deux astérisques de moins que la ligne précédente. Jusqu'à frapper 1 astérisque. De là, chaque nouvelle ligne a deux astérisques de plus que la ligne précédente jusqu'à ce qu'elle revienne auxn
astérisques. Des espaces ou quelque chose comme des espaces doivent être utilisés pour aligner les astérisques afin qu'ils ressemblent vraiment à un sablier.
Règles générales:
- Les sauts de ligne sont autorisés mais ne doivent pas être utilisés.
- l'indentation est un must.
- C'est le code-golf, donc la réponse la plus courte en octets l'emporte.
- Puisque le cours est enseigné en C ++, je suis impatient de voir des solutions en C ++.
Cas de test (n = 5):
*****
***
*
***
*****
Réponses:
Charbon de bois , 6 octets
Mort simple. Tracer une poly G sur de
*
, avec une longueur latérale prise à partir d' une entrée N ombre, où les côtés vont vers le bas et vers la droite, à l' horizontale à gauche, et vers le haut et à droite:Remplissez ensuite automatiquement le plan et remplissez-le.
Essayez-le en ligne!
la source
Python 2, 57 octets
Un programme complet. Va ligne par ligne, imprimant le bon nombre d'astérisques centrés.
Une fonction récursive était plus longue (67 octets):
ou
la source
max
par unabs
, mais tout ce que j'aiabs(n-1)+1
, c'est pire, car l'addition nécessite des parenthèses'*'*-~abs(n-1)
, mais alors c'est la même longueur que'*'*max(n,2-n)
.def f(n,s=''):r=s+'*'*n+'\n';return 1/n*r or r+f(n-2,s+' ')+r
61 octets, mais c'est encore plus long. Même avec une nouvelle ligne de premier plan, ildef f(n,s='\n'):r=s+'*'*n;return 1/n*r or r+f(n-2,s+' ')+r
reste 58 octets ...center
. Je n'ai jamais su que cela existait jusqu'à présent.V , 12 octets
Essayez-le en ligne!
J'aime les défis comme celui-ci parce que je peux montrer les avantages de la nature 2D de V. Explication. Tout d'abord, nous devons créer une chaîne de n astérisques. Donc, nous faisons ceci:
En remarque, ceci est directement équivalent à
@ai*<esc>
dans vim, et le registre@a
est pré-initialisé à "arg1". Cela rend la saisie numérique beaucoup plus pratique.Ensuite, on passe du caractère à droite avec
h
. Voici la partie amusante:Maintenant techniquement, cette dernière partie est
Parce que la commande de retrait est en fait
>>
. V suppose que les commandes incomplètes s'appliquent à la ligne actuelle et remplit également implicitement le deuxièmeò
caractère pour la boucle.la source
Méta-modèles C ++, 186 octets
Avec la formule explicite de ma réponse C, les métatemplates sont en concurrence!
Ungolfed:
usage:
non compétitif
Juste pour le plaisir:
Usage:
la source
PowerShell v2 +, 54 octets
Prend l'entrée
$n
(garanti d'être un entier impair), construit deux plages avec$n..1
et2..$n
et les concatène ensemble, puis utiliseWhere-Object
pour sélectionner uniquement les impaires avec|?{$_%2}
. Ceux-ci sont introduits dans une boucle. À chaque itération, nous construisons le nombre approprié d'espaces, concaténé en chaîne avec le nombre approprié d'astérisques. Ces chaînes sont laissées sur le pipeline et sorties via desWrite-Output
insertions implicites de nouvelles lignes entre elles à la fin du programme.Exemples
la source
Python, 78 octets
Donc seulement avec indentation:
Usage:
la source
C,
114109 octetsungolfed:
Solution récursive précédente:
la source
JavaScript (ES6), 66 octets
L'idée ici est de générer chaque sablier à partir du précédent: ajoutez un espace au début de chaque ligne, et ajoutez à la fois des
n
astérisques et des préfixes .la source
05AB1E ,
21201917 octetsÉconomisé 2 octets grâce à carusocomputing
Essayez-le en ligne!
Explication
la source
Ir"*"×.pRû
- Je suis allé aussi loin, le visage palmé quand je me suis rendu compte à quel point j'étais loin, j'ai vu que tu avais répondu, j'allais essayer d'apprendre l'itération dans cette langue en utilisant maintenant cet exemple. Merci!;ƒ'*¹N·-×Nð×ì})û»
utilisez la nouvelle commande palindromize. -2 octets.ÅÉ
et ne.c
sont probablement pas encore disponible au moment où vous a publié ce billet. :)MATL , 12 octets
Essayez-le en ligne!
Explication
Cela utilise la fonction de plage symétrique récemment ajoutée .
la source
PHP, 95 octets
Au lieu de stocker les lignes dans un tableau, puis de tout générer, la boucle for descend jusqu'à 1, puis revient au numéro d'origine.
la source
C ++ 11, 93 octets
Légèrement non-golfé:
Usage:
la source
'\n'
par10
:)MATL , 20 octets
Essayez-le en ligne!
la source
R, 77 octets
Crée une matrice de caractères, qu'elle imprime ensuite via
cat
,fill=n
en s'assurant que les lignes s'alignent correctement. Notez que les éléments sont stockés dans une matrice colonne en premier (c'est-à-dire que les deux premiers éléments sontM[1,1]
etM[2,1]
nonM[1,2]
.)la source
Java 7,
170 165164 octetsMerci à @Hypino d'avoir économisé 5 octets.
Merci à Kevin d'avoir économisé 1 octet.
la source
s=
partirs=s+"\n"
et 2 autres octets en changeantreturn(n=--n-1)
pourreturn(n=n-2)
un total de 4 octets.String s="",c="",t="";
String s,c,t=s=c="";
return(n=n-2)>=0?s+"\n"+c+c(n,++x)+
return n-1>0?s+"\n"+c+c(n-2,++x)+
n=n-2
->n-1>0
car n doit être utilisé dans un autre argument d'une fonction.n
pourn-2
cette partie.return(n=n-2)>=0 ... n
être changé enreturn n-1>0 ... n-2
est encore plus court. PS: Vous m'avez remercié d'avoir enregistré des octets, mais vous n'avez pas changé votre code dans votre édition. ;)String c(int n,int x){String s,c=s="";int i=0;for(;i++<n;s+="*");for(i=x;i-->0;c+=" ");return n>1?s+"\n "+c+c(n-2,x+1)+"\n"+c+s:"*";}
sans let
( test idéone - 133 octets )PHP - 95 octets
Enregistré un octet en utilisant une nouvelle ligne réelle au lieu d'un
"\r"
la source
Pyth, 22 octets
Un programme qui prend l'entrée d'un entier sur STDIN et imprime le résultat.
Essayez-le en ligne
Comment ça marche
la source
C,
195191 octetsDevrait jouer au golf un peu plus petit
On peut le tester ici sur ideone
la source
C, 79 octets
Il divise la variable de compte à rebours
k
en indices de ligne et de colonne. Si l'index de colonne est 0 (dernier caractère d'une ligne), il génère un caractère de nouvelle ligne (10). Ensuite, il ajuste les indices de ligne et de colonne autour de l'astérisque central. Ensuite,abs(x) < abs(y)
c'est une condition courte pour sortir un espace.la source
Rubis,
5554 octetsla source
?**n
travaux; vous n'avez pas besoin d'espace là-bas.Java 7, 156 octets
Assez simple. Permet de suivre les lignes avec
n
, les étoiles avecj
, les espaces avecs
et la direction avecd
. Je voulais vraiment juste une réponse Java non récursive sur le tableau, mais ça ne fait pas de mal qu'elle soit aussi un peu plus courte :)Avec des sauts de ligne:
la source
APL, 19 octets
Tester:
Explication:
la source
1+
et d'utiliser un APL qui a⎕IO←0
.Haskell, 84 octets
la source
putStr
ça et vous pouvez vous en débarrasserfromEnum
comme ça .C (gcc) ,
8074 octetsMerci plafondcat pour 6 octets
Essayez-le en ligne!
la source
PowerShell ,
5450 octetsEssayez-le en ligne!
la source
PHP ,
10488 octetsEssayez-le en ligne!
Cela ne bat pas les scores les plus bas pour PHP sur ce défi, mais c'est tout simplement trop fou pour moi de le jeter.D'accord, j'ai donc joué maintenant pour que ce soit le score le plus bas (pas pour longtemps) pour PHP sur ce défi, mais cela ne change pas le fait qu'il est toujours fou.
la source
Groovy, 66 octets
Essayez-le: https://groovyconsole.appspot.com/script/5145735624392704
A expliqué:
((n..1)+(2..n))
- Palindromiser inverse à n[n,..,1,..,n]
.each{if(it%2>0){...}
- Itérer à travers des éléments impairs.println(("*"*it).center(n))
- Centrez n étoiles et imprimez chacune sur la nouvelle ligne.la source
.each
pourrait être le bloc de code{it%2&&println(("*"*it).center(n))}
.PHP, 191 octets
Courir comme
php -f golf_hourglass.php 15
L'idée derrière cela est de créer la moitié supérieure (la partie avant le single
*
), puis de répéter simplement la partie supérieure deux fois, mais la deuxième fois dans l'ordre inverse.la source
for(;$i<$a=$argv[1];$i+=2){$t=str_pad(str_pad("",$i+1,"*"),$a," ",2)."\n";$i?$s.=$t:$r=$t;}echo strrev($s)."\n".$r.$s;
for(;$i<$a=$argv[1];$i++){$t=str_pad(str_pad("",$i+1+$i%2,"*"),$a," ",2)."\n";$i%2?$s.=$t:$s=$t.$s;}echo$s;
c'est mieux\n
par une nouvelle ligne réelle pour enregistrer un octet.Pyke,
2219 octetsEssayez-le ici!
la source
C, 117 octets
Ungolfed
la source