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 n
como entrada, escreva um programa completo para produzir um bolo de aniversário com n
velas 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>
Respostas:
Pitão,
7372716967 bytesExperimente online .
A saída para n <0 contém 2 novas linhas principais, conforme permitido nos comentários . Para se livrar deles, use
fonte
CJam,
7675 bytesExperimente on-line no intérprete CJam .
Como funciona
fonte
Ruby, 120 bytes
Revisão 1 (120 bytes)
18 bytes economizados graças ao manatwork
Revisão 0 (138 bytes)
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.fonte
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
: muito esperto.R, 157
fonte
R,
228226220221 BytesA ú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
fonte
<-
pode ser=
e você pode usara=b='-~-'
.Error: unexpected '}'
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.
Menos golfe
fonte
$('div pre code')[2].innerHTML
;)R, 279 bytes
Versão interativa (286 bytes):
Versão não interativa (279 bytes):
fonte
MATLAB / Oitava,
194198195189 189171167 bytesFeliz aniversário para você Beta Decay! :)
Obrigado ao HamtaroWarrior por remover 4 bytes!
Execuções de amostra
Coloquei isso em um arquivo de script chamado
happy_birthday.m
e 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:Código com espaçamento e explicações
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 sen
for negativo, que é alterado paran=1
, e outra coluna de dois espaços repetida por um total den
vezes. As próximas três linhas simplesmente replicam o-,$,-
vetor da coluna por2*n + 1
vezes 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
n
no 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.fonte
' '.'
!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 a saída na fonte de espaço mono, substitua 'alert' por 'console.log'
fonte
Moonscript, 141 bytes
fonte
rs , 117 bytes
Demonstração ao vivo e casos de teste.
fonte
JavaScript ES6, 154 caracteres
E mais um (154 também)
Para ver a saída na fonte monoespaçada (e mover o eutut para o console), use
fonte
Mouse ,
164161 bytesO mouse claramente não é a escolha ideal para esta tarefa, mas foi divertido.
Ungolfed:
A pilha pode conter apenas números inteiros.
!'
tira um número inteiro da pilha e imprime o caractere ASCII com esse código.fonte
CoffeeScript, 160 bytes
Ungolfed:
Use-o como:
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!
fonte
C, 392 bytes
(falha de segmentação conhecida se nenhum argumento for fornecido)
Não minificado e copiosamente espaçado
fonte
A
. Eu vejo mais alguns espaços que podem ser removidos e você pode se livrari
usandoc
a 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. ;)Conector de força,
139134132126 bytesfonte
$input
em 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;
$args[0]
pode e deve ser um int real, permitindo pelo menos descartar o[int]
.if
e trocando oelse
para 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'
Ceilão,
322307260 bytes300282278O original ainda não jogado no golfe (supondo que bolos negativos tenham largura 3 em vez de –2 · n + 1):
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 oComparable.compare
método, e retorna umComparison
objeto, ou seja, um deequal
,smaller
elarger
. O compilador sabe que aqueles esgotam oComparison
tipo, portanto, nenhumaelse
cláusula é necessária em nossaswitch
declaração.O
repeat
mé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:
Substituir a série de
print
por explícito\n
s (e um únicoprint
) reduz para 307:Tentei a importação de alias de
repeat
asr
, mas isso não ajuda (a declaração de importação adiciona 40 caracteres e só podemos salvar 25 substituindorepeat
porr
).O que ajuda um pouco, é usar em
n.sign
vez den<=>0
. Enquanto estas duas expressões têm o mesmo comprimento textual, eles têm tipos diferentes: o último é do tipoComparison
mencionado antes (que tem três valoressmaller
,larger
eequal
), o anterior tem o tipoInteger
, com os valores-1
,1
,0
... e porqueInteger
tem muito mais valores, também precisamos de umaelse
cláusula. Possui 300 caracteres:Aqui com espaço em branco:
Podemos nos proteger um pouco mais, renunciando à nossa instrução switch e usando
if
, chegando a 282 caracteres (= bytes):Formatado:
Podemos proteger outro byte trocando os casos, pois
>
é menor que==
. Outro "aborrecimento" é o repetidorepeat(n)
- podemos definir uma função local (um fechamento, ele se lembran
do bloco de definição) com um nome mais curto:Esta é uma maneira mais curta de escrever isso:
Poderíamos usar em
function
vez do tipo de retorno para inferência de tipo, mas isso não é mais curto. Isso nos dá 278 bytes:Formatado:
Na verdade, usar os operadores
then
eelse
em vez dasif
instruções permite salvar algumas chamadas deprint
(e algumas chaves):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
run
vez dob
nome da função, pois dessa forma ele pode ser executadoceylon run
sem passar o nome da função.)Meu repositório do Github tem uma versão comentada disso .
fonte
Python 2, 158 bytes
fonte
golflua, 113 caracteres
Exemplo de execução:
fonte
Python 2, 150 bytes
Perto do Python do autor :(
fonte
Perl,
139127117 bytesNão requer as opções '-n' ou '-p'.
Revisão 3 (com agradecimentos a Dom Hastings abaixo):
Revisão 2:
Revisão 1:
Aqui está uma versão da revisão 3 que não possui as principais novas linhas em branco na entrada negativa - 132 bytes.
fonte
"Congratulations..."
e se você trocar' $',' |','-','~','-'
comsplit 0,' $0 |0-0~0-'
você pode soltar os suportes também. Outra gravação está sendo substituída$n=<>;$n==0
por($n=<>)==0
. Também?1:
pode ser o||
que você diria$n==0
(que é 1) ou o seu cálculo. Espero que ajude!||
é muito útil - lembrou-me$=
basicamentechomp
da 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 nomap{}()
, 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!$n=<>;
no início e depois$n==0
no final da página,map{}...
então eu acho que você poderia fazer a verificação,($n=<>)==0
mas 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! :)Pip, 74 + 1 = 75 bytes
Toma a idade como um argumento de linha de comando. Requer a
-n
bandeira.Repositório do Github para Pip
O argumento de linha de comando é armazenado no
a
. Dividimos"-~-"
em uma lista de caracteres eY
colocamos na variávely
. O restante do programa é uma grande expressão ternária:a?
Se
a
for verdade (ou seja, não zero):a<0?yX3
Se
a
for negativo, retorney
com cada elemento repetido 3 vezes:["---";"~~~";"---"]
a
é positivo):(s.^"$|")Xa
Divida
"$|"
em uma lista de caracteres, acrescente um espaço (s
) a cada um e repita osa
tempos de cada elemento resultanteyX2*a+1
Repita cada elemento de
y
2*a+1
vezesAL
Anexe as duas listas
a
é zero), retorne a sequência de parabénsNo final do programa, a
-n
bandeira 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
:Feliz Aniversário!
fonte
Perl, 144 bytes
143 bytes de código, mais um byte extra para o
-n
switch capturar stdin.fonte
print"-~-"=~s!.!$&x($_*2+1).$/!ger
para o bolo?-p
este também irá trabalhar:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
SpecBAS, 164
Usa o atalho do apóstrofo para mover para a nova linha
Formatado para facilitar a leitura
fonte
Python 3, 169 bytes
fonte
Julia, 143 bytes
Bem direto. Ungolfed:
fonte
Lua, 299 bytes
fonte
attempt to compare string with number
), mas adicionar0+
antes oio.read()
corrige para mim. Você também pode salvar alguns bytes atribuindoprint
estring.rep
a variáveis de caractere único.Mathematica, 164 bytes
Perdeu completamente os bolos sem velas por n <0, adicionando mais 15 caracteres
fonte
pb , 567 bytes
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.fonte
ScriptCS (script C #), 221 bytes
Obviamente, isso não vai ganhar nenhum prêmio, mas ...
fonte