È il mio compleanno: D


112

introduzione

L'anno scorso è stato il mio compleanno (davvero!) E purtroppo ho dovuto organizzare la mia festa. Bene, ora lo sai, non potresti almeno fare la torta?

Sfida

Dato un numero intero ncome input, scrivi un programma completo per produrre una torta di compleanno con le ncandele accese.

Produzione

Un pezzo di torta con una candela accesa è:

 $
 |
---
~~~
---

E un pezzo di torta con tre candele accese è:

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

Sono sicuro che puoi risolverlo

Tuttavia , per l'input0, è necessario produrre quanto segue:

Congratulations on your new baby! :D

Per un input inferiore a 0, dovresti produrre una torta senza candele:

---
~~~
---

Non è consentito l'output su STDERR.

Sono consentiti trascinamento di nuove righe e spazi.

vincente

Vince il codice più breve in byte.

Classifica

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
Buon compleanno!
Dennis,

1
è consentito lo spazio bianco principale (ad esempio 2 nuove righe) per la torta senza candele?
Level River St

2
@steveverrill Sì

2
@ PaŭloEbermann Una torta di 3 larghezze

4
@jvriesem No. È il codice per lo snippet.
sigod,

Risposte:


36

Pyth, 73 72 71 69 67 byte

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

Provalo online .

L'output per n <0 contiene 2 nuove righe principali, come consentito nei commenti . Per sbarazzartene, usa

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

Il codice più piccolo, ovviamente, sembra essere il meno leggibile dall'uomo.
Sathish Sanjeevi,

Cos'e 'questo??? LOL
Starx,

18

CJam, 76 75 byte

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

Provalo online nell'interprete CJam .

Come funziona

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

Rubino, 120 byte

Revisione 1 (120 byte)

18 byte salvati grazie all'opera d'arte

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

Revisione 0 (138 byte)

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

Per numeri positivi: questo scorre attraverso una stringa corrispondente a ciascuna riga della torta. Questi sono usati come stringhe di pad per giustificare a destra la stringa vuota di lunghezza 2 * n + 1. Questo evita qualsiasi complicazione con la necessità di stampare un numero dispari di caratteri, quando la ripetizione naturale è uguale al passo delle candele (cioè 2 caratteri.) n>0&&È necessario per evitare di emettere una singola colonna in caso di input zero.

Per tutti i numeri: " n<=>0" trova il segno dell'input. Il messaggio bambino viene emesso per n = 0 e una stringa vuota per n positivo (poiché l'output corretto è già stato fornito in precedenza.) Per n negativo, Ruby interpreta -1 come significato l'ultimo elemento dell'array e genera il candeleless torta.


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

1
Ancora uno: ''.rjuste.ljust.
arte

@manatwork grazie, avrei dovuto individuarlo, ma l'ho fatto molto velocemente. Non sapevo dello spazio di barra rovesciata con% w. E e.just: molto intelligente.
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
Sto imparando molto sui parametri di scrittura lì. Uno brillante
Tensibai,

10

R, 228 226 220 221 byte


L'ultima modifica per correggere la torta senza candele, è stata ampia come quella positiva in casi negativi, grazie @CathG e @jbaums per il 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")}

1
È possibile salvare un paio di byte: <-può essere =e si può usare a=b='-~-'.
jbaums,

Ciao, grazie @jbaums dimentica il primo = e non ha pensato alla doppia assegnazione
Tensibai,

Hai un problema con la parentesi da qualche parte, capiscoError: unexpected '}'
flodel

@flodel corretto. Problema copia / incolla
Tensibai,

10

JavaScript ES6, 136

Utilizzo dell'avviso per l'output: carattere proporzionale errato e il risultato è brutto. Nello snippet sottostante l'avviso viene reindirizzato al corpo snippato, fornendo un risultato migliore.
La nuova riga all'interno dei backtick è significativa e contata.

Prova a eseguire lo 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>

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

Prova questo $('div pre code')[2].innerHTML;)
Vasu Adari l'

7

R, 279 byte

Versione interattiva (286 byte):

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

Versione non interattiva (279 byte):

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 167 byte

Tanti auguri a te Decadimento Beta! :)

Grazie a HamtaroWarrior per la rasatura di 4 byte!


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

Esecuzioni campione

L'ho inserito in un file di script chiamato happy_birthday.m, quindi l'ho eseguito alcune volte nel prompt dei comandi. Tieni presente che quando inserisci un numero negativo, ci sono due principali ritorni a capo, ma ciò è consentito in questa sfida:

>> 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
 $ $ $ $ $ 
 | | | | | 
-----------
~~~~~~~~~~~
-----------

Codice con spaziatura e spiegazioni

% 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 parte visualizzata alla fine è probabilmente la parte più offuscata del codice. Questo mostrerà una matrice di caratteri a 5 righe in cui le prime due file sono costituite dalle candele e le ultime tre file sono costituite dalla base della torta.

La base per la metà superiore del display è costituita da due spazi in una colonna seguiti da altri due spazi in un'altra colonna nel caso in cui l'età sia negativa o da una $,-in una colonna seguita da due spazi in un'altra colonna. Questa è una matrice di 2 x 2 caratteri. La base per la metà inferiore del display è un vettore a colonna singola di -,~,-cui è una matrice di caratteri 3 x 1.

Il comando display affronta prima le prime due file della torta posizionando due spazi nella prima colonna, seguito da coppie di una colonna $,-o di una colonna di spazi se nè negativa, che viene cambiata in n=1, e un'altra colonna di due spazi ripetuta per un totale di nvolte. Le tre file successive replicano semplicemente il -,$,-vettore della colonna per 2*n + 1volte per allineare le candele insieme alla base, completando così l'immagine.

Provalo online!

Puoi provarlo online usando il compilatore Octave di IDEOne: http://ideone.com/4qXDdJ - tuttavia, c'è un leggero bug durante la lettura di valori dallo standard input. Pertanto, lo script viene leggermente modificato nel punto in cui è necessario modificare il valore nall'inizio del codice. Fork una nuova versione dello script e cambiarlo in qualsiasi valore intero adatto a te per vedere come appare l'output.


1
Peccato che non riesci a salvare il punto ' '.'!
Luis Mendo,

1
@LuisMendo - Lo so! ... anche se sono sicuro che non ti
opporrai

1
Hahaha. Una volta mi è stato detto che questo sito è per abuso della lingua. E seguo fedelmente questa regola!
Luis Mendo,

1
@LuisMendo - Volevo davvero sbarazzarmi del punto ... ma non potevo perché MATLAB lo interpreta come una singola citazione nella stringa :(. Mi avrebbe salvato qualche byte ... ma dopo molte iterazioni, questo era il meglio che ho potuto
inventare

@LuisMendo - riuscito a ridurlo a 171!
Rayryeng,

6

JavaScript, 143 153 byte

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

Per vedere l'output nel carattere mono spazio sostituire 'alert' con 'console.log'


Benvenuti in PPCG! :)

2
Purtroppo questo mostra anche il messaggio di congratulazioni per un input negativo.
arte

@BetaDecay tnx :-)
Nainemom

Diritto di Manatwork: / Io non ne so abbastanza per aiutare JS

@manatwork sì hai ragione! ho frainteso!
Nainemom,

5

Moonscript, 141 byte

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
Benvenuti in Puzzle di programmazione e Code Golf!
Dennis,


4

JavaScript ES6, 154 caratteri

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

E un altro (anche 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")

Per vedere l'output in carattere monospace (e spostare l'output sulla console), utilizzare

alert=x=>console.log(x)

4

Mouse , 164 161 byte

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

Il mouse non è chiaramente la scelta ideale per questo compito, ma è stato divertente.

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
@

Lo stack può contenere solo numeri interi. !'toglie un numero intero dallo stack e stampa il carattere ASCII con quel codice.


4

CoffeeScript, 160 byte

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

Usalo come:

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

Provalo online: link (contiene un codice di visualizzazione personalizzato, quindi tutto sembra così bello ...)

Ops, quasi dimenticato! Buon compleanno, @BetaDecay!


4

C, 392 byte

(noto errore di segmentazione se non viene fornito alcun argomento)

#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 miniato e abbondantemente distanziato

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

Senza C caldaia il # definisce e il corpo principale totale 247.
Funmungus

Benvenuti in PPCG! Questa è davvero una buona risposta, mi piace soprattutto l'abuso di macro A. Vedo un altro paio di spazi che potrebbero essere rimossi e puoi liberarti iusando invece cper la variabile loop. Inoltre, almeno con gcc, incluso stdio.h o specificando il tipo di ritorno di main () non è necessario: il compilatore si lamenta, ma ehi, questo è il codice golf. ;)
DLosc,

4

Powershell, 139 134 132 126 byte

$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'}

Puoi salvare 5 byte usando $inputinvece di $args[0](la domanda non dice di usare argomenti invece di stdin), e puoi usare unario +per convertire in un numero:$n=+$input;
briantist

+ $ input non sembra funzionare - si è lamentato del fatto che $ input è un enumeratore e non ha un operatore di addizione. Tuttavia, $args[0]può e dovrebbe essere un vero e proprio int, permettendoci di eliminare almeno il [int].
Justin Dunlap,

1
Quindi, questo è davvero vecchio, ma puoi salvare un paio di byte spostando l'input in ife scambiando il elsecon un ;exit- 122 byte -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 byte

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'originale non ancora giocato a golf (supponendo che le torte negative abbiano una larghezza 3 invece di –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) + "-");
        }
    }
}

Questo include l'elenco delle condizioni nell'istruzione if, ciascuna condizione che definisce un valore utilizzabile nelle seguenti condizioni e nel corpo. Poiché hanno il exist, la condizione è soddisfatta solo quando i valori non sono nulli, e quindi il compilatore sa che i valori non sono nulli per il codice seguente. (Se non viene inserito nulla (EOF), readline restituisce null. Se parseInteger rileva un valore non intero, restituisce anche null. Il nostro programma quindi non esegue alcuna operazione. Poiché il comportamento per questi casi non è stato definito, immagino che vada bene.)

Inoltre abbiamo l' <=>operatore, che si associa al Comparable.comparemetodo e restituisce un Comparisonoggetto, ovvero uno di equal, smallere larger. Il compilatore sa che quelli esauriscono il Comparisontipo, quindi non elseè necessaria alcuna clausola nella nostra switchdichiarazione.

Il repeatmetodo della classe String fa quello che ci si aspetterebbe. In realtà è ereditato dallo stesso metodo nell'interfaccia Iterable (poiché una stringa è, accanto ad altre cose, solo un elenco di caratteri).

Sostituendo i miei identificatori con quelli di una lettera e rimuovendo gli spazi bianchi non necessari, si ottengono 322 caratteri:

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

Sostituire la serie di printcon espliciti \ns (e un singolo print) lo porta a 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)+"-");}}}

Ho provato a importare alias di repeatas r, ma non aiuta (la dichiarazione di importazione aggiunge 40 caratteri e possiamo solo salvarne 25 sostituendoli repeatcon r).

Ciò che aiuta leggermente, sta usando n.signinvece di n<=>0. Mentre questi due espressioni hanno la stessa lunghezza testuale, hanno diversi tipi: che quest'ultima sia di tipo Comparisonaccennato prima (che ha i tre valori smaller, largere equal), il primo si ha tipo Integer, con i valori -1, 1, 0... e poiché Integerha molti più valori, abbiamo anche bisogno di una elseclausola. Sono lunghi 300 caratteri:

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

Qui con spazi bianchi:

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

Possiamo salvarci un po 'di più dimettendoci dalla nostra istruzione switch e usando if, arrivando a 282 caratteri (= byte):

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

formattato:

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

Possiamo salvare un altro byte scambiando i casi, poiché >è più breve di ==. Un altro "fastidio" è il ripetuto repeat(n): possiamo definire una funzione locale (una chiusura, ricorda ndal blocco di definizione) con un nome più breve:

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

Questo è un modo più breve di scrivere questo:

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

Potremmo usare al functionposto del tipo restituito per l'inferenza del tipo, ma questo non è più breve. Questo ci dà 278 byte:

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

formattato:

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

In realtà, l'uso degli operatori thene elseanziché delle ifistruzioni ci consente di salvare alcune chiamate di print(e alcune parentesi graffe):

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

Sono solo 261 byte:

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

(Ho usato runinvece bper il nome della funzione perché in questo modo può essere eseguito ceylon runsenza passare un nome di funzione.)

Il mio repository Github ne ha una versione commentata .


3

Python 2, 158 byte


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 caratteri

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

Esecuzione di esempio:

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 byte

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"

Vicino a Python dell'autore :(


3

Perl, 139 127 117 byte

Non richiede le opzioni '-n' o '-p'.

Revisione 3 (grazie a Dom Hastings di seguito):

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

Revisione 2:

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

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

Ecco una versione della revisione 3 che non ha le nuove righe vuote iniziali sull'input negativo - 132 byte.

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

Ehi, benvenuto! Ho pensato di condividere un paio di modi in cui è possibile salvare alcuni byte! È possibile rilasciare le parentesi quadre "Congratulations..."e se si sostituisce ' $',' |','-','~','-'con split 0,' $0 |0-0~0-'è possibile rilasciare anche quelle parentesi. Un altro salvataggio sta sostituendo $n=<>;$n==0con ($n=<>)==0. Anche il tuo ?1:potrebbe essere ||come diresti $n==0(che è 1) o il tuo calcolo. Spero che aiuti!
Dom Hastings,

Ehi, grazie per quello. Quelle parentesi sono buone e ricordarmi della semantica di ||è molto utile - mi ha ricordato $=sostanzialmente chompl'input, eliminando il requisito per specifici test di valore 0. Non sono sicuro di cosa intendi con $n=<>;$n==0: il mio golf non ha questo, e dato che gestisco il caso input = 0 come input in map{}(), non sono sicuro di come questo si applicherebbe? Ad ogni modo, prendendo i tuoi commenti e usando $=come mia variabile, questo è stato ridotto a 117 parbyte. Grazie mille!
phillipo,

Nessun problema! Sono contento di aver aiutato! Quello che voglio dire è che hai $n=<>;all'inizio e poi $n==0sul retro, map{}...quindi penso che potresti avere il controllo come, ($n=<>)==0ma se stai usando $=invece potresti essere in grado di ridurlo di più! Dimentico sempre quale $-o $=non può essere negativo, quindi non volevo menzionarlo e sbagliarmi! :)
Dom Hastings,

3

Pip, 74 + 1 = 75 byte

Prende l'età come argomento della riga di comando. Richiede la -nbandiera.

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

Repository Github per Pip

L'argomento della riga di comando è archiviato in a. Ci dividiamo "-~-"in un elenco di caratteri e lo Yinseriamo nella variabile y. Il resto del programma è una grande espressione ternaria:

  • a?
    Se aè vero (cioè non zero):
    • a<0?yX3
      Se aè negativo, ritorna ycon ogni elemento ripetuto 3 volte:["---";"~~~";"---"]
    • Altrimenti ( aè positivo):
      • (s.^"$|")Xa
        Dividi "$|"in un elenco di caratteri, anteponi uno spazio ( s) a ciascuno e ripeti ogni elemento risultante avolte
      • yX2*a+1
        Ripeti ogni elemento dei y 2*a+1tempi
      • AL
        Aggiungi le due liste
  • Altrimenti ( aè zero), restituisce la stringa di congratulazioni

Alla fine del programma, la -nbandiera assicura che gli elenchi vengano stampati con elementi su linee separate, mostrando così una torta adeguatamente stratificata.

Ecco i passaggi per un input di 2:

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

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

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

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

Buon compleanno!


2

Perl, 144 byte

143 byte di codice, più un byte aggiuntivo per lo -nswitch per acquisire lo 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).$/!gerper la torta?
arte

Se cambi l'interruttore su -pquesto funzionerà anche:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
manatwork

2

SpecBAS, 164

Utilizza la scorciatoia dell'apostrofo per passare a una nuova riga

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

Formattato per una lettura più semplice

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 byte

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 byte

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

Abbastanza diretto. 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 byte

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
Benvenuti in PPCG! Il tuo codice così com'è sembra dare un errore ( attempt to compare string with number), ma l'aggiunta 0+prima di io.read()risolverlo per me. Puoi anche salvare parecchi byte assegnando printe string.repin variabili a carattere singolo.
DLosc,

@DLosc grazie buona idea :) e sì, avevi ragione con l'errore, mi dispiace per questo
FabiF

2

Mathematica, 164 byte

Mancavano completamente le torte senza candele per n <0, aggiungendo altri 15 caratteri

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
Benvenuto in PPCG, questa sfida è conosciuta come code golf, dove cerchi di rendere il tuo codice il più breve possibile. Questo può essere fatto rimuovendo gli spazi bianchi non necessari e accorciando i nomi delle variabili.

Grazie @BetaDecay Mi stavo procurando una versione veloce .. minimizzando ora. Cin cin: D
Martin John Hadley,

Nessun problema. Sembra buono :)

2

pb , 567 byte

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

Ho dei rimpianti.

Ci sono alcuni modi in cui questo potrebbe essere migliore. Ad esempio, dopo aver capito che l'ingresso è negativo, procedo quindi a dedurre quale numero negativo sia. Questo non è necessario e forse un giorno mi immergerò di nuovo in questo codice per fermarlo.

Non tentare di eseguirlo nella modalità "watch" di pbi, se si inserisce un negativo si bloccherà quando si tenta di stampare chr(-1).

Ecco la versione della versione spiegata in cui ho preso appunti durante la scrittura del programma. Se vuoi capire meglio come funziona ... buona fortuna e fammi sapere se lo capisci.

# 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 byte

Ovviamente questo non vincerà alcun premio, ma ...

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)))))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.