Ini Ulang Tahunku: D


112

pengantar

Tahun lalu adalah hari ulang tahunku (sungguh!) Dan sayangnya aku harus mengatur pestaku sendiri. Nah, sekarang Anda tahu, tidak bisakah Anda setidaknya membuat kue?

Tantangan

Diberikan bilangan bulat nsebagai input, tulis program lengkap untuk menampilkan kue ulang tahun dengan nlilin menyala.

Keluaran

Sepotong kue dengan satu lilin menyala adalah:

 $
 |
---
~~~
---

Dan sepotong kue dengan tiga lilin menyala adalah:

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

Saya yakin Anda bisa mengatasinya

Namun , untuk input0, Anda harus menampilkan yang berikut:

Congratulations on your new baby! :D

Untuk input yang kurang dari 0, Anda harus mengeluarkan kue tanpa lilin:

---
~~~
---

Tidak ada yang diizinkan untuk menjadi output ke STDERR.

Trailing newlines dan spasi diizinkan.

Kemenangan

Kode terpendek dalam byte menang.

Papan peringkat

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
Selamat ulang tahun!
Dennis

1
apakah memimpin spasi putih (misalnya 2 baris baru) diizinkan untuk kue tanpa lilin?
Level River St

2
@steveverrill Ya

2
@ PaŭloEbermann Kue selebar 3

4
@jvriesem No. Ini kode untuk cuplikan.
sigod

Jawaban:


36

Pyth, 73 72 71 69 67 byte

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

Cobalah online .

Output untuk n <0 berisi 2 baris baru, seperti yang diizinkan dalam komentar . Untuk menghilangkannya, gunakan

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

Kode terkecil, tentu saja, tampaknya paling tidak dapat dibaca manusia.
Sathish Sanjeevi

WTF apakah ini ??? LOL
Starx

18

CJam, 76 75 byte

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

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

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 byte

Revisi 1 (120 byte)

18 byte disimpan berkat manatwork

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

Revisi 0 (138 byte)

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

Untuk bilangan positif: ini diulang melalui string yang sesuai dengan setiap baris kue. Ini digunakan sebagai string pad untuk membenarkan string kosong dengan panjang 2 * n + 1. Ini menghindari setiap komplikasi dengan harus mencetak sejumlah karakter ganjil, ketika pengulangan alami sama dengan nada lilin (yaitu 2 karakter.) n>0&&Diperlukan untuk menghindari mengeluarkan satu kolom jika input nol.

Untuk semua angka: " n<=>0" menemukan tanda input. Pesan bayi adalah output untuk n = 0, dan string kosong untuk positif n (sebagai output yang benar telah diberikan di atas.) Untuk negatif n, Ruby mengartikan -1 sebagai makna elemen terakhir dari array, dan menampilkan candleless kue.


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

1
Satu lagi: ''.rjuste.ljust.
manatwork

@manatwork terima kasih, saya seharusnya melihat itu, tapi saya melakukan ini dengan sangat cepat. Saya tidak tahu tentang ruang backslash dengan% w. Dan e.just: sangat pintar.
Level River St

11

R, 157

write(if(n<-scan()){
z=matrix(c("$","|","-","~","-"),N<-2*max(1,n)+1,5,T)
z[seq(1,N,1+(n>0)),1:2]=" "
z}else"Congratulations on your new baby! :D","",N,F,"")

2
Saya belajar banyak tentang parameter menulis di sana. Brilliant one
Tensibai

10

R, 228 226 220 221 Bytes


Sunting terakhir untuk memperbaiki kue tanpa lilin, selebar yang positif pada kasus negatif, terima kasih @CathG dan @jbaums atas umpan baliknya.

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
Beberapa byte bisa disimpan: <-bisa =, dan bisa Anda gunakan a=b='-~-'.
jbaums

Ho, terima kasih @jbaums lupa yang pertama = dan tidak memikirkan penugasan ganda
Tensibai

Anda memiliki masalah braket di suatu tempat, saya dapatkanError: unexpected '}'
flodel

@ model dikoreksi. Masalah salin / tempel
Tensibai

10

JavaScript ES6, 136

Menggunakan lansiran untuk keluaran - font proporsional buruk dan hasilnya jelek. Dalam cuplikan di bawah ini lansiran dialihkan ke badan yang terpotong, memberikan hasil yang lebih baik.
Baris baru di dalam backticks signifikan dan diperhitungkan.

Tes menjalankan cuplikan di 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>

Kurang golf

n=+prompt(); // get input and convert to number

if (n) { // if n != 0 prepare the cake
   output = [...'$|-~-'].map( // for each char of the five lines
     (c,i) => (i>1 ? c : ' '+c) // in line 0 and 1 symbols are space separated
     // if n < 0 repeat count is 0 for line 0 and 1, 3 for the other
     // if n > 0 repeat count is n for line 0 and 1, n+n+1 for the other
     .repeat(i>1 ? n>0 ? n-~n : 3 : n>0 && n) // 
   ).join`\n`;
}
else {
    output = 'Congratulations on your new baby! :D');
}

alert(output);

Coba ini $('div pre code')[2].innerHTML;)
Vasu Adari

7

R, 279 byte

Versi interaktif (286 byte):

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

Bukan versi interaktif (279 byte):

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 / Oktaf, 194 198 195 189 171 167 byte

Selamat ulang tahun Beta Peluruhan! :)

Terima kasih kepada HamtaroWarrior karena telah memangkas 4 byte!


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

Contoh Berjalan

Saya menempatkan ini ke dalam file skrip bernama happy_birthday.m, kemudian menjalankannya beberapa kali di command prompt. Perhatikan bahwa ketika Anda memasukkan angka negatif, ada dua pengembalian carriage terkemuka, tetapi itu dibolehkan dalam tantangan ini:

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

Kode dengan spasi dan penjelasan

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

Bagian tampilan di bagian akhir mungkin adalah bagian kode yang paling dikaburkan. Ini akan menampilkan matriks karakter 5 baris di mana dua baris pertama terdiri dari lilin dan tiga baris terakhir terdiri dari dasar kue.

Dasar untuk bagian atas layar adalah dua spasi dalam satu kolom diikuti oleh dua spasi lain dalam kolom lain dalam hal usia adalah negatif, atau $,-dalam kolom diikuti oleh dua spasi dalam kolom lain. Ini adalah matriks karakter 2 x 2. Dasar untuk bagian bawah layar adalah vektor kolom tunggal -,~,-yang merupakan matriks karakter 3 x 1.

Perintah tampilan pertama menangani dua baris pertama kue dengan menempatkan dua spasi di kolom pertama, diikuti pasangan kolom $,-atau kolom spasi jika nnegatif, yang diubah menjadi n=1, dan kolom dua ruang lainnya diulang untuk total nkali. Tiga baris berikutnya cukup mereplikasi -,$,-vektor kolom untuk 2*n + 1kali untuk meluruskan lilin bersama dengan basis, sehingga melengkapi gambar.

Cobalah online!

Anda dapat mencoba ini secara online menggunakan kompiler Octave IDEOne: http://ideone.com/4qXDdJ - namun, ada sedikit bug ketika membaca nilai dari input standar. Dengan demikian, skrip sedikit dimodifikasi di mana Anda harus mengubah nilai ndi awal kode. Fork versi baru dari skrip dan ubah ini menjadi nilai integer apa pun yang cocok untuk Anda untuk melihat seperti apa hasilnya.


1
Sayang sekali Anda tidak dapat menyimpan titik ' '.'!
Luis Mendo

1
@LuisMendo - Saya tahu! ... meskipun saya yakin Anda tidak keberatan dengan penggunaan transpose seperti itu :)
rayryeng

1
Ha ha ha. Saya pernah diberitahu di sini bahwa situs ini untuk menyalahgunakan bahasa. Dan saya mengikuti aturan itu dengan setia!
Luis Mendo

1
@LuisMendo - Saya benar-benar ingin menyingkirkan titik ... tetapi tidak bisa karena MATLAB mengartikannya sebagai satu kutipan dalam string :(. Akan menyelamatkan saya beberapa byte ... tapi setelah banyak iterasi, ini adalah yang terbaik yang bisa saya dapatkan
rayryeng

@LuisMendo - berhasil mengecilkannya menjadi 171!
rayryeng

6

JavaScript, 143 153 Bytes

for(v in k=' $ 0 | 0---0~~~0---'.split(+!(n=+prompt(c=''))))c+=k[v].repeat(n<0?1:n)+'\n';alert(n>0?c:n?c.slice(8):'Congratulations on your new baby! :D')

Untuk melihat output dalam font mono space ganti 'alert' dengan 'console.log'


Selamat datang di PPCG! :)

2
Sayangnya ini menampilkan pesan ucapan selamat untuk masukan negatif juga.
manatwork

@BetaDecay tnx :-)
Nainemom

Hak Manatwork ini: / Saya tidak tahu cukup JS untuk membantu

@manatwork ya Anda benar! saya salah paham!
Nainemom

5

Moonscript, 141 byte

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
Selamat Datang di Programming Puzzles dan Code Golf!
Dennis


4

JavaScript ES6, 154 karakter

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

Dan satu lagi (154 juga)

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

Untuk melihat output dalam font monospace (dan memindahkan ouptut ke konsol) gunakan

alert=x=>console.log(x)

4

Mouse , 164 161 byte

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

Mouse jelas bukan pilihan ideal untuk tugas ini, tapi itu menyenangkan.

Tidak Terkumpul:

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

Tumpukan hanya dapat berisi bilangan bulat. !'mengambil bilangan bulat dari tumpukan dan mencetak karakter ASCII dengan kode itu.


4

CoffeeScript, 160 byte

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"

Tidak Terkumpul:

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

Gunakan seperti:

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

Cobalah online: tautan (Berisi beberapa kode tampilan khusus, jadi semuanya terlihat sangat bagus ...)

Ups, hampir lupa! Selamat ulang tahun, @BetaDecay!


4

C, 392 byte

(kesalahan segmentasi dikenal jika tidak ada argumen yang diberikan)

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

Tidak ditambang dan ditempatkan terlalu banyak

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

Tanpa C boilerplate # mendefinisikan dan total tubuh utama 247.
Funmungus

Selamat datang di PPCG! Ini adalah jawaban yang sangat bagus - saya terutama suka dengan penyalahgunaan makro A. Saya memang melihat beberapa ruang lagi yang bisa dihapus, dan Anda bisa menghilangkannya idengan menggunakan cvariabel loop. Juga, setidaknya dengan gcc, termasuk stdio.h atau menentukan jenis pengembalian main () tidak diperlukan: kompiler mengeluh tentang hal itu, tapi hei, ini kode golf. ;)
DLosc

4

Powershell, 139 134 132 126 byte

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

Anda dapat menyimpan 5 byte dengan menggunakan $inputalih-alih $args[0](pertanyaan tidak mengatakan menggunakan argumen alih-alih stdin), dan Anda dapat menggunakan unary +untuk mengonversi ke nomor:$n=+$input;
briantist

+ $ input tampaknya tidak berfungsi - ia mengeluh bahwa $ input adalah enumerator dan tidak memiliki operator tambahan. Namun, $args[0]dapat dan harus menjadi int yang sebenarnya, memungkinkan kita untuk setidaknya menjatuhkan [int].
Justin Dunlap

1
Jadi, ini benar-benar tua, tetapi Anda dapat menyimpan beberapa byte dengan memindahkan input ke dalam ifdan menukar elseuntuk ;exit- 122 byte -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

Ceylon, 322 307 300 282 278 260 byte

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

Yang asli belum golf (dengan asumsi kue negatif memiliki lebar 3 bukannya –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) + "-");
        }
    }
}

Ini menampilkan daftar kondisi dalam pernyataan if, setiap kondisi menentukan nilai yang dapat digunakan dalam kondisi berikut dan dalam tubuh. Karena mereka memiliki exist, kondisi hanya terpenuhi ketika nilai-nilai tidak nol, dan dengan demikian kompiler mengetahui nilai-nilai tidak nol untuk kode berikut. (Jika tidak ada yang dimasukkan (EOF), readline mengembalikan null. Jika parseInteger hits non-integer, itu juga mengembalikan null. Program kami kemudian tidak melakukan apa-apa. Karena perilaku untuk kasus-kasus itu tidak didefinisikan, saya rasa ini tidak apa-apa.)

Kami juga memiliki <=>operator, yang memetakan ke Comparable.comparemetode, dan mengembalikan Comparisonobjek, yaitu salah satu dari equal, smallerdan larger. Kompiler tahu bahwa mereka menguras Comparisontipe, jadi tidak ada elseklausa yang diperlukan dalam switchpernyataan kami .

The repeatmetode kelas String melakukan apa yang diharapkan. Ini sebenarnya diwarisi dari metode yang sama-nama di antarmuka Iterable (seperti string, di samping hal-hal lain, hanya daftar karakter).

Mengganti pengidentifikasi saya dengan satu huruf dan menghapus spasi putih yang tidak dibutuhkan menghasilkan 322 karakter:

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

Mengganti rangkaian printdengan \ns eksplisit (dan satu tunggal print) membawanya ke 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)+"-");}}}

Saya mencoba alias mengimpor repeatsebagai r, tetapi tidak membantu (deklarasi impor menambahkan 40 karakter, dan kami hanya dapat menyimpan 25 dengan mengganti repeatdengan r).

Apa yang sedikit membantu, adalah menggunakan n.signalih-alih n<=>0. Sementara dua ekspresi ini memiliki panjang tekstual yang sama, mereka memiliki berbagai jenis: yang terakhir adalah tipe Comparisonyang disebutkan sebelumnya (yang memiliki tiga nilai smaller, largerdan equal), mantan salah satu memiliki tipe Integer, dengan nilai-nilai -1, 1, 0... dan karena Integermemiliki lebih banyak nilai, kita juga perlu elseklausa. Ini sepanjang 300 karakter:

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

Di sini dengan spasi putih:

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

Kita dapat mengamankan lebih banyak dengan mengundurkan diri tentang pernyataan peralihan dan penggunaan kita if, yang datang ke 282 karakter (= byte):

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

Diformat:

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

Kita dapat mengamankan byte lain dengan menukar case di sekitar, karena >lebih pendek dari ==. "Gangguan" lain adalah yang diulang repeat(n)- kita dapat mendefinisikan fungsi lokal (penutup, ia mengingat ndari blok yang mendefinisikan) dengan nama yang lebih pendek:

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

Ini adalah cara yang lebih singkat untuk menulis ini:

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

Kita bisa menggunakan functionalih-alih tipe pengembalian untuk inferensi tipe, tetapi ini tidak lebih pendek. Ini memberi kita 278 byte:

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

Diformat:

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

Sebenarnya, menggunakan operator thendan elsebukan ifpernyataan memungkinkan kita untuk menyimpan beberapa panggilan print(dan beberapa kawat gigi):

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

Ini hanya 261 byte:

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

(Saya menggunakan runalih-alih buntuk nama fungsi karena cara ini dapat dijalankan dengan ceylon runtanpa melewati nama fungsi.)

Repositori Github saya memiliki versi berkomentar tentang ini .


3

Python 2, 158 byte


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 karakter

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

Contoh dijalankan:

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 byte

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"

Dekat dengan Python penulis :(


3

Perl, 139 127 117 byte

Tidak memerlukan opsi '-n' atau '-p'.

Revisi 3 (dengan terima kasih kepada Dom Hastings di bawah):

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

Revisi 2:

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

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

Berikut adalah versi revisi 3 yang tidak memiliki baris baru kosong di input negatif - 132 byte.

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

Hai, selamat datang! Kupikir saya akan berbagi beberapa cara Anda dapat menghemat beberapa byte! Anda dapat drop kurung di sekitar "Congratulations..."dan jika Anda mengganti ' $',' |','-','~','-'dengan split 0,' $0 |0-0~0-'Anda bisa drop kurung mereka juga. Simpan lainnya diganti $n=<>;$n==0dengan ($n=<>)==0. Anda juga ?1:bisa ||seperti yang Anda katakan $n==0(yaitu 1) atau perhitungan Anda. Semoga itu bisa membantu!
Dom Hastings

Hai, terima kasih untuk itu. Kurung itu bagus, dan mengingatkan saya pada semantik ||sangat membantu - itu mengingatkan saya $=pada dasarnya chompinput, menghilangkan persyaratan untuk tes nilai 0 tertentu. Saya tidak yakin apa yang Anda maksud dengan $n=<>;$n==0- golf saya tidak memilikinya, dan mengingat saya menangani input = 0 case sebagai input ke dalam map{}(), saya tidak yakin bagaimana ini akan berlaku? Ngomong-ngomong, mengambil komentar Anda dan menggunakan $=sebagai variabel saya, ini telah di-golf hingga 117 parbytes. Terima kasih banyak!
phillipo

Tidak masalah sama sekali! Senang telah membantu! Maksud saya adalah bahwa Anda memiliki $n=<>;di awal dan kemudian $n==0di belakang map{}...jadi saya pikir Anda bisa memeriksanya, ($n=<>)==0tetapi jika Anda menggunakan $=Anda mungkin bisa menyusut lebih banyak! Saya selalu lupa yang mana $-atau $=tidak bisa negatif jadi saya tidak ingin menyebutkannya dan salah! :)
Dom Hastings

3

Pip, 74 + 1 = 75 byte

Mengambil usia sebagai argumen baris perintah. Membutuhkan -nbendera.

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

Repositori Github untuk Pip

Argumen baris perintah disimpan di a. Kami membelah "-~-"menjadi daftar karakter dan Ymengelompokkannya ke dalam variabel y. Sisa dari program ini adalah ekspresi ternary yang besar:

  • a?
    Jika abenar (yaitu bukan nol):
    • a<0?yX3
      Jika anegatif, kembalikan ydengan setiap elemen diulang 3 kali:["---";"~~~";"---"]
    • Lain ( apositif):
      • (s.^"$|")Xa
        Pisahkan "$|"menjadi daftar karakter, tambahkan spasi ( s) ke masing-masing, dan ulangi setiap akali elemen yang dihasilkan
      • yX2*a+1
        Ulangi setiap elemen y 2*a+1kali
      • AL
        Tambahkan dua daftar
  • Jika tidak ( anol), kembalikan string ucapan selamat

Di akhir program, -nbendera memastikan bahwa daftar dicetak dengan elemen-elemen pada garis yang berbeda, sehingga menampilkan kue yang berlapis dengan baik.

Berikut langkah-langkah untuk input 2:

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

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

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

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

Selamat ulang tahun!


2

Perl, 144 byte

143 byte kode, ditambah satu byte tambahan untuk -nswitch untuk menangkap stdin.

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).$/!geruntuk kue?
manatwork

Jika Anda mengubah peralihan ke -pini juga akan berfungsi:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
manatwork

2

SpecBAS, 164

Gunakan pintasan tanda kutip untuk pindah ke baris baru

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

Diformat agar mudah dibaca

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 byte

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

Julia, 143 byte

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

Cukup mudah. Tidak Terkumpul:

# 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 Bytes

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

1
Selamat datang di PPCG! Kode Anda seperti berdiri tampaknya memberikan kesalahan ( attempt to compare string with number), tetapi menambahkan 0+sebelum io.read()memperbaikinya untuk saya. Anda juga dapat menyimpan beberapa byte dengan menetapkan printdan string.repke variabel karakter tunggal.
DLosc

@Dosc, terima kasih ide bagus :) dan ya kamu benar dengan kesalahan maaf tentang itu
FabiF

2

Mathematica, 164 Bytes

Benar-benar melewatkan kue tanpa lilin untuk n <0, menambahkan 15 karakter tambahan

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
Selamat datang di PPCG, tantangan ini dikenal sebagai golf kode, tempat Anda mencoba dan membuat kode sesingkat mungkin. Ini dapat dilakukan dengan menghapus spasi yang tidak perlu dan memperpendek nama variabel.

Terima kasih @BetaDecay, saya mendapatkan versi lebih cepat .. meminimalkan sekarang. Cheers: D
Martin John Hadley

Tidak masalah. Terlihat bagus :)

2

pb , 567 byte

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

Saya punya beberapa penyesalan.

Ada beberapa cara agar ini bisa lebih baik. Misalnya, setelah mengetahui bahwa inputnya negatif, saya kemudian melanjutkan untuk menyimpulkan angka negatif yang mana. Ini tidak perlu, dan mungkin suatu hari saya akan menyelam kembali ke kode ini untuk menghentikannya.

Jangan mencoba menjalankan ini dalam mode "watch" pbi, jika Anda memasukkan negatif, ia akan macet ketika mencoba mencetak chr(-1).

Inilah versi versi yang dijelaskan di mana saya membuat catatan saat menulis program. Jika Anda ingin lebih memahami cara kerjanya ... semoga berhasil, dan beri tahu saya jika Anda mengetahuinya.

# 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 (script C #), 221 byte

Jelas ini tidak akan memenangkan hadiah apa pun, tapi ...

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)))))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.