这是我的生日:D


112

介绍

去年是我的生日(真的!),可惜我不得不组织自己的聚会。好吧,现在你知道了,你至少不能做蛋糕吗?

挑战

给定一个整数n作为输入,编写一个完整的程序以输出带有n蜡烛的生日蛋糕。

输出量

放着一支蜡烛的小菜一碟是:

 $
 |
---
~~~
---

放着三个蜡烛的小菜一碟是:

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

我敢肯定你可以解决这个问题

但是,对于input0,必须输出以下内容:

Congratulations on your new baby! :D

如果输入小于0,则应输出无烛蛋糕:

---
~~~
---

不允许将任何内容输出到STDERR。

尾随换行符和空格是允许的。

获奖

以字节为单位的最短代码获胜。

排行榜

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
生日快乐!
丹尼斯2015年

1
无蜡烛蛋糕是否允许使用领先的空格(例如2个换行符)?
级圣河

2
@steveverrill是

2
@PaŭloEbermann一个3宽度的蛋糕

4
@jvriesem不。这是代码段的代码。
sigod 2015年

Answers:


36

Pyth,73 72 71 69 67字节

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

在线尝试。

n <0的输出包含2条开头的换行符,如注释所允许。要摆脱它们,请使用

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

当然,最小的代码似乎是人类可读性最低的。
Sathish Sanjeevi

WTF是这个???LOL
Starx

18

CJam,76 75字节

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

CJam解释器中在线尝试。

这个怎么运作

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个字节

修订版1(120字节)

节省了18个字节

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

修订版0(138字节)

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

对于正数:遍历与蛋糕每一行相对应的字符串。这些用作填充字符串以将空字符串右对齐为长度2 * n + 1。当自然重复等于蜡烛的音高(即2个字符)时,这避免了必须打印奇数个字符的任何麻烦,n>0&&以避免在输入零的情况下输出单列。

对于所有数字:“ n<=>0”查找输入的符号。对于n = 0,将输出baby消息,对于正n,将输出一个空字符串(因为上面已经给出了正确的输出。)对于负n,Ruby将-1解释为表示数组的最后一个元素,并输出无烛光蛋糕。


1
没有太多puts吗?n=gets.to_i puts ['Congratulations on your new baby! :D',%w{\ $ \ | - ~ -}.map{|e|''.rjust 2*n+1,e},'--- ~~~ ---'][n<=>0]
manatwork 2015年

1
还有一个:''.rjuste.ljust
manatwork

@manatwork谢谢,我应该已经发现了,但是我做得很快。我不了解%w的反斜杠空间。并且e.just:非常聪明。
级圣河

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
我在那里学到很多关于写参数的知识。辉煌一号
Tensibai

10

R,228 226 220 221个字节


纠正无烛蛋糕的最后一次编辑与否定案例的积极方面一样多,感谢@CathG和@jbaums的反馈

n=scan()
s=strsplit
p=paste0
a=b='-~-'
if(!n)cat('Congratulations on your new baby! :D')else{
if(n>0){a=p('  ',a);b=p('$|',b)}else n=1
a=s(a,'')
b=s(b,'')
d=data.frame(rep(c(a,b),n),a)
cat(do.call(p,d),sep="\n")}

1
可以保存几个字节:<-可以是=,您可以使用a=b='-~-'
jbaums 2015年

Ho,谢谢@jbaums忘记了双重分配的第一个=并没有通过
Tensibai 2015年

您在某处遇到了括号问题,我知道Error: unexpected '}'
flodel

@flodel已更正。复制/粘贴问题
2015年

10

JavaScript ES6、136

对输出使用警告-比例字体错误,结果丑陋。在下面的代码段中,警报重定向到被剪切的正文,从而获得更好的结果。
反引号内的换行符很重要且已计算在内。

测试在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>

少打高尔夫球

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

试试这个$('div pre code')[2].innerHTML;)
Vasu Adari 2015年

7

R,279字节

互动版本(286字节):

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

非交互式版本(279字节):

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 /八度,194个 198 195 189 171 167字节

Beta Beta Decay祝您生日快乐!:)

感谢HamtaroWarrior削减了4个字节!


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

样品运行

我将其放入一个名为的脚本文件中happy_birthday.m,然后在命令提示符下运行了几次。请注意,当您输入负数时,会有两个前导回车符,但是在此挑战中允许这样做:

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

带空格和解释的代码

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

最后的显示部分可能是代码中最混淆的部分。这将显示一个5行的字符矩阵,其中前两行由蜡烛组成,后三行由蛋糕的底部组成。

显示器上半部分的依据是:如果年龄为负数,则$,-一列中的两个空格,然后是另一列中的另外两个空格,或者一列中的a,然后是另一列中的两个空格。这是一个2 x 2字符矩阵。显示屏下半部分的基础是一个单列向量,-,~,-该向量是一个3 x 1字符矩阵。

display命令首先通过在第一列中放置两个空格来处理蛋糕的前两行,$,-如果n是负数,则对成对的一列或一列空格,将其变为n=1,然后对两个空格的另一列重复总n次数。接下来的三行只需复制-,$,-列向量一段2*n + 1时间,以使蜡烛与底部对齐,从而完成图片。

在线尝试!

您可以使用IDEOne的Octave编译器在线进行尝试:http ://ideone.com/4qXDdJ- 但是,从标准输入中读取值时会出现一个小错误。这样,对脚本进行了稍微的修改,您必须n在代码的开头更改其值。分叉新版本的脚本,然后将其更改为适合您的整数值,以查看输出结果。


1
可惜你不能保存点' '.'
路易斯·门多

1
@LuisMendo-我知道!...虽然我确定您不反对以这种方式使用移调:)
rayryeng

1
哈哈哈 我曾经在这里被告知,这个网站是在滥用语言。我忠实地遵守该规则!
路易斯·门多

1
@LuisMendo-我真的很想摆脱点...但不能因为MATLAB将其解释为字符串中的单引号:(。本可以为我节省一些字节...但是经过多次迭代,这是我能想出的最好办法
rayryeng 2015年

@LuisMendo-设法将其缩小到171!
rayryeng

6

JavaScript中,143个 153字节

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

要查看等宽字体的输出,请用“ console.log”替换“ alert”


欢迎来到PPCG!:)

2
可悲的是,这也显示了对否定输入的祝贺消息。
manatwork 2015年

@BetaDecay tnx :-)
Nainemom 2015年

Manatwork的权利:/我不知道够不够JS帮助

@manatwork是的,您正确!我误解了!
Nainemom 2015年

5

Moonscript,141个字节

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
欢迎来到编程难题和Code Golf!
丹尼斯


4

JavaScript ES6,154个字符

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

还有一个(154个)

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

要以等宽字体查看输出(并将ouptut移至控制台),请使用

alert=x=>console.log(x)

4

鼠标164161字节

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

鼠标显然不是此任务的理想选择,但它很有趣。

取消高尔夫:

? 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
@

堆栈只能包含整数。!'从堆栈中取出一个整数,并使用该代码打印ASCII字符。


4

CoffeeScript,160个字节

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"

取消高尔夫:

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

像这样使用它:

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

在线尝试:链接(包含一些自定义显示代码,因此一切看起来都很好...)

哎呀,差点忘了!生日快乐,@ BetaDecay!


4

C,392字节

(如果没有给出参数,则已知分段错误)

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

未缩小且间隔很大

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

无C样板的#定义的和主体总247
Funmungus

欢迎来到PPCG!这是一个非常好的答案-我特别喜欢使用的宏滥用A。我确实看到了可以删除的更多空间,您可以i通过使用cloop变量来摆脱它。另外,至少对于包括stdio.h在内的gcc而言,也没有必要指定main()的返回类型:编译器会抱怨它,但是,这是代码高尔夫。;)
DLosc

4

的powershell,139个 134 132 126字节

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

您可以使用$input而不是$args[0](问题不是说使用参数代替标准输入)来节省5个字节,并且可以使用一元+转换为数字:$n=+$input;
briantist 2015年

+ $ input似乎不起作用-它抱怨$ input是一个枚举器,没有加法运算符。但是,$args[0]可以并且应该是一个实际的int,使我们至少可以删除[int]
贾斯汀·邓拉普

1
因此,这确实很旧,但是您可以通过将输入移至if并交换else一个;exit-122字节- 来节省几个字节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

锡兰,322 307 300 282 278 260个字节

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

尚未打高尔夫球的原始球(假设负饼的宽度为3而不是–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) + "-");
        }
    }
}

该函数在if语句中使用条件列表,每个条件定义一个可在以下条件和主体中使用的值。因为它们具有exist,所以仅当值不为null时才满足条件,因此编译器知道以下代码的值不为null。(如果未输入任何内容(EOF),则readline返回null。如果parseInteger命中非整数,则它也返回null。然后我们的程序不执行任何操作。由于未定义这些情况的行为,所以我想这是可以的。)

同时,我们也有<=>运营商,这映射到Comparable.compare方法,并返回一个Comparison对象,即一个equalsmallerlarger。编译器知道那些会耗尽Comparison类型,因此else在我们的switch语句中不需要任何子句。

repeatString类方法可以实现预期的效果。它实际上是从Iterable接口中的同名方法继承的(因为字符串和其他内容一样,只是一个字符列表)。

用一个字母的标识符替换我的标识符,并删除不需要的空格将得到322个字符:

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

print用显式\ns(和一个single print)替换系列,将其降至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)+"-");}}}

我试过的别名进口repeatr,但它并不能帮助(进口申报增加了40个字符,我们只能通过更换节省25 repeatr)。

稍微有帮助的是使用n.sign代替n<=>0。虽然这两个表达式有相同的文字长度,它们有不同的类型:后者是类型Comparison之前(其中有三个值中提到smallerlargerequal),前者具有类型Integer,使用值-110...因为Integer有还有更多的值,我们还需要一个else子句。这是300个字符长:

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

这里带空格:

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

我们可以通过辞掉switch语句并使用if282个字符(= 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)+"-");}}}

格式:

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

我们可以通过交换大小写来确保另一个字节的安全,因为>它比短==。另一个“烦恼”是重复的repeat(n)–我们可以n用一个较短的名称定义一个局部函数(一个闭包,它从定义块中记住)。

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

这是一种较短的编写方式:

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

我们可以使用function返回类型来代替类型推断,但这并不短。这给了我们278个字节:

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

格式:

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

实际上,使用thenand else运算符代替if语句可以使我们节省一些调用print(和一些花括号):

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

这只有261个字节:

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

(我使用run而不是b函数名,因为这样可以在ceylon run不传递函数名的情况下运行它。)

我的Github存储库对此具有注释


3

Python 2,158字节


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个字符

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

样品运行:

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个字节

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"

接近作者的Python :(


3

Perl中,139个 127 117字节

不需要'-n'或'-p'选项。

修订版3(感谢下面的Dom Hastings):

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

修订2:

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

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

这是修订版3的版本,在负输入上不包含前导空白行-132字节。

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

嘿,欢迎光临!以为我会分享几种可以节省一些字节的方法!您可以将括号放在周围"Congratulations...",如果用替换' $',' |','-','~','-'split 0,' $0 |0-0~0-'也可以将这些括号删除。另一种保存时替换$n=<>;$n==0($n=<>)==0。同样,您?1:也可以||按照您的说法$n==0(等于1)或您的计算。希望有帮助!
Dom Hastings 2015年

嘿,谢谢。这些括号是一个很好的括号||,让我想起的语义非常有用-它使我想起了$=基本上chomp是输入的内容,从而消除了对特定0值测试的要求。我不确定您的意思是什么$n=<>;$n==0-我的高尔夫球没有这个意思,并且考虑到我将input = 0的情况作为的输入map{}(),我不确定这将如何应用?无论如何,以您的评论并将其$=用作我的变量,该文件已压缩至117个字节。非常感谢!
phillipo 2015年

没问题!很高兴为您提供帮助!我的意思是说,您$n=<>;在开始时有,然后$n==0在后面,map{}...所以我认为您可以进行检查,($n=<>)==0但是如果您使用的$=话,则可以将其缩小得更多!我总是忘记哪一个$-$=不能否定,所以我不想提及它并且错了!:)
Dom Hastings

3

点,74 +1 = 75字节

将年龄作为命令行参数。需要-n标志。

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

Github Pip存储库

命令行参数存储在中a。我们将其"-~-"分成字符列表,然后将其Y附加到变量中y。该程序的其余部分是一个很大的三元表达式:

  • a?
    如果a为真(即不为零):
    • a<0?yX3
      如果a为负,则返回y每个元素重复3次:["---";"~~~";"---"]
    • 其他(a是肯定的):
      • (s.^"$|")Xa
        拆分"$|"为一个字符列表,s在每个字符前面添加一个空格(),并重复每个结果元素a时间
      • yX2*a+1
        重复的每个元素y 2*a+1
      • AL
        追加两个列表
  • 否则(a为零),返回祝贺字串

在程序结束时,该-n标志确保列表在单独的行上打印有元素,从而显示适当分层的蛋糕。

以下是输入的步骤2

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

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

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

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

生日快乐!


2

Perl,144个字节

143个字节的代码,再加上一个额外的字节供-n交换机捕获标准输入。

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

1
print"-~-"=~s!.!$&x($_*2+1).$/!ger为了蛋糕?
manatwork 2015年

如果您将开关更改为该开关-p也将起作用:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
manatwork

2

SpecBAS,164

使用撇号快捷方式移至新行

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

格式化以便于阅读

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字节

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

朱莉娅,143个字节

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

非常简单。取消高尔夫:

# 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字节

a=0+io.read() b=string.rep p=print if a==0 then p("Congratulations on your new baby! :D") else p(b(" ",a)..b("$ ",a)..("\n")..b(" ",a)..b("| ",a)) if a<0 or a==1 then p("---\n~~~\n---") else p(b(" ",a-1).."-"..b("-",2*a).."\n"..b(" ",a-1).."~"..b("~",2*a).."\n"..b(" ",a-1).."-"..b("-",2*a))end end

1
欢迎来到PPCG!您的代码似乎给出了错误(attempt to compare string with number),但0+io.read()我之前添加对其进行了修复。通过将print和分配string.rep给单字符变量,您还可以节省很多字节。
DLosc

@DLosc谢谢,好主意:),是的,您很对不起这个错误
FabiF

2

Mathematica,164字节

完全错过了n <0的无蜡烛蛋糕,增加了15个字符

r[a_,b_]:=StringRepeat[a,Abs@b];c=" $ ";t="---";m="~~~";f[n_]:=If[n>0,r[c,n]~~"\n",""]~~r[t,n]~~"\n"~~r[m,n]~~"\n"~~r[t,n];f[0]:="Congratulations on your new baby! :D"

1
欢迎使用PPCG,这一挑战被称为代码高尔夫,您将在其中尝试使代码尽可能短。这可以通过删除不必要的空格并缩短变量名来完成。

谢谢@BetaDecay,我现在安装了快速版本。干杯:D
Martin John Hadley

没问题。看起来不错:)

2

pb,567字节

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

我有些遗憾。

在某些方面,这可能会更好。例如,在确定输入为负数之后,我接着推断出它是哪个负数。这是不必要的,也许有一天我会重新研究此代码以停止它。

不要尝试在pbi的“监视”模式下运行此命令,如果输入负数,则在尝试打印时会崩溃chr(-1)

这是我在编写程序时记下的解释版本。如果您想更好地了解它是如何工作的...祝您好运,如果您知道,请告诉我。

# 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(C#脚本),221字节

显然,这不会赢得任何奖励,但是...

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)))))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.