Es ist mein Geburtstag: D

112

Einführung

Letztes Jahr war mein Geburtstag (wirklich!) Und leider musste ich meine eigene Party organisieren. Nun, jetzt weißt du, könntest du nicht wenigstens den Kuchen machen?

Herausforderung

nSchreiben Sie mit einer Ganzzahl als Eingabe ein vollständiges Programm, um eine Geburtstagstorte mit nKerzen auszugeben .

Ausgabe

Ein Stück Kuchen mit einer Kerze ist:

 $
 |
---
~~~
---

Und ein Stück Kuchen mit drei Kerzen ist:

 $ $ $
 | | |
-------
~~~~~~~
-------

Ich bin sicher, Sie können es daraus herausarbeiten

Allerdings , fürEingabe0müssen Sie Ausgabe des folgenden:

Congratulations on your new baby! :D

Für Eingaben unter 0sollten Sie einen kerzenlosen Kuchen ausgeben:

---
~~~
---

Es darf nichts nach STDERR ausgegeben werden.

Nachgestellte Zeilenumbrüche und Leerzeichen sind zulässig.

Gewinnen

Kürzester Code in Bytes gewinnt.

Bestenliste

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>


quelle
161
Alles Gute zum Geburtstag!
Dennis
1
Ist für den kerzenlosen Kuchen ein führendes Leerzeichen (z. B. 2 Zeilenvorschub) zulässig?
Level River St
2
@steveverrill Ja
2
@ PaŭloEbermann Ein Kuchen von 3-Breite
4
@ jvriesem Nein. Es ist Code für Snippet.
Sigod

Antworten:

36

Pyth, 73 72 71 69 67 Bytes

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

Probieren Sie es online aus .

Die Ausgabe für n <0 enthält 2 führende Zeilenumbrüche, wie in Kommentaren zulässig . Um sie loszuwerden, verwenden Sie

?QjbfT+jR*\ hQ"$|"*RhyeS,1Q"-~-""Congratulations on your new baby! :D
PurkkaKoodari
quelle
Der kleinste Code scheint natürlich am wenigsten für den Menschen lesbar zu sein.
Sathish Sanjeevi
Was zur Hölle ist das??? LOL
Starx
18

CJam, 76 75 Bytes

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

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

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.
Dennis
quelle
11

Ruby, 120 Bytes

Revision 1 (120 Bytes)

18 Bytes gespart dank Handarbeit

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

Revision 0 (138 Bytes)

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

Für positive Zahlen: Dies durchläuft eine Zeichenfolge, die jeder Zeile des Kuchens entspricht. Diese werden als Pad-Zeichenfolgen verwendet, um die leere Zeichenfolge mit der Länge 2 * n + 1 rechtsbündig auszurichten. Dies vermeidet Komplikationen beim Drucken einer ungeraden Anzahl von Zeichen, wenn die natürliche Wiederholung dem Abstand der Kerzen entspricht (dh 2 Zeichen) n>0&&, um die Ausgabe einer einzelnen Spalte bei Eingabe von Null zu vermeiden.

Für alle Zahlen: " n<=>0" findet das Vorzeichen der Eingabe. Die Babynachricht wird für n = 0 und eine leere Zeichenfolge für positives n ausgegeben (da die korrekte Ausgabe bereits oben angegeben wurde). Für negatives n interpretiert Ruby das -1 als letztes Element des Arrays und gibt das kerzenlose Element aus Kuchen.

Level River St
quelle
1
Gibt es nicht zu viele puts? n=gets.to_i puts ['Congratulations on your new baby! :D',%w{\ $ \ | - ~ -}.map{|e|''.rjust 2*n+1,e},'--- ~~~ ---'][n<=>0]
Manatwork
1
Eins mehr: ''.rjuste.ljust.
Handarbeit
@manatwork danke, ich hätte das sehen sollen, aber ich habe das sehr schnell gemacht. Ich wusste nichts über Backslash Space mit% w. Und e.just: sehr schlau.
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,"")
Flodel
quelle
2
Ich lerne dort viel über das Schreiben von Parametern. Brilliant one
Tensibai
10

R, 228 226 220 221 Bytes


Die letzte Änderung zur Korrektur des kerzenlosen Kuchens war genauso umfangreich wie die positive für negative Fälle. Vielen Dank an @CathG und @jbaums für das Feedback

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")}
Tensibai
quelle
1
Ein paar Bytes können gespeichert werden: <-kann sein =, und Sie können verwenden a=b='-~-'.
Jbaums
Ho, danke @jbaums, vergiss das erste = und dachte nicht an die doppelte Zuordnung
Tensibai
Sie haben irgendwo ein Problem mit der Klammer, ich bekommeError: unexpected '}'
Flodel
@flodel korrigiert. Ausgabe kopieren / einfügen
Tensibai
10

JavaScript ES6, 136

Verwenden der Warnung für die Ausgabe - schlechte proportionale Schrift und das Ergebnis ist hässlich. Im folgenden Snippet wird die Warnung an den ausgeschnittenen Körper weitergeleitet, um ein besseres Ergebnis zu erzielen.
Der Zeilenvorschub innerhalb der Backticks ist signifikant und wird gezählt.

Testen Sie das Snippet in 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>

Weniger golfen

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);
edc65
quelle
Versuchen Sie dies $('div pre code')[2].innerHTML;)
Vasu Adari
7

R, 279 Bytes

Interaktive Version (286 Bytes):

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=""))}
}

Nicht interaktive Version (279 Bytes):

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=""))}
}
Cath
quelle
7

MATLAB / Octave, 194 198 195 189 171 167 Bytes

Alles Gute zum Geburtstag Beta Decay! :)

Vielen Dank an HamtaroWarrior für das Abschneiden von 4 Bytes!


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)]);

Probeläufe

Ich habe dies in eine Skriptdatei mit dem Namen happy_birthday.meingefügt und es dann einige Male in der Eingabeaufforderung ausgeführt. Beachten Sie, dass bei der Eingabe einer negativen Zahl zwei führende Zeilenumbrüche auftreten, was bei dieser Herausforderung jedoch zulässig ist:

>> 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 mit Abstand und Erläuterungen

% 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)]);

Der Anzeigeteil am Ende ist wahrscheinlich der am meisten verschleierte Teil des Codes. Daraufhin wird eine 5-zeilige Zeichenmatrix angezeigt, in der die ersten beiden Zeilen aus den Kerzen und die letzten drei Zeilen aus der Basis des Kuchens bestehen.

Die Basis für die obere Hälfte der Anzeige sind entweder zwei Leerzeichen in einer Spalte, gefolgt von zwei Leerzeichen in einer anderen Spalte, falls das Alter negativ ist, oder a $,-in einer Spalte, gefolgt von zwei Leerzeichen in einer anderen Spalte. Dies ist eine 2 x 2 Zeichenmatrix. Die Basis für die untere Hälfte der Anzeige ist ein einzelner Spaltenvektor, von -,~,-dem eine 3 × 1-Zeichenmatrix ist.

Der Anzeigebefehl geht zuerst die ersten beiden Zeilen des Kuchens an, indem zwei Leerzeichen in die erste Spalte gesetzt werden, gefolgt von Paaren einer Spalte $,-oder einer Spalte mit Leerzeichen, falls nnegativ, was in geändert wird n=1, und einer weiteren Spalte mit zwei Leerzeichen, die für a wiederholt wird insgesamt nmal. In den nächsten drei Zeilen wird der -,$,-Spaltenvektor einfach einige 2*n + 1Male repliziert , um die Kerzen an der Basis auszurichten und so das Bild zu vervollständigen.

Probieren Sie es online!

Sie können dies online mit IDEOnes Octave-Compiler versuchen: http://ideone.com/4qXDdJ - es gibt jedoch einen kleinen Fehler beim Einlesen von Werten aus der Standardeingabe. Aus diesem Grund wird das Skript geringfügig geändert, sodass Sie den Wert nam Anfang des Codes ändern müssen. Öffnen Sie eine neue Version des Skripts und ändern Sie diese in einen beliebigen ganzzahligen Wert, um zu sehen, wie die Ausgabe aussieht.

rayryeng
quelle
1
Schade, dass Sie den Punkt nicht speichern können ' '.'!
Luis Mendo
1
@ LuisMendo - Ich weiß! ... obwohl ich sicher bin, dass Sie nicht gegen die Verwendung der Transponierung auf diese Weise
einwenden
1
Hahaha. Mir wurde hier einmal gesagt, dass diese Seite für den Missbrauch der Sprache ist. Und ich folge dieser Regel treu!
Luis Mendo
1
@LuisMendo - Ich wollte den Punkt unbedingt loswerden ... konnte es aber nicht, da MATLAB dies als einfaches Anführungszeichen in der Zeichenfolge interpretiert :(. Hätte mir ein paar Bytes gespart ... aber nach vielen Iterationen war dies Das Beste, was ich finden konnte.
Rayryeng
@LuisMendo - hat es geschafft, auf 171 zu verkleinern!
Rayryeng
6

JavaScript, 143 153 Bytes

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')

Ersetzen Sie "alert" durch "console.log", um die Ausgabe in Mono Space-Schrift zu sehen.

Nainemom
quelle
Willkommen bei PPCG! :)
2
Leider wird hier auch die Glückwunschnachricht für negative Eingaben angezeigt.
Manatwork
@
BetaDecay
Manatwork Recht: / Ich weiß nicht genug JS zu helfen
@manatwork ja du hast recht! ich habe es falsch verstanden!
Nainemom
5

Mondschrift, 141 Bytes

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'~'
Ryan Russell
quelle
3
Willkommen bei Programming Puzzles und Code Golf!
Dennis
4

rs , 117 bytes

^0$/Congratulations on your new baby! :D
-.+/-1
$$r=)^^(\1)\n
$$m=-(--)^^(\1)\n
(\d+)/ ($ $r (| $r$m~(~~$r$m
^-[^-]+/

Live-Demo und Testfälle.

kirbyfan64sos
quelle
4

JavaScript ES6, 154 Zeichen

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

Und noch eine (auch 154)

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")

Verwenden Sie diese Option, um die Ausgabe in Monospace-Schriftarten anzuzeigen (und die Ausgabe in die Konsole zu verschieben)

alert=x=>console.log(x)
Qwertiy
quelle
4

Maus , 164 161 Bytes

?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:)"!"@

Maus ist eindeutig keine ideale Wahl für diese Aufgabe, aber es hat Spaß gemacht.

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
@

Der Stapel kann nur Ganzzahlen enthalten. !'Nimmt eine Ganzzahl vom Stapel und druckt das ASCII-Zeichen mit diesem Code.

Alex A.
quelle
4

CoffeeScript, 160 Bytes

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")

Verwenden Sie es wie folgt:

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

Probieren Sie es online aus: link (Enthält einen benutzerdefinierten Anzeigecode, damit alles so gut aussieht ...)

Hoppla, hätte es fast vergessen! Alles Gute zum Geburtstag, @BetaDecay!

Bojidar Marinov
quelle
4

C 392 Bytes

(bekannter Segmentierungsfehler, wenn keine Argumente angegeben sind)

#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("--","-")}}

Uneingeschränkt und reichlich verteilt

#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 ( "--", "-" )
        }   
}
Funmungus
quelle
Ohne C-Boilerplate sind die #
-Definitionen
Willkommen bei PPCG! Das ist eine wirklich gute Antwort - ich mag besonders den Makromissbrauch mit A. Ich sehe ein paar Leerzeichen mehr, die entfernt werden könnten, und Sie können diese entfernen, iindem Sie stattdessen cfür die Schleifenvariable verwenden. Zumindest mit gcc, einschließlich stdio.h, oder der Angabe des Rückgabetyps von main () ist es nicht erforderlich: Der Compiler beschwert sich darüber, aber hey, das ist Code Golf. ;)
DLosc
4

Powershell, 139 134 132 126 Bytes

$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'}
Justin Dunlap
quelle
Sie können 5 Bytes einsparen, indem Sie $inputanstelle von $args[0](Frage sagt nicht, Argumente anstelle von stdin zu verwenden), und Sie können +$n=+$input;
unary
+ $ input schien nicht zu funktionieren - es wurde beanstandet, dass $ input ein Enumerator ist und keinen Additionsoperator hat. Jedoch $args[0]kann und sollte eine tatsächliche int sein, so dass wir zumindest die fallen [int].
Justin Dunlap
1
Also, das ist wirklich alt, aber man kann durch Bewegen der Eingabe in dem ein paar Bytes speichern ifund tauschen die elsefür eine ;exit- 122 Bytes -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

Ceylon, 322 307 300 282 278 260 Bytes

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"));}}

Das noch nicht golfene Original (unter der Annahme, dass negative Kuchen die Breite 3 anstelle von –2 · n + 1 haben):

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) + "-");
        }
    }
}

Dies enthält die Bedingungsliste in der if-Anweisung, wobei jede Bedingung einen Wert definiert, der in den folgenden Bedingungen und im Hauptteil verwendet werden kann. Da sie das haben exist, ist die Bedingung nur erfüllt, wenn die Werte nicht null sind, und der Compiler weiß daher, dass die Werte für den folgenden Code nicht null sind. (Wenn nichts eingegeben wird (EOF), gibt readline null zurück. Wenn parseInteger auf eine Nicht-Ganzzahl trifft, gibt es auch null zurück. Unser Programm führt dann nichts aus. Da das Verhalten für diese Fälle nicht definiert wurde, ist dies wahrscheinlich in Ordnung.)

Auch wir haben die <=>Betreiber, die auf die Karten - Comparable.compareMethode, und gibt ein ComparisonObjekt, dh eine von equal, smallerund larger. Der Compiler weiß, dass diese den ComparisonTyp erschöpfen , daher elsewird in unserer switchAnweisung keine Klausel benötigt .

Die repeatMethode der Klasse String macht das, was man erwarten würde. Es wird tatsächlich von der gleichnamigen Methode in Interface Iterable geerbt (da eine Zeichenfolge neben anderen Dingen nur eine Liste von Zeichen ist).

Wenn Sie meine Bezeichner durch Ein-Buchstaben-Bezeichner ersetzen und nicht benötigte Leerzeichen entfernen, erhalten Sie 322 Zeichen:

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)+"-");}}}

Wenn Sie die Reihe von printdurch explizites \ns (und ein einzelnes print) ersetzen, ergibt sich 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)+"-");}}}

Ich habe versucht , Alias-Import von repeatwie r, aber es hilft nicht (die Einfuhranmeldung 40 Zeichen hinzufügt, und wir können nur 25 sparen durch Austausch repeatmit r).

Was etwas hilft, ist die Verwendung n.signanstelle von n<=>0. Während diese beiden Ausdrücke die gleiche Textlänge haben, sie unterschiedliche Typen haben: die letztere vom Typ ist Comparisonbereits erwähnt (die die drei Werte hat smaller, largerund equal), hat der ehemalige eine Art Integer, mit den Werten -1, 1, 0... und da Integerhat viel mehr Werte brauchen wir auch eine elseKlausel. Dies ist 300 Zeichen lang:

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{}}}

Hier mit Leerzeichen:

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 {}
    }
}

Wir können etwas mehr sparen, indem wir unsere switch-Anweisung abbrechen und mit if282 Zeichen (= Bytes) arbeiten:

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)+"-");}}}

Formatiert:

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) + "-");
        }
    }
}

Wir können ein weiteres Byte sichern, indem wir die Fälle vertauschen, da >kürzer als ==. Ein weiteres "Ärgernis" ist das wiederholte repeat(n)- wir können eine lokale Funktion (eine Schließung, die sich nan den definierenden Block erinnert) mit einem kürzeren Namen definieren:

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

Dies ist eine kürzere Schreibweise:

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

Wir könnten functionanstelle des Rückgabetyps den Rückgabetyp verwenden, dies ist jedoch nicht kürzer. Das ergibt 278 Bytes:

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");}}}

Formatiert:

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");
        }
    }
}

Die Verwendung der Operatoren thenund elseanstelle der ifAnweisungen ermöglicht es uns, einige Aufrufe von print(und einige geschweifte Klammern) zu speichern :

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"));
    }
}

Dies sind nur 261 Bytes:

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"));}}

(Ich habe runanstelle von bfür den Funktionsnamen verwendet, da er auf diese Weise ausgeführt werden kann, ceylon runohne einen Funktionsnamen zu übergeben.)

Mein Github-Repository hat eine kommentierte Version davon .

Paŭlo Ebermann
quelle
3

Python 2, 158 Bytes


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
SimonPJ
quelle
3

Golflua, 113 Zeichen

\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"-"$

Probelauf:

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
---
~~~
---
Mann bei der Arbeit
quelle
3

Python 2, 150 Bytes

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"

In der Nähe des Pythons des Autors :(

Blex
quelle
3

Perl, 139 127 117 Bytes

Benötigt keine Optionen '-n' oder '-p'.

Revision 3 (danke an Dom Hastings unten):

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

Revision 2:

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

Revision 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'):(' $',' |','-','~','-')

Hier ist eine Version von Revision 3, in der die führenden Leerzeilen bei negativen Eingaben nicht vorhanden sind - 132 Byte.

$==<>;map{print$_ x(!$=||(/ /?$=:($=<1||$=)*2+1)).(/ /&&$=<0?'':$/)}!$=?'Congratulations on your new baby! :D':split 0,' $0 |0-0~0-'
Phillipo
quelle
Hallo, willkommen! Ich dachte, ich würde ein paar Möglichkeiten teilen, wie Sie ein paar Bytes sparen können! Sie können die Klammern fallen um , "Congratulations..."und wenn Sie ersetzen ' $',' |','-','~','-'mit split 0,' $0 |0-0~0-'Ihnen diese Klammern fallen können. Ein weiterer speichern ersetzt $n=<>;$n==0mit ($n=<>)==0. Sie ?1:könnten auch so sein, ||wie Sie sagen würden $n==0(was 1 ist) oder Ihre Berechnung. Ich hoffe, das hilft!
Dom Hastings
Hey, danke dafür. Diese Klammern sind gut, und es ||ist sehr hilfreich , mich an die Semantik zu erinnern - es hat mich $=an chompdie Eingabe erinnert, sodass keine spezifischen 0-Wert-Tests erforderlich sind. Ich bin mir nicht sicher, was Sie damit meinen $n=<>;$n==0- mein Golf hat das nicht, und wenn ich den Fall input = 0 als Eingabe in den behandele map{}(), bin ich mir nicht sicher, wie das zutreffen würde? Wie auch immer, unter Berücksichtigung Ihrer Kommentare und $=als meine Variable wurde dies auf 117 Parbyte herabgesetzt. Vielen Dank!
Phillipo
Überhaupt kein Problem! Freut mich geholfen zu haben! Was ich meine war, dass du $n=<>;am Anfang und dann $n==0am Ende map{}...hast, also denke ich, dass du den Scheck haben könntest, ($n=<>)==0aber wenn du ihn $=stattdessen verwendest, könntest du ihn möglicherweise mehr verkleinern! Ich vergesse immer was von $-oder $=kann nicht negativ sein, also wollte ich es nicht erwähnen und mich irren! :)
Dom Hastings
3

Pip, 74 + 1 = 75 Bytes

Nimmt das Alter als Befehlszeilenargument. Benötigt die -nFlagge.

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

Github-Repository für Pip

Das Befehlszeilenargument wird in gespeichert a. Wir teilen uns "-~-"in eine Liste von Zeichen auf und Ybinden sie in die Variable ein y. Der Rest des Programms ist ein großer ternärer Ausdruck:

  • a?
    Wenn aist wahr (dh nicht Null):
    • a<0?yX3
      Wenn anegativ, kehren Sie ymit jedem Element zurück, das dreimal wiederholt wird:["---";"~~~";"---"]
    • Sonst ( aist positiv):
      • (s.^"$|")Xa
        Split "$|"in eine Liste von Zeichen, prepend ein Raum ( s) zu jedem, und wiederholen Sie die jeweils resultierende Element amal
      • yX2*a+1
        Wiederholen Sie jedes Element von y 2*a+1Zeiten
      • AL
        Fügen Sie die beiden Listen an
  • Andernfalls ( aist Null) wird die Glückwunschzeichenfolge zurückgegeben

Am Ende des Programms -nsorgt das Flag dafür, dass Listen mit Elementen in separaten Zeilen gedruckt werden und somit einen ordnungsgemäß geschichteten Kuchen anzeigen.

Hier sind die Schritte für eine Eingabe von 2:

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

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

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

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

Alles Gute zum Geburtstag!

DLosc
quelle
2

Perl, 144 Bytes

143 Byte Code plus ein zusätzliches Byte für den -nSwitch zum Erfassen von stdin.

if($_!=0){print$_>0?" \$"x$_.$/." |"x$_.$/:""x($_=1);$_=$_*2+1;print"-"x$_.$/."~"x$_.$/."-"x$_;exit}print"Congratulations on your new baby! :D"
zimperliches Ossifrage
quelle
1
print"-~-"=~s!.!$&x($_*2+1).$/!gerfür den Kuchen?
Manatwork
Wenn Sie den Schalter auf ändern, -pfunktioniert dies auch:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
Manatwork
2

SpecBAS, 164

Verwendet die Apostrophverknüpfung, um in eine neue Zeile zu wechseln

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

Zum leichteren Lesen formatiert

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
Brian
quelle
2

Python 3, 169 Bytes

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))
moorecm
quelle
2

Julia, 143 Bytes

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")

Ziemlich einfach. 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
Alex A.
quelle
2

Lua, 299 Bytes

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
FabiF
quelle
1
Willkommen bei PPCG! Ihr Code scheint in seiner jetzigen Form einen Fehler zu geben ( attempt to compare string with number), aber das Hinzufügen 0+vor dem io.read()Beheben behebt ihn für mich. Sie können auch nicht wenige Bytes durch die Zuordnung speichern printund string.repzu Variablen mit einem Zeichen.
DLosc
@ DLosc danke gute Idee :) und ja, du hattest Recht mit dem Fehler sorry darüber
FabiF
2

Mathematica, 164 Bytes

Verpasste die kerzenlosen Kuchen für n <0 komplett und fügte weitere 15 Zeichen hinzu

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"
Martin John Hadley
quelle
1
Willkommen bei PPCG, diese Herausforderung wird als Codegolf bezeichnet, bei dem Sie versuchen, Ihren Code so kurz wie möglich zu halten. Dies kann erreicht werden, indem unnötige Leerzeichen entfernt und Variablennamen gekürzt werden.
Danke @BetaDecay, ich habe gerade eine schnelle Version raufgebracht. Prost: D
Martin John Hadley
Kein Problem. Sieht gut aus :)
2

pb , 567 bytes

^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]

Ich bereue es.

Es gibt einige Möglichkeiten, wie dies besser sein könnte. Wenn ich zum Beispiel feststelle, dass die Eingabe negativ ist, gehe ich zu der Schlussfolgerung über, um welche negative Zahl es sich handelt. Dies ist unnötig, und vielleicht werde ich eines Tages wieder in diesen Code eintauchen, um ihn zu stoppen.

Versuchen Sie nicht, dies im "Watch" -Modus von pbi auszuführen. Wenn Sie ein Negativ eingeben, stürzt es beim Drucken ab chr(-1).

Hier ist die erläuterte Version, in der ich mir beim Schreiben des Programms Notizen gemacht habe. Wenn Sie besser verstehen möchten, wie es funktioniert ... viel Glück und lassen Sie es mich wissen, wenn Sie es herausfinden.

# 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]
untergrundbahn
quelle
2

ScriptCS (C # -Skript), 221 Byte

Das wird natürlich keine Preise gewinnen, aber ...

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)))))
Justin Dunlap
quelle