C'est mon anniversaire: D


112

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 nen entrée, écrivez un programme complet pour produire un gâteau d'anniversaire avec des nbougies 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>


161
Bon anniversaire!
Dennis

1
les espaces blancs (par exemple, 2 lignes nouvelles) sont-ils autorisés pour le gâteau sans bougies?
Level River St

2
@steveverrill Oui

2
@ PaŭloEbermann Un gâteau de 3-largeur

4
@jvriesem Non. C'est le code pour l'extrait de code.
Sigod

Réponses:


36

Pyth, 73 72 71 69 67 octets

?Qjb+m*+\ dQ"$|"*RhyeS,1Q"-~-""Congratulations on your new baby! :D

Essayez-le en ligne .

La sortie pour n <0 contient 2 nouvelles lignes principales, comme autorisé dans les commentaires . Pour vous en débarrasser, utilisez

?QjbfT+jR*\ hQ"$|"*RhyeS,1Q"-~-""Congratulations on your new baby! :D

Le plus petit code, bien sûr, semble être le moins lisible par l'homme.
Sathish Sanjeevi

WTF est-ce ??? LOL
Starx

18

CJam, 76 75 octets

ri_W>\_1e>)" $ |--~~--"2/f*Wf<N*"Congratulations on your new baby! :D"?_8>?

Essayez-le en ligne dans l' interprète CJam .

Comment ça fonctionne

ri           e# Read an integer from STDIN.
_W>          e# Check if it is greater than -1.
\_           e# Swap input and Boolean and copy the input.
1e>)         e# Take the maximum of input and 1 and increment the result.
             e# Let's call the result R.
" $ |--~~--" e# Push that string.
2/           e# Split it into [" $" " |" "--" "~~" "--"].
f*           e# Repeat each chunk R times.
Wf<          e# Discard the last character of each repeated chunk.
N*           e# Join the repreated chunks, separating by linefeeds.

"Congratulations on your new baby! :D"

?            e# If the input is non-zero, select the cake; else, keep the string.
_8>          e# Push a copy and discard the first 8 characters (single candle).
?            e# Select the unmodified cake/string if the input was non-negative,
             e# a candleless cake otehrwise.

11

Ruby, 120 octets

Révision 1 (120 octets)

18 octets économisés grâce à manatwork

n=gets.to_i
puts ['Congratulations on your new baby! :D',%w{\ $ \ | - ~ -}.map{|e|e.ljust 2*n+1,e},'---
~~~
---'][n<=>0]

Révision 0 (138 octets)

n=gets.to_i
n>0&&[' $',' |',?-,?~,?-].each{|e|puts''.rjust(2*n+1,e)}
puts ['Congratulations on your new baby! :D','','---
~~~
---'][n<=>0]

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.


1
N'y en at-il pas trop puts? n=gets.to_i puts ['Congratulations on your new baby! :D',%w{\ $ \ | - ~ -}.map{|e|''.rjust 2*n+1,e},'--- ~~~ ---'][n<=>0]
Manatwork

1
Un de plus: ''.rjuste.ljust.
manatwork

@manatwork merci, j'aurais dû le remarquer, mais je l'ai fait très rapidement. Je ne connaissais pas l'espace anti-slash avec% w. Et e.just: très intelligent.
Level River St

11

R, 157

write(if(n<-scan()){
z=matrix(c("$","|","-","~","-"),N<-2*max(1,n)+1,5,T)
z[seq(1,N,1+(n>0)),1:2]=" "
z}else"Congratulations on your new baby! :D","",N,F,"")

2
J'apprends beaucoup de choses sur les paramètres d'écriture. Un brillant
Tensibai

10

R, 228 226 220 221 octets


Derniè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

n=scan()
s=strsplit
p=paste0
a=b='-~-'
if(!n)cat('Congratulations on your new baby! :D')else{
if(n>0){a=p('  ',a);b=p('$|',b)}else n=1
a=s(a,'')
b=s(b,'')
d=data.frame(rep(c(a,b),n),a)
cat(do.call(p,d),sep="\n")}

1
Quelques octets peuvent être sauvegardés: <-peuvent être =, et vous pouvez utiliser a=b='-~-'.
Jbaums

Ho, merci @jbaums oublie le premier = et n'a pas pensé à la double assignation
Tensibai

Vous avez un problème de support quelque part, je comprendsError: unexpected '}'
flodel

@flodel corrigé. Copier / coller le numéro
Tensibai le

10

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.

/* Redefine alert for testing purpose */ alert=x=>O.innerHTML=x;

alert((n=+prompt())?[...'$|-~-'].map((c,i)=>(i>1?c:' '+c).repeat(i>1?n>0?n-~n:3:n>0&&n)).join`
`:'Congratulations on your new baby! :D')
<pre id=O></pre>

Moins golfé

n=+prompt(); // get input and convert to number

if (n) { // if n != 0 prepare the cake
   output = [...'$|-~-'].map( // for each char of the five lines
     (c,i) => (i>1 ? c : ' '+c) // in line 0 and 1 symbols are space separated
     // if n < 0 repeat count is 0 for line 0 and 1, 3 for the other
     // if n > 0 repeat count is n for line 0 and 1, n+n+1 for the other
     .repeat(i>1 ? n>0 ? n-~n : 3 : n>0 && n) // 
   ).join`\n`;
}
else {
    output = 'Congratulations on your new baby! :D');
}

alert(output);

Essayez ceci $('div pre code')[2].innerHTML;)
Vasu Adari

7

R, 279 octets

Version interactive (286 octets):

b<-function(){
n=scan()
if(n==0)cat("Congratulations on your new baby! :D\n")
if(n>0){k=2*n+1;m=rep("-",k);cat(paste(c(rep(c(" ","$"),l=k),"\n",rep(c(" ","|"),l=k),"\n",m,"\n",rep("~",k),"\n",m,"\n"),collapse=""))}
if(n<0){m=rep("-",3);cat(paste(c(m,"\n",rep("~",3),"\n",m,"\n"),collapse=""))}
}

Version non interactive (279 octets):

b<-function(n){
if(n==0)cat("Congratulations on your new baby! :D\n")
if(n>0){k=2*n+1;m<-rep("-",k);cat(paste(c(rep(c(" ","$"),l=k),"\n",rep(c(" ","|"),l=k),"\n",m,"\n",rep("~",k),"\n",m,"\n"),collapse=""))}
if(n<0){m=rep("-",3);cat(paste(c(m,"\n",rep("~",3),"\n",m,"\n"),collapse=""))}
}

7

MATLAB / Octave, 194 198 195 189 171 171 167 octets

Bon anniversaire à toi Beta Decay! :)

Merci à HamtaroWarrior d'avoir réduit de 4 octets!


n=input('');m='$|'.';d='  '.';if(n==0)disp('Congratulations on your new baby! :D'),break;elseif(n<0)m=d;n=1;end,disp([[d repmat([m d],1,n)];repmat('-~-'.',1,2*n+1)]);

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:

>> happy_birthday
-1


---
~~~
---
>> happy_birthday
0
Congratulations on your new baby! :D
>> happy_birthday
1
 $ 
 | 
---
~~~
---
>> happy_birthday
2
 $ $ 
 | | 
-----
~~~~~
-----
>> happy_birthday
3
 $ $ $ 
 | | | 
-------
~~~~~~~
-------
>> happy_birthday
4
 $ $ $ $ 
 | | | | 
---------
~~~~~~~~~
---------
>> happy_birthday
5
 $ $ $ $ $ 
 | | | | | 
-----------
~~~~~~~~~~~
-----------

Code avec espacement et explications

% Get the input number from the user
n=input('');

% If the number is positive, the core candle sequence is going to be a column vector of a $ followed by a | character
m='$|'.';    

%// Array of one column and it has two spaces - going to use more than once
d = '  '.';

% If the number is 0, display the congratulations message and get out
if(n==0)
    disp('Congratulations on your new baby! :D')
    break;

% m stores the core candle sequence for displaying on the screen
% If the number is negative, the core candle sequence is going to be a column of two blank spaces
elseif(n<0)
    m=d; 
    n=1; % n is set to 1 as this is the number of "blank candles" we want to display
end

% This displays candles and the base together
% The top half is the displaying of the candles
% It is a column vector of spaces, followed by pairs of $,| in a column
% and another column of spaces - repeated n times
% The bottom half is the displaying of the cake
% The bottom half is a column vector of -,~,- for the base of the cake
% and is repeated 2*n + 1 times to match the candle display
disp([[d repmat([m d],1,n)];repmat('-~-'.',1,2*n+1)]);

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 elle nest négative, qui devient ainsi n=1, et une autre colonne de deux espaces répétée total de nfois. Les trois lignes suivantes répliquent simplement le -,$,-vecteur de colonne pour 2*n + 1aligner 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 ndé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.


1
Dommage que vous ne puissiez pas sauver le point ' '.'!
Luis Mendo

1
@LuisMendo - Je sais! ... même si je suis sûr que vous ne vous opposez pas à l'utilisation de la transposition de cette façon :)
rayryeng

1
Hahaha. On m'a dit une fois ici que ce site est pour abuser de la langue. Et je suis cette règle fidèlement!
Luis Mendo

1
@ LuisMendo - Je voulais vraiment me débarrasser du point ... mais je ne pouvais pas parce que MATLAB l'interprète comme une simple citation dans la chaîne :(. Cela m'aurait évité quelques octets ... mais après plusieurs itérations, c'était le meilleur que je pouvais trouver.
rayryeng

@ LuisMendo - a réussi à le réduire à 171!
Rayryeng

6

JavaScript, 143 153 octets

for(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'


Bienvenue chez PPCG! :)

2
Malheureusement, cela affiche également le message de félicitations pour les entrées négatives.
Manatwork

@BetaDecay tnx :-)
Nainemom le

Droit de Manatwork: / Je ne sais pas assez JS pour aider

@manatwork oui vous avez raison! j'ai mal compris!
Nainemom

5

Moonscript, 141 octets

n=0+io.read!
m=3
f=(s='-')->print s\rep m
if n>0
 m=n
 m=1+2*m,f' $',f' |'
if n==0 print"Congratulations on your new baby! :D"else f f!,f'~'

3
Bienvenue dans Programmation Puzzles et Code Golf!
Dennis


4

JavaScript ES6, 154 caractères

alert((n=+prompt())?((n>0?` $
 |
`:(n=1)&&"")+`--
~~
--`).replace(/../gm,x=>x.repeat(n)).replace(/(.).*/gm,"$&$1"):"Congratulations on your new baby! :D")

Et un de plus (154 aussi)

alert((n=+prompt())?` $
 |
--
~~
--`.slice(n<0?(n=1)-9:0).replace(/../gm,x=>x.repeat(n)).replace(/(.).*/gm,"$&$1"):"Congratulations on your new baby! :D")

Pour afficher la sortie en police monospace (et déplacer la sortie vers la console), utilisez

alert=x=>console.log(x)

4

Souris , 164 161 octets

?N:N.0=["Congratulations on your new baby"33!'" :D"$]N.0>[#P,32!'36,N.;#P,32!'124,N.;]N.0<[1N:]2N.*1+D:#P,45,D.;#P,126,D.;#P,45,D.;$P0I:(I.2%=0=^1%!'I.1+I:)"!"@

La souris n’est clairement pas un choix idéal pour cette tâche, mais c’était amusant.

Ungolfed:

? N.                               ~ Read N from STDIN
N. 0 = [                           ~ Have a baby for N == 0
  "Congratulations on your new baby" 33 !' " :D" $
]
N. 0 > [                           ~ If N > 0...
  #P, 32 !' 36, N.;                ~ Print the candle flames
  #P, 32 !' 124, N.;               ~ Print the candle sticks
]
N. 0 < [                           ~ If N < 0...
  1 N:                             ~ Set N = 1
]
2 N. * 1 + D:                      ~ Assign D = 2N + 1
#P, 45, D.;                        ~ Print the top cake layer
#P, 126, D.;                       ~ Print the middle layer
#P, 45, D.;                        ~ Print the bottom
$P                                 ~ Define the printing macro...
  0 I:                             ~ Initialize I to 0
  ( I. 2% = 0 = ^                  ~ While I != the second input
    1% !'                          ~ Print the first input
    I. 1 + I:                      ~ Increment I
  )
  "!"                              ~ Print a newline
@

La pile ne peut contenir que des entiers. !'prend un entier de la pile et affiche le caractère ASCII avec ce code.


4

CoffeeScript, 160 octets

f=(i,l=[" $ "," | ",_="---","~~~",_])->if!i then"Congratulations on your new baby! :D"else (if i<0then[_,l[3],_]else i++;(Array(i).join r for r in l)).join "\n"

Ungolfed:

f=(i)->
  l = [" $ "," | ","---","~~~","---"] # The layers
  if i == 0
    return "Congratulations on your new baby! :D"
  else if i < 0
    return [l[2], l[3], l[2]].join("\n")
  else
    i++
    return (Array(i).join(r) for r in l).join("\n")

Utilisez-le comme:

f(10) # In the CoffeeScript console
alert(f(~~prompt("Y"))) # Browser, alert popup
console.log(f(~~prompt("Y"))) # Browser, log to console, and thus has monospace font

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!


4

C, 392 octets

(faute de segmentation connue si aucun argument n'est donné)

#include <stdio.h>
#define P(s) printf(s);
#define F for(i=0;i<n;i++)
#define A(s, e) F{P(s)}P(e "\n")
int main(int c, char**v){int i,n=atoi(v[1]);if(n<0){n=3;A("-",)A("~",)A("-",)}else if(!n)P("Congratulations on your new baby! :D\n")else{A(" $",)A(" |",)A("--","-")A("~~","~")A("--","-")}}

Non minée et copieusement espacée

#include <stdio.h>
#define P(s) printf ( s ) ;
#define F for ( i = 0 ; i < n ; i++ )
#define A(s, e) F { P ( s ) } P ( e "\n" )
int main ( int c, char ** v )
{
        int i, n = atoi ( v [ 1 ] ) ; 
        if ( n < 0 ) 
        {   
                n = 3 ; 
                A ( "-", )
                A ( "~", )
                A ( "-", )
        }   
        else if ( ! n ) 
                P ( "Congratulations on your new baby! :D\n" )
        else
        {   
                A ( " $", )
                A ( " |", )
                A ( "--", "-" )
                A ( "~~", "~" )
                A ( "--", "-" )
        }   
}

Sans C, les # définissent et le corps principal total 247.
Funmungus

Bienvenue chez PPCG! C'est une très bonne réponse - j'aime particulièrement l'abus de macro avec A. Je vois quelques espaces supplémentaires qui pourraient être supprimés, et vous pouvez vous en débarrasser ien utilisant cplutô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. ;)
DLosc

4

Powershell, 139 134 132 126 octets

$n=$args[0];if($n){$d=3;if($n-gt0){' $'*$n;' |'*$n;$d=$n*2+1}'-'*$d;'~'*$d;'-'*$d}else{'Congratulations on your new baby! :D'}

Vous pouvez économiser 5 octets en utilisant à la $inputplace 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;
briantist le

+ $ input n'a pas semblé fonctionner - il s'est plaint que $ input soit un énumérateur et ne possède pas d'opérateur d'addition. Cependant, $args[0]peut et doit être un réel int, nous permettant au moins de laisser tomber le fichier [int].
Justin Dunlap

1
Donc, c'est vraiment vieux, mais vous pouvez économiser quelques octets en déplaçant l'entrée dans ifet en remplaçant l else' ;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'
AdmBorkBork

4

Ceylan, 322 307 300 282 278 260 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"));}}

L'original non encore golfé (en supposant que les gâteaux négatifs aient une largeur de 3 au lieu de –2 · n + 1):

shared void birthdayCake() {
    if (exists text = process.readLine(), exists number = parseInteger(text)) {
        switch (number <=> 0)
        case (equal) {
            print("Congratulations on your new baby! :D");
        }
        case (smaller) {
            print("---\n~~~\n---");
        }
        case (larger) {
            print(" $".repeat(number));
            print(" |".repeat(number));
            print("--".repeat(number) + "-");
            print("~~".repeat(number) + "~");
            print("--".repeat(number) + "-");
        }
    }
}

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 leexist , 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 à la Comparable.compareméthode et retourne un Comparisonobjet, c'est-à-dire l'un des equal, smalleret larger. Le compilateur sait que ceux-ci épuisent le Comparisontype, aucune elseclause n’est donc nécessaire dans notreswitch déclaration.

La repeatmé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:

shared void b(){if(exists t=process.readLine(),exists n=parseInteger(t)){switch(n<=>0)case (equal){print("Congratulations on your new baby! :D");}case(smaller){print("---\n~~~\n---");}case(larger){print(" $".repeat(n));print(" |".repeat(n));print("--".repeat(n)+"-");print("~~".repeat(n)+"~");print("--".repeat(n)+"-");}}}

Remplacer la série de printpar \ns explicite (et un seul print) la ramène à 307:

shared void b(){if(exists t=process.readLine(),exists n=parseInteger(t)){switch(n<=>0)case(equal){print("Congratulations on your new baby! :D");}case(smaller){print("---\n~~~\n---");}case(larger){print(" $".repeat(n)+"\n"+" |".repeat(n)+"\n"+"--".repeat(n)+"-\n"+"~~".repeat(n)+"~\n"+"--".repeat(n)+"-");}}}

J'ai essayé d'alias-importing de repeatas r, 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çant repeatpar r).

Ce qui aide légèrement, utilise n.signau lieu de n<=>0. Bien que ces deux expressions ont la même longueur textuelle, ils ont différents types: celui - ci un est de type Comparisonmentionné précédemment (qui a les trois valeurs smaller, largeret equal), l'ancien a le type Integer, les valeurs -1, 1, 0... et parce que Integera beaucoup plus de valeurs, nous avons également besoin d'une elseclause. Cela fait 300 caractères:

shared void b(){if(exists t=process.readLine(),exists n=parseInteger(t)){switch(n.sign)case(0){print("Congratulations on your new baby! :D");}case(-1){print("---\n~~~\n---");}case(1){print(" $".repeat(n)+"\n"+" |".repeat(n)+"\n"+"--".repeat(n)+"-\n"+"~~".repeat(n)+"~\n"+"--".repeat(n)+"-");}else{}}}

Ici avec des espaces:

shared void b() {
    if (exists t = process.readLine(), exists n = parseInteger(t)) {
        switch (n.sign)
        case (0) {
            print("Congratulations on your new baby! :D");
        }
        case (-1) {
            print("---\n~~~\n---");
        }
        case (1) {
            print(" $".repeat(n) + "\n" +
                        " |".repeat(n) + "\n" +
                        "--".repeat(n) + "-\n" +
                        "~~".repeat(n) + "~\n" +
                        "--".repeat(n) + "-");
        }
        else {}
    }
}

Nous pouvons en sécuriser davantage en résiliant notre instruction switch et en utilisant if282 caractères (= octets):

shared void b(){if(exists t=process.readLine(),exists n=parseInteger(t)){if(n==0){print("Congratulations on your new baby! :D");}else if(n<0){print("---\n~~~\n---");}else{print(" $".repeat(n)+"\n"+" |".repeat(n)+"\n"+"--".repeat(n)+"-\n"+"~~".repeat(n)+"~\n"+"--".repeat(n)+"-");}}}

Formaté:

shared void b() {
    if (exists t = process.readLine(), exists n = parseInteger(t)) {
        if (n == 0) {
            print("Congratulations on your new baby! :D");
        } else if (n < 0) {
            print("---\n~~~\n---");
        } else {
            print(" $".repeat(n) + "\n" +
                        " |".repeat(n) + "\n" +
                        "--".repeat(n) + "-\n" +
                        "~~".repeat(n) + "~\n" +
                        "--".repeat(n) + "-");
        }
    }
}

Nous pouvons sécuriser un autre octet en permutant les cas, car >est plus court que ==. Une autre "gêne" est la répétition repeat(n)- nous pouvons définir une fonction locale (une fermeture, elle se souvient ndu bloc de définition) avec un nom plus court:

String r(String s) => s.repeat(n);

C'est une façon plus courte d'écrire ceci:

String r(String s) {
    return s.repeat(n);
}

Nous pourrions utiliser functionle type de retour à la place du type de retour, mais ce n'est pas plus court. Cela nous donne 278 octets:

shared void b(){if(exists t=process.readLine(),exists n=parseInteger(t)){if(n>0){String r(String s)=>s.repeat(n);print(r(" $")+"\n"+r(" |")+"\n"+r("--")+"-\n"+r("~~")+"~\n"+r("--")+"-");}else if(n<0){print("---\n~~~\n---");}else{print("Congratulations on your new baby! :D");}}}

Formaté:

shared void b() {
    if (exists t = process.readLine(), exists n = parseInteger(t)) {
        if (n > 0) {
            String r(String s) => s.repeat(n);
            print(r(" $") + "\n" + r(" |") + "\n" + r("--") + "-\n" + r("~~") + "~\n" + r("--") + "-");
        } else if (n < 0) {
            print("---\n~~~\n---");
        } else {
            print("Congratulations on your new baby! :D");
        }
    }
}

En fait, utiliser les opérateurs thenet elseau lieu des ifdéclarations nous permet de sauvegarder certains appels de print(et de certaines accolades):

shared void run() {
    if (exists t = process.readLine(), exists n = parseInteger(t)) {
        String r(String s) => s.repeat(n);
        print(n > 0 then r(" $") + "\n" +
                        r(" |") + "\n" +
                        r("--") + "-\n" +
                        r("~~") + "~\n" +
                        r("--") + "-"
                    else (n < 0
                        then "---\n~~~\n---"
                        else "Congratulations on your new baby! :D"));
    }
}

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 runplace de bpour le nom de la fonction car cela permet de l'exécuter ceylon runsans passer un nom de fonction.)

Mon référentiel Github a une version commentée de cela .


3

Python 2, 158 octets


i=input()
l='\n'
s=''
if i==0:s='Congratulations on your new baby! :D'
elif i<0:s='---\n~~~\n---'
else:n=i*2+1;a=l+'-'*n;s=' $'*i+l+' |'*i+a+l+'~'*n+a
print s

3

golflua, 113 personnages

\p(c)w(S.t(c,n))~$n=I.r()+0?n==0w"Congratulations on your new baby! :D"!??n>0p" $"p" |"n=n*2+1!?n=3$p"-"p"~"p"-"$

Échantillon échantillon:

bash-4.3$ golflua -e '\p(c)w(S.t(c,n))~$n=I.r()+0?n==0w"Congratulations on your new baby! :D"!??n>0p" $"p" |"n=n*2+1!?n=3$p"-"p"~"p"-"$' <<< 5
 $ $ $ $ $
 | | | | |
-----------
~~~~~~~~~~~
-----------

bash-4.3$ golflua -e '\p(c)w(S.t(c,n))~$n=I.r()+0?n==0w"Congratulations on your new baby! :D"!??n>0p" $"p" |"n=n*2+1!?n=3$p"-"p"~"p"-"$' <<< 0
Congratulations on your new baby! :D

bash-4.3$ golflua -e '\p(c)w(S.t(c,n))~$n=I.r()+0?n==0w"Congratulations on your new baby! :D"!??n>0p" $"p" |"n=n*2+1!?n=3$p"-"p"~"p"-"$' <<< -5
---
~~~
---

3

Python 2, 150 octets

m=input()
n=m-1
p="---"+"--"*n
g="\n~~~"+"~~"*n+"\n"
if m>0:print" $"*m,"\n"," |"*m
s=p+g+p
print s if m!=0 else"Congratulations on your new baby! :D"

Près du Python de l'auteur :(


3

Perl, 139 127 117 octets

Ne nécessite pas les options '-n' ou '-p'.

Révision 3 (merci à Dom Hastings ci-dessous):

$==<>;map{print$_ x(!$=||(/ /?$=:($=<1||$=)*2+1)).$/}!$=?'Congratulations on your new baby! :D':split 0,' $0 |0-0~0-'

Révision 2:

$n=<>;map{print$_ x($n==0?1:(/ /?$n:($n<1?1:$n)*2+1)).$/}$n==0?('Congratulations on your new baby! :D'):(' $',' |','-','~','-')

Révision 1:

$n=<>;map{print$_ x(($l=length())>2?1:($l==2?$n:($n<1?1:$n)*2+1)).$/}$n==0?('Congratulations on your new baby! :D'):(' $',' |','-','~','-')

Voici une version de la révision 3 qui n'a pas les nouvelles lignes vierges sur l'entrée négative - 132 octets.

$==<>;map{print$_ x(!$=||(/ /?$=:($=<1||$=)*2+1)).(/ /&&$=<0?'':$/)}!$=?'Congratulations on your new baby! :D':split 0,' $0 |0-0~0-'

Salut, bienvenue! Je pensais partager quelques façons d'économiser des octets! Vous pouvez déposer les crochets autour "Congratulations..."et si vous remplacez ' $',' |','-','~','-'avec split 0,' $0 |0-0~0-'vous pouvez déposer ces supports aussi. Une autre sauvegarde remplace $n=<>;$n==0par ($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é!
Dom Hastings

Salut, merci pour ça. Ces crochets sont bons et il ||est très utile de me rappeler la sémantique de - cela me rappelle $=essentiellement chompl’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ée map{}(), 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!
phillipo

Aucun problème du tout! Heureux d'avoir aidé! Ce que je veux dire, c'est que vous avez $n=<>;au début et ensuite $n==0à la fin de la, map{}...alors je pense que vous pourriez avoir le chèque, ($n=<>)==0mais 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! :)
Dom Hastings

3

Pip, 74 + 1 = 75 octets

Prend l'âge en argument de ligne de commande. Nécessite le -ndrapeau.

Y^"-~-"a?a<0?yX3(s.^"$|")XaALyX2*a+1"Congratulations on your new baby! :D"

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' Yancrons dans la variable y. Le reste du programme est une grande expression ternaire:

  • a?
    Si aest la vérité (c'est-à-dire pas zéro):
    • a<0?yX3
      Si aest négatif, revenez yavec chaque élément répété 3 fois:["---";"~~~";"---"]
    • Sinon ( aest positif):
      • (s.^"$|")Xa
        Diviser "$|"en une liste de caractères, ajouter un espace ( s) à chacun et répéter chaque afois les éléments
      • yX2*a+1
        Répétez chaque élément de y 2*a+1fois
      • AL
        Ajouter les deux listes
  • Sinon ( aest zéro), retourne la chaîne de félicitations

À la fin du programme, l' -nindicateur 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:

Candles
["$";"|"]
[" $";" |"]
[" $ $";" | |"]

Cake
["-";"~";"-"]
["-----";"~~~~~";"-----"]

Put it together
[" $ $";" | |";"-----";"~~~~~";"-----"]

Final output
 $ $
 | |
-----
~~~~~
-----

Bon anniversaire!


2

Perl, 144 octets

143 octets de code, plus un octet supplémentaire permettant au -ncommutateur de capturer stdin.

if($_!=0){print$_>0?" \$"x$_.$/." |"x$_.$/:""x($_=1);$_=$_*2+1;print"-"x$_.$/."~"x$_.$/."-"x$_;exit}print"Congratulations on your new baby! :D"

1
print"-~-"=~s!.!$&x($_*2+1).$/!gerpour le gâteau?
Manatwork

Si vous changez le commutateur, -pcela fonctionnera également:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
manatwork le

2

SpecBAS, 164

Utilise le raccourci apostrophe pour passer à la nouvelle ligne

INPUT n: IF n=0 THEN PRINT "Congratulations on your new baby! :D" ELSE IF n<0 THEN PRINT "---"'"~~~"'"---" ELSE PRINT " $"*n'" |"*n'"-";"--"*n'"~";"~~"*n'"-";"--"*n

Formaté pour une lecture plus facile

INPUT n
IF n=0 THEN PRINT "Congratulations on your new baby! :D" 
ELSE IF n<0 THEN PRINT "---"'"~~~"'"---" 
ELSE PRINT " $"*n'" |"*n'"-";"--"*n'"~";"~~"*n'"-";"--"*n

2

Python 3, 169 octets

n=int(input())
m=max(n*2+1,3)
f=' {}'*n+'\n'+' {}'*n+'\n'+'-'*m+'\n'+'~'*m+'\n'+'-'*m
if n==0:f='Congratulations on your new baby! :D'
print(f.format(*['$']*n+['|']*n))

2

Julia, 143 octets

n=int(readline())
p=println
l="\n"
n>0&&p(" \$"^n*l*" |"^n)
d=2(n<0?1:n)+1
p(d>1?"-"^d*l*"~"^d*l*"-"^d:"Congratulations on your new baby! :D")

Assez simple. Ungolfed:

# Read n from STDIN and convert to an integer
n = int(readline())

# Print the candles for positive n
n > 0 && println(" \$"^n * "\n" * " |"^n)

# Define d as the width of the cake
d = 2(n < 0 ? 1 : n) + 1

# Newborns can't eat cake
if d > 1
    println("-"^d * "\n" * "~"^d * "\n" * "-"^d)
else
    println("Congratulations on your new baby! :D")
end

2

Lua, 299 octets

a=0+io.read() b=string.rep p=print if a==0 then p("Congratulations on your new baby! :D") else p(b(" ",a)..b("$ ",a)..("\n")..b(" ",a)..b("| ",a)) if a<0 or a==1 then p("---\n~~~\n---") else p(b(" ",a-1).."-"..b("-",2*a).."\n"..b(" ",a-1).."~"..b("~",2*a).."\n"..b(" ",a-1).."-"..b("-",2*a))end end

1
Bienvenue chez PPCG! Votre code dans son état actuel semble donner une erreur ( attempt to compare string with number), mais ajouter 0+avant le io.read()corrige pour moi. Vous pouvez également économiser un peu d' octets en attribuant printet string.repà des variables à caractère unique.
DLosc

@DLosc merci bonne idée :) et ouais tu avais raison avec l'erreur désolé
FabiF

2

Mathematica, 164 octets

Complètement raté les gâteaux sans bougies pour n <0, ajoutant 15 caractères supplémentaires

r[a_,b_]:=StringRepeat[a,Abs@b];c=" $ ";t="---";m="~~~";f[n_]:=If[n>0,r[c,n]~~"\n",""]~~r[t,n]~~"\n"~~r[m,n]~~"\n"~~r[t,n];f[0]:="Congratulations on your new baby! :D"

1
Bienvenue à PPCG, ce défi est connu sous le nom de code golf, où vous essayez de rendre votre code aussi court que possible. Cela peut être fait en supprimant les espaces inutiles et en raccourcissant les noms de variables.

Merci @BetaDecay Je devenais une version rapide .. minimiser maintenant. À la vôtre: D
Martin John Hadley

Aucun problème. On dirait bien :)

2

pb , 567 octets

^w[B=45]{vb[-1]^b[0]>w[B!0]{t[B]b[0]<b[T]>>}<}w[B!0]{>}b[65]w[X!0]{<b[B-48]}>w[B!65]{t[B]<t[B*10+T]b[0]>b[T]>}b[0]<t[B]b[0]<[X]>b[T]<b[T]vw[B=0]{b[1]}t[B]b[0]^b[B*T]vw[X!3]{b[45]vb[126]vb[45]^^>}^<<t[B]<b[B+T]w[B!0]{<vw[X!3]{b[0]vb[0]vb[0]^^>}^<<t[B]vvw[T!0]{b[124]^b[36]v>>t[T-1]}v<w[X!-1]{b[45]vb[126]vb[45]^^<}}^[Y]^<[X]>w[B=0]{>vvw[X!-1]{b[0]vb[0]^<}^>}t[111]b[67]>b[T]>b[110]>b[103]>b[114]>b[97]>b[116]>b[117]>b[108]>b[97]>b[116]>b[105]>b[T]>b[110]>b[115]>>b[T]>b[110]>>b[121]>b[T]>b[117]>b[114]>>b[110]>b[101]>b[119]>>b[98]>b[97]>b[98]>b[121]>b[33]>>b[58]>b[68]

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ée où 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.

# parse number

^w[B=45]{vb[-1]^b[0]>     # if negative, put a -1 at (0, 0)
    w[B!0]{t[B]b[0]<b[T]>>} # move all digits left
<}
w[B!0]{>}b[65]        # put an "A" at the end of the number
w[X!0]{<b[B-48]}      # subtract 48 from each byte to get the digits of the number
>w[B!65]{             # while there's no "A" at the second digit
    t[B]<t[B*10+T]      # set T to (first digit * 10) + second digit
    b[0]                # destroy first digit
    >b[T]               # override 2nd digit with T
    >}                  # point at second digit to restart loop
b[0]<t[B]b[0]<[X]>b[T]<b[T] # move number to (0, -1) and (1, -1)
vw[B=0]{b[1]}t[B]b[0]^b[B*T] # multiply (0, -1) by -1 if required
vw[X!3]{b[45]vb[126]vb[45]^^>} # draw the negative cake
^<<t[B]<b[B+T]w[B!0]{ # if it's positive
    <vw[X!3]{b[0]vb[0]vb[0]^^>} # erase the cake
    ^<<t[B]vvw[T!0]{b[124]^b[36]v>>t[T-1]} # draw the candles
    v<w[X!-1]{b[45]vb[126]vb[45]^^<}       # draw the cake
}^[Y]^<[X]>w[B=0]{>vvw[X!-1]{b[0]vb[0]^<}^>} # erase the part of the cake that would show up
# hardcoded string for input 0
t[111]b[67]>b[T]>b[110]>b[103]>b[114]>b[97]>b[116]>b[117]>b[108]>b[97]>b[116]>b[105]>b[T]>b[110]>b[115]>>b[T]>b[110]>>b[121]>b[T]>b[117]>b[114]>>b[110]>b[101]>b[119]>>b[98]>b[97]>b[98]>b[121]>b[33]>>b[58]>b[68]

2

ScriptCS (script C #), 221 octets

Évidemment, cela ne gagnera aucun prix, mais ...

var n=int.Parse(Env.ScriptArgs[0]);Console.WriteLine(n==0?"Congratulations on your new baby! :D":string.Join("\n",new[]{" $"," |","-","~","-"}.Select((s,i)=>string.Concat(Enumerable.Repeat(s,i>1?(n>0?n:1)*2+1:n>0?n:0)))))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.