É meu aniversário: D


112

Introdução

O ano passado foi meu aniversário (realmente!) E, infelizmente, tive que organizar minha própria festa. Bem, agora você sabe, você não poderia pelo menos fazer o bolo?

Desafio

Dado um número inteiro ncomo entrada, escreva um programa completo para produzir um bolo de aniversário com nvelas acesas.

Resultado

Um pedaço de bolo com uma vela acesa é:

 $
 |
---
~~~
---

E um pedaço de bolo com três velas é:

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

Tenho certeza que você pode resolver isso a partir disso

No entanto , para entrada0, você deve gerar o seguinte:

Congratulations on your new baby! :D

Para entrada menor que 0, você deve produzir um bolo sem velas:

---
~~~
---

Não é permitido que nada seja enviado para STDERR.

Novas linhas e espaços à direita são permitidos.

Ganhando

O menor código em bytes vence.

Entre os melhores

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
Feliz Aniversário!
Dennis

11
o espaço em branco à esquerda (por exemplo, duas linhas novas) é permitido para o bolo sem velas?
Level River St

2
@steveverrill Yes

2
@ PaŭloEbermann Um bolo de 3 larguras

4
@jvriesem Não. É um código para snippet.
sigod 11/09/15

Respostas:


36

Pitão, 73 72 71 69 67 bytes

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

Experimente online .

A saída para n <0 contém 2 novas linhas principais, conforme permitido nos comentários . Para se livrar deles, use

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

O menor código, é claro, parece ser menos legível por humanos.
Sathish Sanjeevi

WTF é isso ??? LOL
Starx

18

CJam, 76 75 bytes

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

Experimente on-line no intérprete CJam .

Como funciona

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 bytes

Revisão 1 (120 bytes)

18 bytes economizados graças ao manatwork

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

Revisão 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]

Para números positivos: itera através de uma string correspondente a cada linha do bolo. Elas são usadas como cadeias de pad para justificar à direita a cadeia vazia com o comprimento 2 * n + 1. Isso evita complicações com a impressão de um número ímpar de caracteres, quando a repetição natural é igual ao tom das velas (ou seja, 2 caracteres.) n>0&&É necessária para evitar a saída de uma única coluna em caso de entrada zero.

Para todos os números: " n<=>0" localiza o sinal da entrada. A mensagem do bebê é emitida para n = 0 e uma sequência vazia para n positivo (como a saída correta já foi fornecida acima). Para n negativo, Ruby interpreta -1 como significando o último elemento da matriz e gera as velas sem velas bolo.


11
Não há muitos puts? n=gets.to_i puts ['Congratulations on your new baby! :D',%w{\ $ \ | - ~ -}.map{|e|''.rjust 2*n+1,e},'--- ~~~ ---'][n<=>0]
manatwork

11
Mais um: ''.rjuste.ljust.
manatwork

@manatwork obrigado, eu deveria ter percebido isso, mas fiz isso muito rápido. Eu não sabia sobre o espaço de barra invertida com% w. E e.just: muito esperto.
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
Estou aprendendo muito sobre escrever parâmetros lá. Um brilhante
Tensibai

10

R, 228 226 220 221 Bytes


A última edição para corrigir o bolo sem velas foi tão ampla quanto a positiva em casos negativos, obrigado @CathG e @jbaums pelo 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")}

11
É possível salvar alguns bytes: <-pode ser =e você pode usar a=b='-~-'.
jbaums

Ho, graças @jbaums esquecer a primeira = e didn' tthough da dupla atribuição
Tensibai

Você tem um problema de suporte em algum lugar, eu ficoError: unexpected '}'
flodel

@flodel corrigido. Problema de copiar / colar
Tensibai

10

JavaScript ES6, 136

Usando alerta para saída - fonte proporcional incorreta e o resultado é feio. No trecho de código abaixo, o alerta é redirecionado para o corpo do trecho, dando um resultado melhor.
A nova linha dentro dos backticks é significativa e contada.

Teste a execução do snippet no 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>

Menos golfe

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

Tente isso $('div pre code')[2].innerHTML;)
Vasu Adari

7

R, 279 bytes

Versão interativa (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=""))}
}

Versão não interativa (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=""))}
}

7

MATLAB / Oitava, 194 198 195 189 189 171 167 bytes

Feliz aniversário para você Beta Decay! :)

Obrigado ao HamtaroWarrior por remover 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)]);

Execuções de amostra

Coloquei isso em um arquivo de script chamado happy_birthday.me o executei algumas vezes no prompt de comando. Observe que, quando você digita um número negativo, há dois retornos de carro principais, mas isso é permitido neste desafio:

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

Código com espaçamento e explicações

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

A parte exibida no final é provavelmente a parte mais ofuscada do código. Isso exibirá uma matriz de caracteres de 5 linhas, na qual as duas primeiras linhas consistem nas velas e as três últimas linhas consistem na base do bolo.

A base para a metade superior da exibição são dois espaços em uma coluna seguidos por outros dois espaços em outra coluna no caso em que a idade é negativa ou a $,-em uma coluna seguida por dois espaços em outra coluna. Esta é uma matriz de 2 x 2 caracteres. A base para a metade inferior da tela é um vetor de coluna única, -,~,-que é uma matriz de caracteres 3 x 1.

O comando display aborda primeiro as duas primeiras linhas do bolo colocando dois espaços na primeira coluna, pares seguidos de uma coluna de $,-ou coluna de espaços se nfor negativo, que é alterado para n=1, e outra coluna de dois espaços repetida por um total de nvezes. As próximas três linhas simplesmente replicam o -,$,-vetor da coluna por 2*n + 1vezes para alinhar as velas com a base, completando assim a imagem.

Experimente online!

Você pode tentar isso on-line usando o compilador Octave da IDEOne: http://ideone.com/4qXDdJ - no entanto, há um pequeno erro ao ler os valores da entrada padrão. Como tal, o script é modificado levemente onde você deve alterar o valor nno início do código. Bifurque uma nova versão do script e altere-a para qualquer valor inteiro que seja adequado para você, para ver como é a saída.


11
Pena que você não pode salvar o ponto ' '.'!
Luis Mendo

11
@LuisMendo - Eu sei ... embora eu tenho certeza que você não se opor à utilização da transposição dessa forma :)!
rayryeng

11
Hahaha Me disseram uma vez aqui que este site é para abusar do idioma. E eu sigo essa regra fielmente!
Luis Mendo

11
@LuisMendo - Eu realmente queria me livrar do ponto ... mas não consegui, porque o MATLAB interpreta isso como uma única citação na string :(. Teria me poupado alguns bytes ... mas depois de muitas iterações, isso foi o melhor que eu poderia vir acima com.
rayryeng

@LuisMendo - conseguiu diminuir para 171!
rayryeng 9/09/15

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

Para ver a saída na fonte de espaço mono, substitua 'alert' por 'console.log'


Bem-vindo ao PPCG! :)

2
Infelizmente, isso também exibe a mensagem de parabéns pela entrada negativa.
manatwork

@BetaDecay tnx :-)
Nainemom

Direito de Manatwork: / Eu não sei o suficiente JS para ajudar

@manatwork sim, você está certo! eu entendi errado!
Nainemom 08/09

5

Moonscript, 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'~'

3
Bem-vindo à Programação de Puzzles e Code Golf!
Dennis


4

JavaScript ES6, 154 caracteres

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

E mais um (154 também)

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

Para ver a saída na fonte monoespaçada (e mover o eutut para o console), use

alert=x=>console.log(x)

4

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

O mouse claramente não é a escolha ideal para esta tarefa, mas foi divertido.

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
@

A pilha pode conter apenas números inteiros. !'tira um número inteiro da pilha e imprime o caractere ASCII com esse código.


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

Use-o como:

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

Experimente on-line: link (contém algum código de exibição personalizado, para que tudo pareça tão bom ...)

Opa, quase esqueci! Feliz aniversário, @BetaDecay!


4

C, 392 bytes

(falha de segmentação conhecida se nenhum argumento for fornecido)

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

Não minificado e copiosamente espaçado

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

Sem o clichê C, o # define e o corpo principal total de 247.
Funmungus

Bem-vindo ao PPCG! Esta é uma resposta muito boa - eu gosto especialmente do abuso de macro A. Eu vejo mais alguns espaços que podem ser removidos e você pode se livrar iusando ca variável loop. Além disso, pelo menos com o gcc, incluindo stdio.h ou a especificação do tipo de retorno main (), não é necessário: o compilador reclama disso, mas ei, isso é código de golfe. ;)
DLosc 10/09/15

4

Conector de força, 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'}

Você pode salvar 5 bytes usando $inputem vez de $args[0](questão não diz para usar argumentos em vez de stdin), e você pode usar unário +para converter para um número:$n=+$input;
briantist

+ $ input não pareceu funcionar - queixou-se que $ input é um enumerador e não possui um operador de adição. No entanto, $args[0]pode e deve ser um int real, permitindo pelo menos descartar o [int].
23615 Justin Dunlap #

11
Então, isso é muito velho, mas você pode salvar um par de bytes movendo a entrada no ife trocando o elsepara um ;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

Ceilão, 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"));}}

O original ainda não jogado no golfe (supondo que bolos negativos tenham largura 3 em vez 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) + "-");
        }
    }
}

Isso apresenta a lista de condições na instrução if, cada condição definindo um valor utilizável nas seguintes condições e no corpo. Porque eles têm o exist, a condição só é atendida quando os valores não são nulos e, portanto, o compilador sabe que os valores não são nulos para o código a seguir. (Se nada for inserido (EOF), o readline retornará nulo. Se parseInteger atingir um não inteiro, ele também retornará nulo. Nosso programa não fará nada. Como o comportamento desses casos não foi definido, acho que está tudo bem.)

Também temos o <=>operador, que mapeia para o Comparable.comparemétodo, e retorna um Comparisonobjeto, ou seja, um de equal, smallere larger. O compilador sabe que aqueles esgotam o Comparisontipo, portanto, nenhuma elsecláusula é necessária em nossa switchdeclaração.

O repeatmétodo da classe String faz o que seria de esperar. Na verdade, é herdado do método com o mesmo nome na interface Iterable (como uma string é, além de outras coisas, apenas uma lista de caracteres).

Substituir meus identificadores por caracteres de uma letra e remover espaços em branco desnecessários fornece 322 caracteres:

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

Substituir a série de printpor explícito \ns (e um único print) reduz para 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)+"-");}}}

Tentei a importação de alias de repeatas r, mas isso não ajuda (a declaração de importação adiciona 40 caracteres e só podemos salvar 25 substituindo repeatpor r).

O que ajuda um pouco, é usar em n.signvez de n<=>0. Enquanto estas duas expressões têm o mesmo comprimento textual, eles têm tipos diferentes: o último é do tipo Comparisonmencionado antes (que tem três valores smaller, largere equal), o anterior tem o tipo Integer, com os valores -1, 1, 0... e porque Integertem muito mais valores, também precisamos de uma elsecláusula. Possui 300 caracteres:

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

Aqui com espaço em branco:

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

Podemos nos proteger um pouco mais, renunciando à nossa instrução switch e usando if, chegando a 282 caracteres (= bytes):

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

Formatado:

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

Podemos proteger outro byte trocando os casos, pois >é menor que ==. Outro "aborrecimento" é o repetido repeat(n)- podemos definir uma função local (um fechamento, ele se lembra ndo bloco de definição) com um nome mais curto:

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

Esta é uma maneira mais curta de escrever isso:

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

Poderíamos usar em functionvez do tipo de retorno para inferência de tipo, mas isso não é mais curto. Isso nos dá 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");}}}

Formatado:

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

Na verdade, usar os operadores thene elseem vez das ifinstruções permite salvar algumas chamadas de print(e algumas chaves):

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

São apenas 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"));}}

(Eu usei em runvez do bnome da função, pois dessa forma ele pode ser executado ceylon runsem passar o nome da função.)

Meu repositório do Github tem uma versão comentada disso .


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

3

golflua, 113 caracteres

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

Exemplo de execução:

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

Perto do Python do autor :(


3

Perl, 139 127 117 bytes

Não requer as opções '-n' ou '-p'.

Revisão 3 (com agradecimentos a Dom Hastings abaixo):

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

Revisão 2:

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

Revisão 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'):(' $',' |','-','~','-')

Aqui está uma versão da revisão 3 que não possui as principais novas linhas em branco na entrada negativa - 132 bytes.

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

Olá, seja bem-vindo! Pensei em compartilhar algumas maneiras de salvar alguns bytes! Você pode deixar cair os suportes em torno "Congratulations..."e se você trocar ' $',' |','-','~','-'com split 0,' $0 |0-0~0-'você pode soltar os suportes também. Outra gravação está sendo substituída $n=<>;$n==0por ($n=<>)==0. Também ?1:pode ser o ||que você diria $n==0(que é 1) ou o seu cálculo. Espero que ajude!
Dom Hastings

Olá, obrigado por isso. Esses colchetes são bons, e me lembrar a semântica de ||é muito útil - lembrou-me $=basicamente chompda entrada, eliminando a exigência de testes de valor 0 específicos. Não sei ao certo o que você quer dizer com $n=<>;$n==0- meu golfe não tem isso e, como lida com o caso input = 0 como entrada no map{}(), não tenho certeza de como isso se aplicaria? De qualquer forma, tendo seus comentários e usando $=como minha variável, isso foi reduzido em 117 parbytes. Muito obrigado!
Phillipo 9/09/15

Não tem problema nenhum! Fico feliz em ter ajudado! O que quero dizer é que você tem $n=<>;no início e depois $n==0no final da página, map{}...então eu acho que você poderia fazer a verificação, ($n=<>)==0mas se você estiver usando, $=poderá diminuir mais! Eu sempre esqueço qual $-ou $=não pode ser negativo, então eu não quis mencionar isso e estar errado! :)
Dom Hastings

3

Pip, 74 + 1 = 75 bytes

Toma a idade como um argumento de linha de comando. Requer a -nbandeira.

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

Repositório do Github para Pip

O argumento de linha de comando é armazenado no a. Dividimos "-~-"em uma lista de caracteres e Ycolocamos na variável y. O restante do programa é uma grande expressão ternária:

  • a?
    Se afor verdade (ou seja, não zero):
    • a<0?yX3
      Se afor negativo, retorne ycom cada elemento repetido 3 vezes:["---";"~~~";"---"]
    • Senão ( aé positivo):
      • (s.^"$|")Xa
        Divida "$|"em uma lista de caracteres, acrescente um espaço ( s) a cada um e repita os atempos de cada elemento resultante
      • yX2*a+1
        Repita cada elemento de y 2*a+1vezes
      • AL
        Anexe as duas listas
  • Senão ( aé zero), retorne a sequência de parabéns

No final do programa, a -nbandeira garante que as listas sejam impressas com elementos em linhas separadas, exibindo um bolo em camadas adequadamente.

Aqui estão as etapas para uma entrada de 2:

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

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

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

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

Feliz Aniversário!


2

Perl, 144 bytes

143 bytes de código, mais um byte extra para o -nswitch capturar stdin.

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

11
print"-~-"=~s!.!$&x($_*2+1).$/!gerpara o bolo?
manatwork

Se você mudar o interruptor para -peste também irá trabalhar:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
manatwork

2

SpecBAS, 164

Usa o atalho do apóstrofo para mover para a nova linha

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

Formatado para facilitar a leitura

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

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

Bem direto. 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 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

11
Bem-vindo ao PPCG! Seu código, como está, parece dar um erro ( attempt to compare string with number), mas adicionar 0+antes o io.read()corrige para mim. Você também pode salvar alguns bytes atribuindo printe string.repa variáveis ​​de caractere único.
DLosc 9/09/15

@DLosc graças boa idéia :) e sim u estava certo com o erro muito por isso
FabiF

2

Mathematica, 164 bytes

Perdeu completamente os bolos sem velas por n <0, adicionando mais 15 caracteres

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"

11
Bem-vindo ao PPCG, esse desafio é conhecido como código de golfe, onde você tenta e torna seu código o mais curto possível. Isso pode ser feito removendo espaços em branco desnecessários e reduzindo nomes de variáveis.

Obrigado @BetaDecay Eu estava recebendo uma versão rápida .. minimizando agora. Cheers: D
Martin John Hadley

Sem problemas. Parece bom :)

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]

Eu tenho alguns arrependimentos.

Existem algumas maneiras pelas quais isso poderia ser melhor. Por exemplo, ao descobrir que a entrada é negativa, prossigo para deduzir qual número negativo é. Isso é desnecessário, e talvez um dia eu volte a esse código para detê-lo.

Não tente executar isso no modo de "observação" do pbi, se você inserir um negativo, ele trava ao tentar imprimir chr(-1).

Aqui está a versão explicada, onde tomei notas enquanto escrevia o programa. Se você quiser entender melhor como isso funciona ... boa sorte, e deixe-me saber se você descobrir.

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

Obviamente, isso não vai ganhar nenhum prêmio, mas ...

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)))))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.