Es mi cumpleaños: D

112

Introducción

El año pasado fue mi cumpleaños (¡en serio!) Y lamentablemente tuve que organizar mi propia fiesta. Bueno, ya sabes, ¿no podrías al menos hacer el pastel?

Desafío

Dado un número entero ncomo entrada, escriba un programa completo para generar un pastel de cumpleaños con nvelas encendidas.

Salida

Un pedazo de pastel con una vela encendida es:

 $
 |
---
~~~
---

Y un pedazo de pastel con tres velas encendidas es:

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

Estoy seguro de que puedes resolverlo a partir de eso

Sin embargo , para la entrada0, debe generar lo siguiente:

Congratulations on your new baby! :D

Para una entrada inferior a 0, debe generar un pastel sin velas:

---
~~~
---

No se permite que nada se envíe a STDERR.

Se permiten nuevas líneas y espacios al final.

Victorioso

El código más corto en bytes gana.

Tabla de clasificación

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>


fuente
161
¡Feliz cumpleaños!
Dennis
1
¿Se permite el espacio en blanco (por ejemplo, 2 líneas nuevas) para el pastel sin velas?
Level River St
2
@steveverrill Sí
2
@ PaŭloEbermann Un pastel de 3 anchos
44
@jvriesem No. Es un código para un fragmento.
sigod

Respuestas:

36

Pyth, 73 72 71 69 67 bytes

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

Pruébalo en línea .

La salida para n <0 contiene 2 nuevas líneas iniciales, según lo permitido en los comentarios . Para deshacerte de ellos, usa

?QjbfT+jR*\ hQ"$|"*RhyeS,1Q"-~-""Congratulations on your new baby! :D
PurkkaKoodari
fuente
El código más pequeño, por supuesto, parece ser menos legible para los humanos.
Sathish Sanjeevi
¿¿¿Que es esto??? LOL
Starx
18

CJam, 76 75 bytes

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

Pruébelo en línea en el intérprete de CJam .

Cómo 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.
Dennis
fuente
11

Ruby, 120 bytes

Revisión 1 (120 bytes)

18 bytes guardados gracias a manatwork

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

Revisión 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: esto recorre una cadena correspondiente a cada línea del pastel. Estos se utilizan como cadenas de relleno para justificar a la derecha la cadena vacía a la longitud 2 * n + 1. Esto evita cualquier complicación al tener que imprimir un número impar de caracteres, cuando la repetición natural es igual al tono de las velas (es decir, 2 caracteres) n>0&&es necesario para evitar generar una sola columna en caso de entrada cero.

Para todos los números: " n<=>0" encuentra el signo de la entrada. El mensaje de bebé se emite para n = 0, y una cadena vacía para n positivo (ya que la salida correcta ya se ha dado anteriormente). Para negativo n, Ruby interpreta el -1 como el último elemento de la matriz, y genera el sin velas pastel.

Level River St
fuente
1
¿No hay demasiados puts? n=gets.to_i puts ['Congratulations on your new baby! :D',%w{\ $ \ | - ~ -}.map{|e|''.rjust 2*n+1,e},'--- ~~~ ---'][n<=>0]
manatwork
1
Uno más: ''.rjuste.ljust.
manatwork
@manatwork gracias, debería haberlo visto, pero lo hice muy rápido. No sabía sobre el espacio de barra invertida con% w. Y e.just: muy inteligente.
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
fuente
2
Estoy aprendiendo mucho sobre los parámetros de escritura allí. Brillante
Tensibai
10

R, 228 226 220 221 Bytes


La última edición para corregir el pastel sin velas fue tan amplia como la positiva en casos negativos, gracias @CathG y @jbaums por los comentarios

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
fuente
1
Se pueden guardar un par de bytes: <-se puede =y se puede usar a=b='-~-'.
jbaums
Ho, gracias @jbaums olvida el primer = y no pensé en la doble asignación
Tensibai
Tengo un problema de soporte en alguna parte, me saleError: unexpected '}'
flodel
@flodel corregido.
Problema de
10

JavaScript ES6, 136

Uso de alerta para salida: fuente proporcional incorrecta y el resultado es feo. En el fragmento debajo de la alerta se redirige al cuerpo cortado, dando un mejor resultado.
La nueva línea dentro de backticks es significativa y contada.

Prueba a ejecutar el fragmento en 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 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);
edc65
fuente
Prueba esto $('div pre code')[2].innerHTML;)
Vasu Adari
7

R, 279 bytes

Versión interactiva (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=""))}
}

Versión no interactiva (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
fuente
7

MATLAB / Octave, 194 198 195 189 171 167 bytes

Feliz cumpleaños a ti Beta Decay! :)

¡Gracias a HamtaroWarrior por reducir 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)]);

Ejecuciones de muestra

Puse esto en un archivo de script llamado happy_birthday.m, luego lo ejecuté varias veces en el símbolo del sistema. Tenga en cuenta que cuando ingresa un número negativo, hay dos retornos de carro principales, pero eso está permitido en este desafío:

>> 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 con espacios y explicaciones

% 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 que se muestra al final es probablemente la parte más ofuscada del código. Esto mostrará una matriz de caracteres de 5 filas donde las dos primeras filas consisten en velas y las últimas tres filas consisten en la base del pastel.

La base de la mitad superior de la pantalla son dos espacios en una columna seguidos de otros dos espacios en otra columna en el caso de que la edad sea negativa, o una $,-en una columna seguida de dos espacios en otra columna. Esta es una matriz de 2 x 2 caracteres. La base de la mitad inferior de la pantalla es un vector de una columna -,~,-cuyo matriz es de 3 x 1 caracteres.

El comando de visualización primero aborda las dos primeras filas del pastel colocando dos espacios en la primera columna, seguidos de pares de una columna $,-o una columna de espacios si nes negativo, que se cambia a n=1, y otra columna de dos espacios repetidos para un total de nveces. Las siguientes tres filas simplemente replican el -,$,-vector de la columna por 2*n + 1momentos para alinear las velas junto con la base, completando así la imagen.

Pruébalo en línea!

Puede probar esto en línea usando el compilador Octave de IDEOne: http://ideone.com/4qXDdJ ; sin embargo, hay un pequeño error al leer los valores de la entrada estándar. Como tal, la secuencia de comandos se modifica ligeramente donde debe cambiar el valor de nal principio del código. Bifurque una nueva versión del script y cámbiela a cualquier valor entero que le convenga para ver cómo se ve la salida.

rayryeng
fuente
1
¡Lástima que no puedas guardar el punto ' '.'!
Luis Mendo
1
@LuisMendo - ¡Lo sé! ... aunque estoy seguro de que no te
opondrás
1
Jajaja. Una vez me dijeron aquí que este sitio es para abusar del idioma. ¡Y sigo esa regla fielmente!
Luis Mendo
1
@LuisMendo - Realmente quería deshacerme del punto ... pero no pude porque MATLAB lo interpreta como una sola cita en la cadena :(. Me habría ahorrado unos pocos bytes ... pero después de muchas iteraciones, esto fue lo mejor que se me ocurrió.
rayryeng
@LuisMendo: ¡logró reducirlo a 171!
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')

Para ver la salida en fuente mono space, reemplace 'alert' por 'console.log'

Nainemom
fuente
Bienvenido a PPCG! :)
2
Lamentablemente, esto también muestra el mensaje de felicitación por la entrada negativa.
manatwork
@BetaDecay tnx :-)
Nainemom
Manatwork tiene razón: / No sé lo suficiente JS para ayudar
@manatwork sí tienes razón! ¡entendí mal!
Nainemom
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'~'
Ryan Russell
fuente
3
¡Bienvenido a Programming Puzzles y 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")

Y uno más (154 también)

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 la salida en la fuente monoespacio (y mover la salida a la consola) use

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

Ratón , 164161 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:)"!"@

Claramente, el mouse no es una opción ideal para esta tarea, pero fue divertido.

Sin golf:

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

La pila solo puede contener enteros. !'quita un número entero de la pila e imprime el carácter ASCII con ese código.

Alex A.
fuente
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"

Sin golf:

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

Úselo 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

Pruébelo en línea: enlace (contiene un código de visualización personalizado, por lo que todo se ve muy bien ...)

¡Vaya, casi lo olvido! ¡Feliz cumpleaños, @BetaDecay!

Bojidar Marinov
fuente
4

C, 392 bytes

(falla de segmentación conocida si no se dan argumentos)

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

Desminificado y copiosamente espaciado

#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
fuente
Sin repetitivo C, el # define y el cuerpo principal total 247.
Funmungus
Bienvenido a PPCG! Esta es una muy buena respuesta, especialmente me gusta el abuso macro con A. Veo un par de espacios más que podrían eliminarse, y puedes deshacerte de ellos iusando cla variable de bucle. Además, al menos con gcc, que incluye stdio.h o especificar el tipo de retorno de main () no es necesario: el compilador se queja al respecto, pero bueno, este es el código 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
fuente
Puede guardar 5 bytes usando en $inputlugar de $args[0](la pregunta no dice que use argumentos en lugar de stdin), y puede usar unary +para convertir a un número:$n=+$input;
briantist
+ $ input no parecía funcionar: se quejó de que $ input es un enumerador y no tiene un operador de suma. Sin embargo, $args[0]puede y debe ser un int real, lo que nos permite al menos descartar el [int].
Justin Dunlap
1
Por lo tanto, esto es realmente antiguo, pero puede guardar un par de bytes moviendo la entrada al ife intercambiando elsepor un ;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án, 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"));}}

El original aún no golfizado (suponiendo que los pasteles negativos tengan un ancho de 3 en lugar 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) + "-");
        }
    }
}

Esto presenta la lista de condiciones en la instrucción if, cada condición define un valor utilizable en las siguientes condiciones y en el cuerpo. Debido a que tienen la existcondición, la condición solo se cumple cuando los valores no son nulos y, por lo tanto, el compilador sabe que los valores no son nulos para el siguiente código. (Si no se ingresa nada (EOF), readline devuelve nulo. Si parseInteger golpea un no entero, también devuelve nulo. Nuestro programa no hace nada. Como el comportamiento para esos casos no se definió, supongo que está bien).

También tenemos el <=>operador, que se asigna al Comparable.comparemétodo y devuelve un Comparisonobjeto, es decir, uno de equal, smallery larger. El compilador sabe que esos agotan el Comparisontipo, por lo que no elsese necesita ninguna cláusula en nuestra switchdeclaración.

El repeatmétodo de la clase String hace lo que uno esperaría. En realidad, se hereda del método con el mismo nombre en la interfaz Iterable (ya que una cadena es, además de otras cosas, solo una lista de caracteres).

Reemplazar mis identificadores por uno de una letra y eliminar espacios en blanco innecesarios da 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)+"-");}}}

Reemplazar la serie de printpor \ns explícito (y uno simple print) lo reduce 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)+"-");}}}

Intenté la importación de alias de repeatas r, pero no ayuda (la declaración de importación agrega 40 caracteres, y solo podemos guardar 25 reemplazando repeatpor r).

Lo que ayuda un poco, es usar en n.signlugar de n<=>0. Si bien estas dos expresiones tienen la misma longitud textual, que tienen diferentes tipos: este último es del tipo Comparisonmencionado antes (que tiene los tres valores smaller, largery equal), el primero tiene un tipo Integer, con los valores -1, 1, 0... y porque Integertiene muchos más valores, también necesitamos una elsecláusula. Esto tiene 300 caracteres de longitud:

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

Aquí con espacios en blanco:

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 asegurarnos un poco más al renunciar a nuestra declaración de cambio y usar if, llegando 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)+"-");}}}

Formateado:

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 otro byte intercambiando los casos, ya que >es más corto que ==. Otra "molestia" es la repetida repeat(n): podemos definir una función local (un cierre, recuerda ndel bloque de definición) con un nombre más corto:

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

Esta es una forma más corta de escribir esto:

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

Podríamos usar en functionlugar del tipo de retorno para la inferencia de tipos, pero esto no es más corto. Esto nos da 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");}}}

Formateado:

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

En realidad, usar los operadores theny en elselugar de las ifdeclaraciones nos permite guardar algunas llamadas de print(y algunas llaves):

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

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

(Utilicé en runlugar del bnombre de la función porque de esta manera se puede ejecutar ceylon runsin pasar un nombre de función).

Mi repositorio de Github tiene una versión comentada de esto .

Paŭlo Ebermann
fuente
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
fuente
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"-"$

Ejecución de muestra:

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
---
~~~
---
hombre trabajando
fuente
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"

Cerca de Python del autor :(

Blex
fuente
3

Perl, 139 127 117 bytes

No requiere las opciones '-n' o '-p'.

Revisión 3 (con agradecimiento a Dom Hastings a continuación):

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

Revisión 2:

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

Revisión 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'):(' $',' |','-','~','-')

Aquí hay una versión de la revisión 3 que no tiene las nuevas líneas en blanco en la entrada negativa: 132 bytes.

$==<>;map{print$_ x(!$=||(/ /?$=:($=<1||$=)*2+1)).(/ /&&$=<0?'':$/)}!$=?'Congratulations on your new baby! :D':split 0,' $0 |0-0~0-'
phillipo
fuente
Hola, bienvenido! ¡Pensé en compartir un par de formas en que puede guardar algunos bytes! Usted puede eliminar los corchetes "Congratulations..."y si se reemplaza ' $',' |','-','~','-'con la split 0,' $0 |0-0~0-'que puede caer esos soportes también. Otra salvación se está reemplazando $n=<>;$n==0por ($n=<>)==0. También ?1:podría ser ||como diría $n==0(que es 1) o su cálculo. ¡Espero que ayude!
Dom Hastings
Hola, gracias por eso. Esos corchetes son buenos, y recordarme la semántica de ||es muy útil, me recordó $=básicamente chompla entrada, eliminando el requisito de pruebas específicas de valor 0. No estoy seguro de lo que quieres decir con $n=<>;$n==0: mi golf no tiene eso, y dado que manejo el caso input = 0 como entrada en el map{}(), no estoy seguro de cómo se aplicaría esto. De todos modos, tomando sus comentarios y utilizándolos $=como mi variable, esto se ha reducido a 117 parbytes. ¡Muchas gracias!
phillipo
¡No hay problema! Me alegro de haber ayudado! Lo que quiero decir es que lo tienes $n=<>;al principio y luego $n==0en la parte de atrás, map{}...así que creo que podrías tener el cheque, ($n=<>)==0pero si lo estás usando, $=¡podrías reducirlo más! Siempre olvido cuál de los dos $-o $=no puede ser negativo, ¡así que no quería mencionarlo y equivocarme! :)
Dom Hastings
3

Pip, 74 + 1 = 75 bytes

Toma la edad como un argumento de línea de comandos. Requiere la -nbandera.

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

Repositorio de Github para Pip

El argumento de la línea de comandos se almacena en a. Nos dividimos "-~-"en una lista de caracteres y la Yincluimos en la variable y. El resto del programa es una gran expresión ternaria:

  • a?
    Si aes verdadero (es decir, no cero):
    • a<0?yX3
      Si aes negativo, regrese ycon cada elemento repetido 3 veces:["---";"~~~";"---"]
    • De lo contrario ( aes positivo):
      • (s.^"$|")Xa
        Dividir "$|"en una lista de caracteres, anteponer un espacio ( s) a cada uno y repetir cada elemento resultante aveces
      • yX2*a+1
        Repite cada elemento de y 2*a+1veces
      • AL
        Añadir las dos listas
  • De lo contrario ( aes cero), devuelve la cadena de felicitaciones

Al final del programa, la -nbandera asegura que las listas se impriman con elementos en líneas separadas, mostrando así una torta en capas adecuada.

Estos son los pasos para una entrada de 2:

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

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

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

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

¡Feliz cumpleaños!

DLosc
fuente
2

Perl, 144 bytes

143 bytes de código, más un byte extra para que el -nswitch capture la entrada estándar.

if($_!=0){print$_>0?" \$"x$_.$/." |"x$_.$/:""x($_=1);$_=$_*2+1;print"-"x$_.$/."~"x$_.$/."-"x$_;exit}print"Congratulations on your new baby! :D"
ossifrage aprensivo
fuente
1
print"-~-"=~s!.!$&x($_*2+1).$/!gerpara el pastel?
manatwork
Si cambia el cambio a -pesto también funcionará:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
manatwork
2

SpecBAS, 164

Utiliza el atajo de apóstrofe para moverse a una nueva línea

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

Formateado para facilitar la lectura

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

Muy claro. Sin golf:

# 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.
fuente
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
fuente
1
Bienvenido a PPCG! Su código tal como está parece dar un error ( attempt to compare string with number), pero agregarlo 0+antes io.read()me lo soluciona. También puede guardar bastantes bytes asignando printy string.repa variables de un solo carácter.
DLosc
@DLosc gracias, buena idea :) y sí
tenías
2

Mathematica, 164 Bytes

Se perdió por completo los pasteles sin velas para n <0, agregando 15 caracteres adicionales

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
fuente
1
Bienvenido a PPCG, este desafío se conoce como código de golf, donde intenta hacer que su código sea lo más breve posible. Esto se puede hacer eliminando espacios en blanco innecesarios y acortando nombres de variables.
Gracias @BetaDecay Estaba obteniendo una versión rápida ... minimizando ahora. Saludos: D
Martin John Hadley
No hay problema. Se ve bien :)
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]

Me arrepiento de algo.

Hay algunas maneras en que esto podría ser mejor. Por ejemplo, al descubrir que la entrada es negativa, procedo a deducir qué número negativo es. Esto es innecesario, y tal vez algún día vuelva a sumergirme en este código para detenerlo.

No intente ejecutar esto en el modo "reloj" de pbi, si ingresa un negativo, se bloqueará cuando intente imprimir chr(-1).

Aquí está la versión de la versión explicada donde tomé notas mientras escribía el programa. Si desea comprender mejor cómo funciona ... buena suerte, y avíseme si lo resuelve.

# 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]
metro subterráneo
fuente
2

ScriptCS (secuencia de comandos de C #), 221 bytes

Obviamente, esto no ganará ningún premio, pero ...

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
fuente