introduction
L'année dernière, c'était mon anniversaire (vraiment!) Et malheureusement, j'ai dû organiser ma propre fête. Eh bien, maintenant vous savez, vous ne pourriez pas au moins faire le gâteau?
Défi
Avec un entier n
en entrée, écrivez un programme complet pour produire un gâteau d'anniversaire avec des n
bougies allumées.
Sortie
Un morceau de gâteau avec une bougie est:
$
|
---
~~~
---
Et un morceau de gâteau avec trois bougies est:
$ $ $
| | |
-------
~~~~~~~
-------
Je suis sûr que vous pouvez y arriver
Cependant , pour l’entrée0
, vous devez générer les éléments suivants:
Congratulations on your new baby! :D
Pour des entrées inférieures à 0
, vous devriez produire un gâteau sans bougies:
---
~~~
---
Rien n'est autorisé à sortir vers STDERR.
Les retours à la ligne et les espaces sont autorisés.
Gagnant
Le code le plus court en octets gagne.
Classement
var QUESTION_ID=57277;OVERRIDE_USER=30525;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Réponses:
Pyth,
7372716967 octetsEssayez-le en ligne .
La sortie pour n <0 contient 2 nouvelles lignes principales, comme autorisé dans les commentaires . Pour vous en débarrasser, utilisez
la source
CJam,
7675 octetsEssayez-le en ligne dans l' interprète CJam .
Comment ça fonctionne
la source
Ruby, 120 octets
Révision 1 (120 octets)
18 octets économisés grâce à manatwork
Révision 0 (138 octets)
Pour les nombres positifs: ceci itère à travers une chaîne correspondant à chaque ligne du gâteau. Celles-ci sont utilisées comme chaînes de pad pour justifier à droite la chaîne vide de longueur 2 * n + 1. Cela évite toute complication liée à l'impression d'un nombre impair de caractères, lorsque la répétition naturelle est égale à la hauteur des bougies (c'est-à-dire 2 caractères.)
n>0&&
Est nécessaire pour éviter de générer une seule colonne en cas de saisie de zéro.Pour tous les nombres: "
n<=>0
" trouve le signe de l'entrée. Le message bébé est sorti pour n = 0 et une chaîne vide pour n positif (comme la sortie correcte a déjà été donnée ci-dessus.) Pour n négatif, Ruby interprète -1 comme signifiant le dernier élément du tableau et sort le sans chandelle. gâteau.la source
puts
?n=gets.to_i puts ['Congratulations on your new baby! :D',%w{\ $ \ | - ~ -}.map{|e|''.rjust 2*n+1,e},'--- ~~~ ---'][n<=>0]
''.rjust
→e.ljust
.e.just
: très intelligent.R, 157
la source
R,
228226220221 octetsDernière édition pour corriger le gâteau sans bougies, était aussi large que le positif sur les cas négatifs, merci @CathG et @jbaums pour les commentaires
la source
<-
peuvent être=
, et vous pouvez utilisera=b='-~-'
.Error: unexpected '}'
JavaScript ES6, 136
Utilisation de alert pour la sortie - police proportionnelle incorrecte et le résultat est moche. Dans l'extrait ci-dessous, l'alerte est redirigée vers le corps coupé, ce qui donne un meilleur résultat.
La nouvelle ligne à l'intérieur des backticks est significative et comptée.
Testez l'exécution de l'extrait de code dans Firefox.
Moins golfé
la source
$('div pre code')[2].innerHTML
;)R, 279 octets
Version interactive (286 octets):
Version non interactive (279 octets):
la source
MATLAB / Octave,
194198195189171 171167 octetsBon anniversaire à toi Beta Decay! :)
Merci à HamtaroWarrior d'avoir réduit de 4 octets!
Exemples de parcours
Je l'ai placé dans un fichier de script appelé
happy_birthday.m
, puis je l'ai exécuté plusieurs fois à l'invite de commande. Notez que lorsque vous entrez un nombre négatif, il y a deux principaux retours chariot, mais cela est autorisé dans ce défi:Code avec espacement et explications
La partie d'affichage à la fin est probablement la partie la plus obscure du code. Cela va afficher une matrice de caractères de 5 lignes où les deux premières lignes sont constituées des bougies et les trois dernières lignes sont constituées de la base du gâteau.
La base de la moitié supérieure de l'affichage est soit deux espaces dans une colonne suivis de deux autres espaces dans une autre colonne dans le cas où l'âge est négatif, soit un
$,-
dans une colonne suivie de deux espaces dans une autre colonne. C'est une matrice de 2 x 2 caractères. La base de la moitié inférieure de l'affichage est un vecteur à colonne unique-,~,-
qui est une matrice de 3 x 1 caractères.La commande d’affichage s’adresse d’abord aux deux premières lignes du gâteau en plaçant deux espaces dans la première colonne, suivis des paires d’une colonne
$,-
ou d’une colonne d’espaces si ellen
est négative, qui devient ainsin=1
, et une autre colonne de deux espaces répétée total den
fois. Les trois lignes suivantes répliquent simplement le-,$,-
vecteur de colonne pour2*n + 1
aligner les bougies avec la base, complétant ainsi l’image.Essayez-le en ligne!
Vous pouvez essayer ceci en ligne en utilisant le compilateur Octave d'IDEOne: http://ideone.com/4qXDdJ . Cependant, il existe un léger bogue lors de la lecture de valeurs à partir d'une entrée standard. En tant que tel, le script est légèrement modifié car vous devez modifier la valeur de
n
début du code. Créez une nouvelle version du script et remplacez-la par la valeur entière qui vous convient afin de voir à quoi ressemble le résultat.la source
' '.'
!JavaScript,
143153 octetsfor(v in k=' $ 0 | 0---0~~~0---'.split(+!(n=+prompt(c=''))))c+=k[v].repeat(n<0?1:n)+'\n';alert(n>0?c:n?c.slice(8):'Congratulations on your new baby! :D')
Pour voir la sortie en mono-espace, remplacez 'alert' par 'console.log'
la source
Moonscript, 141 octets
la source
rs , 117 octets
Démo en direct et cas de test.
la source
JavaScript ES6, 154 caractères
Et un de plus (154 aussi)
Pour afficher la sortie en police monospace (et déplacer la sortie vers la console), utilisez
la source
Souris ,
164161 octetsLa souris n’est clairement pas un choix idéal pour cette tâche, mais c’était amusant.
Ungolfed:
La pile ne peut contenir que des entiers.
!'
prend un entier de la pile et affiche le caractère ASCII avec ce code.la source
CoffeeScript, 160 octets
Ungolfed:
Utilisez-le comme:
Essayez-le en ligne: link (contient du code d’affichage personnalisé, pour que tout soit si beau ...)
Oups, j'ai presque oublié! Joyeux anniversaire, @BetaDecay!
la source
C, 392 octets
(faute de segmentation connue si aucun argument n'est donné)
Non minée et copieusement espacée
la source
A
. Je vois quelques espaces supplémentaires qui pourraient être supprimés, et vous pouvez vous en débarrasseri
en utilisantc
plutôt la variable loop. De plus, au moins avec gcc, inclure stdio.h ou spécifier le type de retour de main () n'est pas nécessaire: le compilateur s'en plaint, mais bon, c'est du code golf. ;)Powershell,
139134132126 octetsla source
$input
place de$args[0]
(la question ne dit pas d'utiliser des arguments à la place de stdin), et vous pouvez utiliser unary+
pour convertir un nombre:$n=+$input;
$args[0]
peut et doit être un réel int, nous permettant au moins de laisser tomber le fichier[int]
.if
et en remplaçant lelse
';exit
- 122 octets -if($n=$args[0]){$d=3;if($n-gt0){' $'*$n;' |'*$n;$d=$n*2+1}'-'*$d;'~'*$d;'-'*$d;exit}'Congratulations on your new baby! :D'
Ceylan,
322307260 octets300282278L'original non encore golfé (en supposant que les gâteaux négatifs aient une largeur de 3 au lieu de –2 · n + 1):
Cela comprend la liste de conditions dans l'instruction if, chaque condition définissant une valeur utilisable dans les conditions suivantes et dans le corps. Parce qu'ils ont le
exist
, la condition n'est remplie que lorsque les valeurs ne sont pas nulles et le compilateur sait donc que les valeurs ne sont pas nulles pour le code suivant. (Si rien n'est entré (EOF), readline renvoie null. Si parseInteger frappe un non-entier, il renvoie également null. Notre programme ne fait rien alors. Le comportement de ces cas n'étant pas défini, je suppose que c'est correct.)Nous avons également l'
<=>
opérateur, qui mappe à laComparable.compare
méthode et retourne unComparison
objet, c'est-à-dire l'un desequal
,smaller
etlarger
. Le compilateur sait que ceux-ci épuisent leComparison
type, aucuneelse
clause n’est donc nécessaire dans notreswitch
déclaration.La
repeat
méthode de la classe String fait ce à quoi on pourrait s’attendre. En fait, il est hérité de la méthode du même nom dans l'interface Iterable (comme une chaîne est, à côté d'autres choses, juste une liste de caractères).Remplacer mes identifiants par des lettres d'une lettre et supprimer les espaces inutiles donnent 322 caractères:
Remplacer la série de
print
par\n
s explicite (et un seulprint
) la ramène à 307:J'ai essayé d'alias-importing de
repeat
asr
, mais ça n'aide pas (la déclaration d'importation ajoute 40 caractères, et nous ne pouvons en économiser que 25 en les remplaçantrepeat
parr
).Ce qui aide légèrement, utilise
n.sign
au lieu den<=>0
. Bien que ces deux expressions ont la même longueur textuelle, ils ont différents types: celui - ci un est de typeComparison
mentionné précédemment (qui a les trois valeurssmaller
,larger
etequal
), l'ancien a le typeInteger
, les valeurs-1
,1
,0
... et parce queInteger
a beaucoup plus de valeurs, nous avons également besoin d'uneelse
clause. Cela fait 300 caractères:Ici avec des espaces:
Nous pouvons en sécuriser davantage en résiliant notre instruction switch et en utilisant
if
282 caractères (= octets):Formaté:
Nous pouvons sécuriser un autre octet en permutant les cas, car
>
est plus court que==
. Une autre "gêne" est la répétitionrepeat(n)
- nous pouvons définir une fonction locale (une fermeture, elle se souvientn
du bloc de définition) avec un nom plus court:C'est une façon plus courte d'écrire ceci:
Nous pourrions utiliser
function
le type de retour à la place du type de retour, mais ce n'est pas plus court. Cela nous donne 278 octets:Formaté:
En fait, utiliser les opérateurs
then
etelse
au lieu desif
déclarations nous permet de sauvegarder certains appels deprint
(et de certaines accolades):C'est juste 261 octets:
shared void run(){if(exists t=process.readLine(),exists n=parseInteger(t)){String r(String s)=>s.repeat(n);print(n>0thenr(" $")+"\n"+r(" |")+"\n"+r("--")+"-\n"+r("~~")+"~\n"+r("--")+"-"else(n<0then"---\n~~~\n---"else"Congratulations on your new baby! :D"));}}
(J'ai utilisé à la
run
place deb
pour le nom de la fonction car cela permet de l'exécuterceylon run
sans passer un nom de fonction.)Mon référentiel Github a une version commentée de cela .
la source
Python 2, 158 octets
la source
golflua, 113 personnages
Échantillon échantillon:
la source
Python 2, 150 octets
Près du Python de l'auteur :(
la source
Perl,
139127117 octetsNe nécessite pas les options '-n' ou '-p'.
Révision 3 (merci à Dom Hastings ci-dessous):
Révision 2:
Révision 1:
Voici une version de la révision 3 qui n'a pas les nouvelles lignes vierges sur l'entrée négative - 132 octets.
la source
"Congratulations..."
et si vous remplacez' $',' |','-','~','-'
avecsplit 0,' $0 |0-0~0-'
vous pouvez déposer ces supports aussi. Une autre sauvegarde remplace$n=<>;$n==0
par($n=<>)==0
. De plus, vous?1:
pourriez être||
comme vous le diriez$n==0
(ce qui est 1) ou votre calcul. J'espère que ça t'as aidé!||
est très utile de me rappeler la sémantique de - cela me rappelle$=
essentiellementchomp
l’entrée, éliminant ainsi la nécessité de tests spécifiques de valeur 0. Je ne suis pas sûr de ce que vous entendez par$n=<>;$n==0
- mon golf n’a pas cela, et étant donné que je gère le cas input = 0 en entréemap{}()
, je ne suis pas sûr de savoir comment cela s’appliquerait? Quoi qu'il en soit, en prenant vos commentaires et en utilisant$=
ma variable, cela a été ramené à 117 parbytes. Merci beaucoup!$n=<>;
au début et ensuite$n==0
à la fin de la,map{}...
alors je pense que vous pourriez avoir le chèque,($n=<>)==0
mais si vous utilisez à la$=
place, vous pourrez peut-être le réduire davantage! J'oublie toujours lequel$-
ou$=
ne peut pas être négatif alors je ne voulais pas le mentionner et me tromper! :)Pip, 74 + 1 = 75 octets
Prend l'âge en argument de ligne de commande. Nécessite le
-n
drapeau.Dépôt Github pour Pip
L'argument de ligne de commande est stocké dans
a
. Nous nous séparons"-~-"
en une liste de caractères et l'Y
ancrons dans la variabley
. Le reste du programme est une grande expression ternaire:a?
Si
a
est la vérité (c'est-à-dire pas zéro):a<0?yX3
Si
a
est négatif, revenezy
avec chaque élément répété 3 fois:["---";"~~~";"---"]
a
est positif):(s.^"$|")Xa
Diviser
"$|"
en une liste de caractères, ajouter un espace (s
) à chacun et répéter chaquea
fois les élémentsyX2*a+1
Répétez chaque élément de
y
2*a+1
foisAL
Ajouter les deux listes
a
est zéro), retourne la chaîne de félicitationsÀ la fin du programme, l'
-n
indicateur garantit que les listes sont imprimées avec des éléments sur des lignes séparées, affichant ainsi un gâteau correctement superposé.Voici les étapes pour une entrée de
2
:Bon anniversaire!
la source
Perl, 144 octets
143 octets de code, plus un octet supplémentaire permettant au
-n
commutateur de capturer stdin.la source
print"-~-"=~s!.!$&x($_*2+1).$/!ger
pour le gâteau?-p
cela fonctionnera également:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
SpecBAS, 164
Utilise le raccourci apostrophe pour passer à la nouvelle ligne
Formaté pour une lecture plus facile
la source
Python 3, 169 octets
la source
Julia, 143 octets
Assez simple. Ungolfed:
la source
Lua, 299 octets
la source
attempt to compare string with number
), mais ajouter0+
avant leio.read()
corrige pour moi. Vous pouvez également économiser un peu d' octets en attribuantprint
etstring.rep
à des variables à caractère unique.Mathematica, 164 octets
Complètement raté les gâteaux sans bougies pour n <0, ajoutant 15 caractères supplémentaires
la source
pb , 567 octets
J'ai des regrets.
Il y a des façons que cela pourrait être mieux. Par exemple, après avoir déterminé que l'entrée est négative, je vais ensuite en déduire de quel nombre négatif il s'agit. C'est inutile, et peut-être qu'un jour je plongerai de nouveau dans ce code pour l'arrêter.
N'essayez pas de lancer ceci en mode "veille" de pbi, si vous entrez un négatif, il plantera lorsqu'il essaiera d'imprimer
chr(-1)
.Voici la
version expliquéeoù j'ai pris des notes lors de l'écriture du programme. Si vous souhaitez mieux comprendre comment cela fonctionne ... bonne chance et dites-moi si vous le comprenez.la source
ScriptCS (script C #), 221 octets
Évidemment, cela ne gagnera aucun prix, mais ...
la source