私の誕生日です:D


112

前書き

昨年は私の誕生日でした(本当に!)悲しいことに、私は自分のパーティーを開催しなければなりませんでした。さて、あなたは知っています、少なくともケーキを作ることができませんでしたか?

チャレンジ

n入力として整数を指定し、ろうそくをつけた誕生日ケーキを出力する完全なプログラムを作成nします。

出力

ろうそくを1本つけたケーキは次のとおりです。

 $
 |
---
~~~
---

そして、3本のろうそくをつけたケーキは次のとおりです。

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

あなたはそれからそれを解決できると確信しています

ただし、入力の0場合、次を出力する必要があります。

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
お誕生日おめでとうございます!
デニス

1
ろうそくのないケーキの先頭の空白(たとえば、2つの改行)は許可されていますか?
レベルリバーセント

2
はい@steveverrill

2
@PaŭloEbermann3幅のケーキ

4
@jvriesemいいえ。スニペットのコードです。
シゴ

回答:


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

もちろん、最小のコードは人間が読むのが最も少ないようです。
サティシュサンジーヴィ

これはいったい何なのですか???笑
スタークス

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

ルビー、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に右揃えするためのパッド文字列として使用されます。これn>0&&により、入力ゼロの場合に単一の列を出力するのを避けるために、自然な繰り返しがローソクのピッチ(つまり2文字)に等しい場合に、奇数文字を印刷しなければならない複雑さを回避します。

すべての数値の場合: " n<=>0"は入力の符号を見つけます。赤ん坊のメッセージはn = 0に対して出力され、正の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]
マナトワーク

1
もう1つ:''.rjuste.ljust
マナトワーク

@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
私はそこでパラメータを書くことについて多くを学んでいます。華麗な1つ
天白梅

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

ホーは、感謝の@jbaumsは、デュアル逢引のtthough「最初のを忘れて=とdidnの
Tensibai

あなたはどこかにブラケットの問題があります、私は得るError: unexpected '}'
-flodel

@flodelが修正されました。コピー/貼り付けの問題
テンシバイ

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

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バイト

お誕生日おめでとうベータ崩壊!:)

4バイトを削ってくれたHamtaroWarriorに感謝します!


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し、コマンドプロンプトで数回実行しました。負の数を入力すると、先頭に2つの復帰がありますが、このチャレンジでは許可されていることに注意してください。

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

末尾の表示部分は、おそらくコードの最も難読化された部分です。これにより、最初の2行がキャンドルで構成され、最後の3行がケーキのベースで構成される5行の文字マトリックスが表示されます。

表示の上半分の基準は、年齢が負の場合$,-、列に2つのスペースがあり、その後に別の列に2つのスペースが続くか、列にaが続き、別の列に2つのスペースが続くことです。これは、2 x 2文字のマトリックスです。表示の下半分の基本-,~,-は、3 x 1文字の行列である単一の列ベクトルです。

表示コマンドは最初に、最初の列に2つのスペースを配置することにより、ケーキの最初の2行に取り組みます。その後、負の$,-場合nはスペースの列またはスペースの列のペアがに変更されn=1ます。n回の合計。次の3行は単純に-,$,-列ベクトルを複製し2*n + 1、ろうそくをベースに合わせて、画像を完成させます。

オンラインでお試しください!

IDEOneのOctaveコンパイラを使用して、これをオンラインで試すことができます:http ://ideone.com/4qXDdJ- ただし、標準入力から値を読み込む場合、わずかなバグがあります。そのため、スクリプトはnコードの先頭の値を変更する必要がある箇所でわずかに変更されます。スクリプトの新しいバージョンをフォークし、これをあなたに合った整数値に変更して、出力がどのように見えるかを確認します。


1
残念ながら、ドットを保存できません' '.'
ルイスメンドー

1
@LuisMendo-わかっています!...でも、そのように転置を使用することに
異議を唱える

1
ははは。私はかつて、このサイトは言語を乱用するためのものだと言われました。そして、私は忠実にそのルールに従います!
ルイスメンドー

1
@LuisMendo-ドットを削除したかったのですが、MATLABが文字列内の単一引用符として解釈するため、できませんでした:(。私が思いつくことができる最高.
rayryeng

@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」に置き換えます


PPCGへようこそ!:)

2
悲しいことに、これは否定的な入力に対してもお祝いのメッセージを表示します。
マナトワーク

@BetaDecay tnx :-)
Nainemom

/私は助けるために十分なJSを知らない:Manatworkの権利

@manatworkはい、そうです!誤解した!
-Nainemom

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
プログラミングパズルとコードゴルフへようこそ!
デニス


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

そしてもう1つ(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ボイラープレートを使用しない場合、#definesと本体の合計は247です
。– Funmungus

PPCGへようこそ!これは本当に良い答えAです。特に、マクロの悪用が好きです。削除できるスペースがさらに2つありますが、代わりにループ変数iを使用cして削除できます。また、少なくともgccでは、stdio.hを含めたり、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'}

あなたは使用して5つのバイトを保存することができます$input代わりに$args[0](質問ではなく、標準入力の引数を使用することを言っていない)、あなたは単項使用できる+数に変換するには:$n=+$input;
briantist

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

まだゴルフされていないオリジナル(ネガティブケーキの幅が–2・n + 1ではなく3であると仮定):

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オブジェクト、つまりequalsmallerおよびのいずれかを返す演算子がありますlarger。コンパイラは、これらがComparison型を使い果たすことを知っているのでelseswitchステートメントに句は必要ありません。

repeatクラスStringメソッドは、期待することを行います。実際には、Iterableインターフェースの同じ名前のメソッドから継承されます(文字列は、他のものと並んで、単なる文字のリストです)。

識別子を1文字の識別子に置き換え、不要な空白を削除すると、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(および1つの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)+"-");}}}

repeatasのエイリアスインポートを試みましrたが、役に立ちません(インポート宣言では40文字が追加されますが、に置き換えるrepeatと25文字しか保存できませんr)。

わずかに役立つのは、のn.sign代わりに使用することですn<=>0。これら2つの式が同じテキストの長さを持っていますが、彼らはさまざまな種類があります。後者のタイプがある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ステートメントについて再署名し、を使用ifして282文字(=バイト)になると、さらに安全になります。

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

の場合>よりも短いので、ケースを入れ替えることで別のバイトを保護できます==。もう1つの「迷惑」は繰り返され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)またはあなたの計算になる可能性があります。お役に立てば幸いです!
ドムヘイスティングス

こんにちは、ありがとうございます。これらの括弧は良いものであり、セマンティクスを||思い出させることは非常に役立ちます。$=基本的chompに入力を思い出させ、特定の0値テストの要件を排除しました。私はあなたが何を意味するのか分かり$n=<>;$n==0ません-私のゴルフにはそれがありません、そしてに入力としてinput = 0のケースを処理すると、map{}()これがどのように適用されるのか分かりませんか?とにかく、コメントを$=受け取り、変数として使用すると、これは117パーバイトになりました。どうもありがとう!
フィリポ

全く問題なし!助けてくれてうれしい!つまり$n=<>;、最初と最後$n==0にあるmap{}...ので、チェックをすることができると思いますが、代わりに($n=<>)==0使用して$=いる場合は、それをさらに縮小できる可能性があります!ネガティブになっ$-たり$=、ネガティブになれないことをいつも忘れているので、それについて言及したり、間違ったりしたくありませんでした!:)
ドムヘイスティングス

3

ピップ、74 + 1 = 75バイト

年齢をコマンドライン引数として受け取ります。-nフラグが必要です。

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

PipのGithubリポジトリ

コマンドライン引数はに保存されaます。"-~-"文字のリストに分割し、Yそれを変数に追加しますy。プログラムの残りの部分は、大きな3進表現です。

  • a?
    a真である場合(つまり、ゼロでない場合):
    • a<0?yX3
      aが負の場合y、各要素を3回繰り返して戻ります。["---";"~~~";"---"]
    • その他(a正):
      • (s.^"$|")Xa
        分割"$|"文字のリストの中に、(スペースを付加s)それぞれに、それぞれの結果の要素の繰り返しa回数を
      • yX2*a+1
        y 2*a+1時間の各要素を繰り返す
      • AL
        2つのリストを追加する
  • それ以外の場合(aゼロ)、お祝いの文字列を返します

プログラムの最後に、-nフラグはリストが個別の行の要素とともに印刷されるようにし、適切に階層化されたケーキを表示します。

入力の手順は2次のとおりです。

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

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

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

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

お誕生日おめでとうございます!


2

Perl、144バイト

143バイトのコードと、-nスイッチがstdinをキャプチャするための余分な1バイト。

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ケーキ用?
マナトワーク

スイッチを-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、1文字の変数を割り当てることにより、かなりのバイトを節約できます。
DLosc

おかげで良いアイデア@DLosc :)とええuがそのことについて申し訳ありませんのエラーで正しかった
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
マーティンジョン・ハドリー

問題ない。ルックスの良い:)

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)))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.