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 n
como entrada, escriba un programa completo para generar un pastel de cumpleaños con n
velas 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>
Respuestas:
Pyth,
7372716967 bytesPrué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
fuente
CJam,
7675 bytesPruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
Ruby, 120 bytes
Revisión 1 (120 bytes)
18 bytes guardados gracias a manatwork
Revisión 0 (138 bytes)
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.fuente
puts
?n=gets.to_i puts ['Congratulations on your new baby! :D',%w{\ $ \ | - ~ -}.map{|e|''.rjust 2*n+1,e},'--- ~~~ ---'][n<=>0]
''.rjust
→e.ljust
.e.just
: muy inteligente.R, 157
fuente
R,
228226220221 BytesLa ú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
fuente
<-
se puede=
y se puede usara=b='-~-'
.Error: unexpected '}'
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.
Menos golf
fuente
$('div pre code')[2].innerHTML
;)R, 279 bytes
Versión interactiva (286 bytes):
Versión no interactiva (279 bytes):
fuente
MATLAB / Octave,
194198195189171167 bytesFeliz cumpleaños a ti Beta Decay! :)
¡Gracias a HamtaroWarrior por reducir 4 bytes!
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:Código con espacios y explicaciones
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 sin
es negativo, que se cambia an=1
, y otra columna de dos espacios repetidos para un total den
veces. Las siguientes tres filas simplemente replican el-,$,-
vector de la columna por2*n + 1
momentos 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
n
al 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.fuente
' '.'
!JavaScript,
143153 Bytesfor(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'
fuente
Moonscript, 141 bytes
fuente
rs , 117 bytes
Demostración en vivo y casos de prueba.
fuente
JavaScript ES6, 154 caracteres
Y uno más (154 también)
Para ver la salida en la fuente monoespacio (y mover la salida a la consola) use
fuente
Ratón ,
164161bytesClaramente, el mouse no es una opción ideal para esta tarea, pero fue divertido.
Sin golf:
La pila solo puede contener enteros.
!'
quita un número entero de la pila e imprime el carácter ASCII con ese código.fuente
CoffeeScript, 160 bytes
Sin golf:
Úselo como:
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!
fuente
C, 392 bytes
(falla de segmentación conocida si no se dan argumentos)
Desminificado y copiosamente espaciado
fuente
A
. Veo un par de espacios más que podrían eliminarse, y puedes deshacerte de ellosi
usandoc
la 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. ;)PowerShell,
139134132126 bytesfuente
$input
lugar 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;
$args[0]
puede y debe ser un int real, lo que nos permite al menos descartar el[int]
.if
e intercambiandoelse
por 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'
Ceilán,
322307260 bytes300282278El original aún no golfizado (suponiendo que los pasteles negativos tengan un ancho de 3 en lugar de –2 · n + 1):
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
exist
condició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 alComparable.compare
método y devuelve unComparison
objeto, es decir, uno deequal
,smaller
ylarger
. El compilador sabe que esos agotan elComparison
tipo, por lo que noelse
se necesita ninguna cláusula en nuestraswitch
declaración.El
repeat
mé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:
Reemplazar la serie de
print
por\n
s explícito (y uno simpleprint
) lo reduce a 307:Intenté la importación de alias de
repeat
asr
, pero no ayuda (la declaración de importación agrega 40 caracteres, y solo podemos guardar 25 reemplazandorepeat
porr
).Lo que ayuda un poco, es usar en
n.sign
lugar den<=>0
. Si bien estas dos expresiones tienen la misma longitud textual, que tienen diferentes tipos: este último es del tipoComparison
mencionado antes (que tiene los tres valoressmaller
,larger
yequal
), el primero tiene un tipoInteger
, con los valores-1
,1
,0
... y porqueInteger
tiene muchos más valores, también necesitamos unaelse
cláusula. Esto tiene 300 caracteres de longitud:Aquí con espacios en blanco:
Podemos asegurarnos un poco más al renunciar a nuestra declaración de cambio y usar
if
, llegando a 282 caracteres (= bytes):Formateado:
Podemos proteger otro byte intercambiando los casos, ya que
>
es más corto que==
. Otra "molestia" es la repetidarepeat(n)
: podemos definir una función local (un cierre, recuerdan
del bloque de definición) con un nombre más corto:Esta es una forma más corta de escribir esto:
Podríamos usar en
function
lugar del tipo de retorno para la inferencia de tipos, pero esto no es más corto. Esto nos da 278 bytes:Formateado:
En realidad, usar los operadores
then
y enelse
lugar de lasif
declaraciones nos permite guardar algunas llamadas deprint
(y algunas llaves):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
run
lugar delb
nombre de la función porque de esta manera se puede ejecutarceylon run
sin pasar un nombre de función).Mi repositorio de Github tiene una versión comentada de esto .
fuente
Python 2, 158 bytes
fuente
golflua, 113 caracteres
Ejecución de muestra:
fuente
Python 2, 150 bytes
Cerca de Python del autor :(
fuente
Perl,
139127117 bytesNo requiere las opciones '-n' o '-p'.
Revisión 3 (con agradecimiento a Dom Hastings a continuación):
Revisión 2:
Revisión 1:
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.
fuente
"Congratulations..."
y si se reemplaza' $',' |','-','~','-'
con lasplit 0,' $0 |0-0~0-'
que puede caer esos soportes también. Otra salvación se está reemplazando$n=<>;$n==0
por($n=<>)==0
. También?1:
podría ser||
como diría$n==0
(que es 1) o su cálculo. ¡Espero que ayude!||
es muy útil, me recordó$=
básicamentechomp
la 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 elmap{}()
, 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!$n=<>;
al principio y luego$n==0
en la parte de atrás,map{}...
así que creo que podrías tener el cheque,($n=<>)==0
pero 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! :)Pip, 74 + 1 = 75 bytes
Toma la edad como un argumento de línea de comandos. Requiere la
-n
bandera.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 laY
incluimos en la variabley
. El resto del programa es una gran expresión ternaria:a?
Si
a
es verdadero (es decir, no cero):a<0?yX3
Si
a
es negativo, regresey
con cada elemento repetido 3 veces:["---";"~~~";"---"]
a
es positivo):(s.^"$|")Xa
Dividir
"$|"
en una lista de caracteres, anteponer un espacio (s
) a cada uno y repetir cada elemento resultantea
vecesyX2*a+1
Repite cada elemento de
y
2*a+1
vecesAL
Añadir las dos listas
a
es cero), devuelve la cadena de felicitacionesAl final del programa, la
-n
bandera 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
:¡Feliz cumpleaños!
fuente
Perl, 144 bytes
143 bytes de código, más un byte extra para que el
-n
switch capture la entrada estándar.fuente
print"-~-"=~s!.!$&x($_*2+1).$/!ger
para el pastel?-p
esto también funcionará:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
SpecBAS, 164
Utiliza el atajo de apóstrofe para moverse a una nueva línea
Formateado para facilitar la lectura
fuente
Python 3, 169 bytes
fuente
Julia, 143 bytes
Muy claro. Sin golf:
fuente
Lua, 299 bytes
fuente
attempt to compare string with number
), pero agregarlo0+
antesio.read()
me lo soluciona. También puede guardar bastantes bytes asignandoprint
ystring.rep
a variables de un solo carácter.Mathematica, 164 Bytes
Se perdió por completo los pasteles sin velas para n <0, agregando 15 caracteres adicionales
fuente
pb , 567 bytes
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 laversiónexplicadadonde tomé notas mientras escribía el programa. Si desea comprender mejor cómo funciona ... buena suerte, y avíseme si lo resuelve.fuente
ScriptCS (secuencia de comandos de C #), 221 bytes
Obviamente, esto no ganará ningún premio, pero ...
fuente