Bu benim doğum günüm: D


112

Giriş

Geçen yıl doğum günümdü (gerçekten!) Ve ne yazık ki kendi partimi düzenlemek zorunda kaldım. Şey, şimdi biliyorsun, en azından pastayı yapamaz mısın?

Meydan okuma

nGiriş olarak bir tamsayı verildiğinde , mumlar ile birlikte bir doğum günü pastası çıkarmak için tam bir program yazın n.

Çıktı

Üzerinde bir mum bulunan bir dilim pasta:

 $
 |
---
~~~
---

Ve üzerinde üç mum bulunan bir dilim pasta:

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

Bundan emin olabilirsin

Ancak , giriş0için aşağıdakileri çıkarmanız gerekir:

Congratulations on your new baby! :D

Daha küçük girdiler için 0, mumsuz bir kek çıkarmalısınız:

---
~~~
---

STDERR'ye hiçbir şeyin çıkmasına izin verilmez.

İzleyen yeni satırlara ve boşluklara izin verilir.

Kazanan

Bayt cinsinden en kısa kod kazanır.

Liderler Sıralaması

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
İyi ki doğdun!
Dennis,

1
mumsuz pasta için önde gelen boşluklara (örneğin 2 yeni hat) izin verilir mi?
Seviye Nehri St

2
@steveverrill Evet

2
@ PaŭloEbermann 3 genişlikte bir pasta

4
@jvriesem No. Bu kod parçacığının kodu.
sigod

Yanıtlar:


36

Pyth, 73 72 71 69 67 bayt

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

Çevrimiçi deneyin .

N <0 çıktısı, yorumlarda izin verildiği gibi 2 öncü yeni satır içerir . Onlardan kurtulmak için kullanın

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

Tabii ki en küçük kod en az insan tarafından okunabilir gibi görünüyor.
Sathish Sanjeevi

Buda ne böyle??? LOL
Starx

18

CJam, 76 75 bayt

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

CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

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 bayt

Revizyon 1 (120 bayt)

Manatwork sayesinde 18 bayt kurtarıldı

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

Revizyon 0 (138 bayt)

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

Pozitif sayılar için: Bu, pastanın her çizgisine karşılık gelen bir ip boyunca yinelenir. Bunlar, boş dizgiyi 2 * n + 1 uzunluğunda sağa yaslamak için ped dizeleri olarak kullanılır. Bu, doğal bir tekrarlama, n>0&&sıfır girişinde tek bir sütunun basılmasını önlemek için gerekli olduğunda, doğal karakter tekrarı mumların aralığına eşit olduğunda (örneğin, 2 karakter) gerektiğinde , tek sayıda karakter basmak zorunda kalmaktan kaynaklanan herhangi bir karmaşıklığı önler .

Tüm sayılar için: " n<=>0" girişin işaretini bulur. Bebek mesajı n = 0 için çıktı ve pozitif n için boş bir dize (yukarıda doğru çıktı zaten verildi.) Negatif n için, Ruby -1'i dizinin son elemanı olarak yorumlar ve mumsuz çıktılar kek.


1
Çok fazla yok putsmu? n=gets.to_i puts ['Congratulations on your new baby! :D',%w{\ $ \ | - ~ -}.map{|e|''.rjust 2*n+1,e},'--- ~~~ ---'][n<=>0]
Manat çalışması

1
Bir tane daha: ''.rjuste.ljust.
Manatwork

@ yönetim işi, bunu fark etmeliydim, ama bunu çok hızlı yaptım. % W ile ters eğik çizgi uzayını bilmiyordum. Ve e.just: çok zekice.
Seviye 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
Orada yazma parametreleri hakkında çok şey öğreniyorum. Parlak bir
Tensibai

10

R, 228 226 220 221 Bayt


Mumsuz kek düzeltmek için son düzenleme, olumsuz durumlarda pozitif olanı kadar geniş, teşekkürler @CathG ve @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
Birkaç bayt kaydedilebilir: <-olabilir =ve kullanabilirsiniz a=b='-~-'.
jbaums

Ho, teşekkürler, jbaums ilkini unutur = ve ikili görevlendirmeye rağmen yapmadı
Tensibai

Bir yerde bir parantez sorunun var, anladımError: unexpected '}'
flodel

@ flodel düzeltildi. Kopyala / yapıştır sorunu
Tensibai

10

JavaScript ES6, 136

Çıktı için uyarı kullanma - hatalı orantılı yazı tipi ve sonuç çirkin. Alttaki snippet'te uyarı, kesilen gövdeye yönlendirilir ve daha iyi sonuç elde edilir.
Geri tepme çubukları içindeki yeni hat önemlidir ve sayılır.

Snippet'in Firefox'ta çalışmasını test edin.

/* 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>

Daha az golf oynadı

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

Bunu deneyin $('div pre code')[2].innerHTML;)
Vasu Adari 11:15

7

R, 279 bayt

Etkileşimli sürüm (286 bytes):

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

Etkileşimli sürüm değil (279 bytes):

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

Mutlu yıllar sana Beta Çürüğü! :)

4 byte'ı tıraş eden HamtaroWarrior'a teşekkürler!


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

Örnek çalışır

Bunu denilen bir komut dosyasına yerleştirdim happy_birthday.m, ardından komut isteminde birkaç kez çalıştırdım. Negatif bir sayı girdiğinizde, iki satır başı iadesi bulunduğunu, ancak bu zorluğa izin verildiğini unutmayın.

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

Boşluk ve açıklama içeren kod

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

Sonunda görünen kısım muhtemelen kodun en karışık kısmıdır. Bu, ilk iki sıranın mumlardan oluştuğu ve son üç sıranın da pastanın tabanından oluştuğu 5 sıralı bir karakter matrisini gösterecektir.

Ekranın üst yarısının temeli, ya bir sütunda iki boşluk, sonra da yaşın negatif olması durumunda başka bir sütunda iki boşluk, ya da $,-bir sütunda ve ardından başka bir sütunda iki boşluk. Bu 2 x 2 karakterlik bir matristir. Ekranın alt yarısının temeli -,~,-, 3 x 1 karakterlik bir matris olan tek bir sütun vektörüdür .

Ekran komutu ilk kolonu çiftleri, ardından birinci sütunda iki boşluk yerleştirerek kek ilk iki sıra ele $,-veya boşluklar kolonu ndeğiştirildi alır negatif olan n=1ve iki boşlukların diğer bir kolon için tekrarlanır toplam nkez. Sonraki üç satır , mumları tabanla birlikte hizalamak -,$,-için sütun vektörünü basitçe kopyalar 2*n + 1, böylece resmi tamamlar.

Çevrimiçi deneyin!

Bunu çevrimiçi olarak IDEOne'un Octave derleyicisini kullanarak deneyebilirsiniz: http://ideone.com/4qXDdJ - ancak standart girişten gelen değerleri okurken küçük bir hata vardır. Bu nedenle, komut dosyası, nkodun başındaki değerini değiştirmek zorunda olduğunuz yerde biraz değiştirilir . Komut dosyasının yeni bir versiyonunu kullanın ve çıktının nasıl göründüğünü görmek için bunu tamsayı değerine uygun olan şekilde değiştirin.


1
Yazık ki noktaya giremezsin ' '.'!
Luis Mendo

1
@LuisMendo - Biliyorum! ... yine de bu transpozisyonun kullanımına itiraz etmediğinizden emin olmama rağmen :)
rayryeng

1
Hahaha. Bir keresinde burada bu sitenin dili kötüye kullandığı söylendi . Ve ben bu kuralı sadık bir şekilde takip ediyorum!
Luis Mendo

1
@LuisMendo - Noktadan gerçekten kurtulmak istemiştim ... ama yapamadığı için MATLAB, dizgede tek bir alıntı olarak yorumladı :(. Beni birkaç bayttan kurtaracaktı ... gelebildiğim en iyisi
rayryeng

@LuisMendo - 171'e düşürmeyi başardı!
rayryeng 09:15

6

JavaScript, 143 153 Bayt

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

Mono boşluk fontunda çıktıyı görmek için 'alert' yerine 'console.log' yazın


PPCG'ye Hoşgeldiniz! :)

2
Ne yazık ki, bu da negatif girdi için kutlama mesajını görüntüler.
Manatwork

@BetaDecay tnx :-)
Nainemom

Manatwork'ün hakkı: / Yardımcı olacak yeterince JS bilmiyorum

@ manatwork evet haklısın! yanlış anlamışım!
Nainemom

5

Metni, 141 bayt

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
Programlama Bulmacaları ve Code Golf'a Hoş Geldiniz!
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")

Ve bir tane daha (154 de)

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

Monospace fontunda çıktı görmek için (ve ouptut'u konsola taşıyın) kullanın.

alert=x=>console.log(x)

4

Fare , 164 161 bayt

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

Fare açıkça bu görev için ideal bir seçim değil, ama eğlenceliydi.

Ungolfed:

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

Yığın yalnızca tam sayı içerebilir. !'yığından bir tamsayı alır ve bu kodla ASCII karakterini yazdırır.


4

CoffeeScript, 160 bayt

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"

Ungolfed:

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

Gibi kullanı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

Çevrimiçi deneyin: bağlantı (Bazı özel ekran kodları içerir, bu yüzden her şey çok güzel görünüyor ...)

Ooops, neredeyse unuttum! İyi ki doğdun, @ BetaDecay!


4

C, 392 bayt

(argüman verilmezse bilinen segmentasyon hatası)

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

Unminified ve bolca aralıklı

#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
kazanı

PPCG'ye Hoşgeldiniz! Bu gerçekten çok iyi bir cevap - özellikle makro suistimali severim A. Kaldırılabilecek birkaç boşluk görüyorum ve bunun yerine loop değişkenini ikullanarak kurtulabilirsiniz c. Ayrıca, en azından stdio.h dahil gcc ile veya main () 'in dönüş türünü belirtmek gerekli değildir: derleyici bundan şikayet eder, ancak hey, bu kod golf. ;)
DLosc

4

Powershell, 139 134 132 126 bayt

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

Bunun $inputyerine 5 bayt tasarruf edebilirsiniz $args[0](soru stdin yerine argüman kullanmak söylemez) ve +bir sayıya dönüştürmek için unary kullanabilirsiniz :$n=+$input;
briantist

+ $ girdisi çalışmıyor gibi görünüyordu - $ girdisinin bir numaralandırıcı olduğundan ve ek bir operatör olmadığından şikayet ediyordu. Ancak, $args[0]en azından düşürmemize izin veren gerçek bir int olabilir ve olması gerekir [int].
Justin Dunlap

1
Yani, bu gerçekten eski, ama girişi bir yere taşıyarak ifve elsebir ;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 12:16

4

Ceylon, 322 307 300 282 278 260 bayt

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

Henüz golf oynamayan orijinal (negatif keklerin –2 · n + 1 yerine 3 genişliğe sahip olduğu varsayılmaktadır):

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

Bu, if ifadesinde, her koşul aşağıdaki koşullarda ve vücutta kullanılabilir bir değeri tanımlayan koşul listesini gösterir. Sahip oldukları için exist, koşul yalnızca değerler boş olmadığında yerine getirilir ve bu nedenle derleyici, aşağıdaki kod için değerlerin boş olmadığını bilir. (Eğer hiçbir şey girilmezse (EOF), readline null değerini döndürür. ParseInteger tamsayı olmayan bir isabet alırsa, aynı zamanda null değerini döndürür. Programımız hiçbir şey yapmaz.

Ayrıca elimizdeki <=>eşleştiren operatörü, Comparable.compareyöntemin ve bir döner Comparison, nesneyi birini yani equal, smallerve larger. Derleyici bu Comparisontiplerin yorulduğunu biliyor, bu yüzden elsedeyimimizde herhangi bir maddeye gerek yok switch.

repeatSınıf dize yöntemi bir beklenebilir yapar. Aslında yinelenebilir arabirimindeki aynı adlı yöntemden miras alınır (bir dize olduğu gibi, diğer öğelerin yanı sıra, sadece bir karakter listesidir).

Tanımlayıcılarımı tek harfli olanlarla değiştirmek ve gereksiz beyaz boşluğu kaldırmak 322 karakter verir:

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

Seriyi printaçık \ns (ve bir tek print) ile değiştirmek onu 307'ye düşürür:

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

Ben takma-ithal çalıştı repeatolarak r, ancak (ithalat beyanı 40 karakteri ekler ve biz sadece değiştirerek 25 kaydedebilirsiniz yardımcı olmuyor repeatile r).

Biraz yardımcı olan, n.signyerine kullanıyor n<=>0. Bu iki değer aynı metinsel uzunluğa sahip olsa da, farklı türleri vardır: İkinci bir tür olan Comparison(üç değerlere sahip olan daha önce belirtildiği smaller, largerve equal), eski bir türü olan Integerdeğerlerle, -1, 1, 0... ve çünkü Integervardır çok daha fazla değer, aynı zamanda bir elsemaddeye ihtiyacımız var Bu 300 karakter uzunluğunda:

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

İşte boşluk ile:

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 deyimimizden istifa edip if, 282 karaktere (= bytes) ulaşarak biraz daha güvenli olabiliriz :

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

biçimlendirilmiş:

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

Durumlardan >daha kısa olduğu için etraftakileri değiştirerek başka bir baytı güvende tutabiliriz ==. Başka bir "sıkıntı" tekrarlanmakta repeat(n)- yerel bir işlev tanımlayabiliriz (bir kapatma, ntanımlayıcı bloktan hatırlar ), daha kısa bir adla:

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

Bu, bunu yazmak için daha kısa bir yoldur:

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

functionTür çıkarımı için dönüş türü yerine kullanabiliriz , ancak bu daha kısa değildir. Bu bize 278 bayt verir:

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

biçimlendirilmiş:

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

Aslında, ifadelerin yerine thenand elseoperatörlerini kullanmak, ifbazı çağrıları print(ve bazı kaşlı ayraçları) kaydetmemize izin verir :

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

Bu sadece 261 bayttır:

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

( İşlev ismi runyerine kullandım bçünkü bu şekilde ceylon runişlev ismi geçmeden çalıştırılabilir .)

Github havuzumun yorumlanmış bir sürümü var .


3

Python 2, 158 bayt


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

Örnek çalışma:

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 bayt

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"

Yazarın Python'una yakın :(


3

Perl, 139 127 117 bayt

'-N' veya '-p' seçenekleri gerektirmez.

Revizyon 3 (aşağıdaki Dom Hastings sayesinde):

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

2. revizyon:

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

1. revizyon:

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

Burada, 132 girdi olarak, negatif girişte önde gelen boş yeni satırlara sahip olmayan bir revizyon 3'ün bir versiyonu.

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

Selam hoşgeldin! Birkaç byte tasarruf etmenin birkaç yolunu paylaşacağımı düşündüm! Etrafa parantez bırakın "Congratulations..."ve değiştirirseniz ' $',' |','-','~','-'ile split 0,' $0 |0-0~0-'siz de bu parantez bırakabilirsiniz. Başka kaydet yerini alıyor $n=<>;$n==0ile ($n=<>)==0. Ayrıca sizin ?1:olabilir ||diyorsun olurdum olarak $n==0(olduğu 1) veya hesaplama. Umarım yardımcı olur!
Dom Hastings,

Hey orada, bunun için teşekkürler. Bu konsollar iyi biridir ve sematiğinde Hatırlattığın ||çok yararlıdır - bu hatırlattı $=temelde için chompspesifik 0 değeri testler için gereksinimi ortadan kaldırarak, giriş. Ne demek istediğinizi anlamadığımdan emin değilim $n=<>;$n==0- golfumda buna sahip değil ve girdi = 0 davasını girdi olarak ele map{}()aldığımda bunun nasıl uygulanacağından emin değilim? Her neyse, yorumlarınızı alarak ve $=benim değişkenim olarak kullanarak , bu 117 parite indirildi. Çok teşekkürler!
phillipo 9:15

Hiç sorun değil! Yardım ettiğim için mutluyum! Kastettiğim şuydu $n=<>;, başlangıçta ve daha sonra $n==0da bunun arkasındaki map{}...çekiniz vardı, sanırım çekiniz olabilirdi, ($n=<>)==0ama $=bunun yerine kullanıyorsanız daha fazla küçültebilirsiniz! Hangisini olumsuz $-veya $=olumsuz olamayacağımı her zaman unuturum, bu yüzden bunu söylemek ve yanlış olmak istemedim! :)
Dom Hastings

3

Pip, 74 + 1 = 75 bayt

Yaşı komut satırı argümanı olarak alır. -nBayrağı gerektirir .

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

Pip için Github deposu

Komut satırı argümanı içinde saklanır a. "-~-"Bir karakter listesine bölün ve Yonu değişkene dahil ederiz y. Programın geri kalanı büyük bir üçlü ifadesidir:

  • a?
    Eğer atruthy ise (yani sıfır değil):
    • a<0?yX3
      Eğer anegatif geri dönüş yher bir elemanı ile 3 kez tekrar:["---";"~~~";"---"]
    • Başka ( apozitif):
      • (s.^"$|")Xa
        Bölünmüş "$|"bir karakter listesine, başa getirebilir boşluk ( s) her birine ve her ortaya çıkan eleman tekrarlamak akez
      • yX2*a+1
        Her bir öğesini tekrarlayın y 2*a+1kez
      • AL
        İki listeyi ekle
  • Başka ( asıfır), tebrik dizesini döndür

Programın sonunda -nbayrak, listelerin ayrı satırlardaki öğelerle yazdırılmasını ve böylece düzgün şekilde katmanlı bir pasta gösterilmesini sağlar.

İşte bir giriş için adımlar 2:

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

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

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

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

İyi ki doğdun!


2

Perl, 144 bayt

143 bayt kod, artı -nanahtarın stdin yakalaması için bir ekstra bayt .

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).$/!gerpasta için mi?
Manatwork

Bu düğmeyi değiştirirseniz, -paynı zamanda çalışacaktır:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
Manatwork

2

SpecBAS, 164

Yeni satıra geçmek için kesme işareti kısayolunu kullanır

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

Daha kolay okumak için biçimlendirilmiş

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 bayt

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 bayt

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

Oldukça basit. Ungolfed:

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

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'ye Hoşgeldiniz! Olduğu gibi kodunuz bir hata ( attempt to compare string with number) veriyor gibi görünüyor , ancak daha 0+önce ekleyerek io.read()benim için düzeltir. Ayrıca printve string.reptek karakterli değişkenleri atayarak epeyce bayt kaydedebilirsiniz .
DLosc

@DLosc teşekkürler iyi fikir :) ve evet, bu konuda üzgünüm haklıydınız
FabiF

2

Mathematica, 164 Bayt

Tamamen n <0 için mumsuz kekleri tamamen özledim, 15 karakter daha ekledik

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'ye hoş geldiniz, bu meydan okuma kodunuzu olabildiğince kısa tutmaya çalıştığınız kod golfü olarak bilinir. Bu, gereksiz boşlukları kaldırarak ve değişken adlarını kısaltarak yapılabilir.

Thanks @BetaDecay Ben hızlı bir versiyonunu alıyordum .. şimdi minimize ediyor. Şerefe: D
Martin John Hadley

Sorun değil. İyi görünüyor :)

2

pb , 567 bayt

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

Pişman olduğum bazı şeyler var.

Bunun daha iyi olabileceği bazı yollar var. Örneğin, girişin negatif olduğunu belirledikten sonra, hangi negatif sayının olduğunu tespit etmeye devam ediyorum. Bu gereksiz, ve belki bir gün onu durdurmak için tekrar bu koda dalacağım.

Bunu pbi'nin "izle" modunda çalıştırmayı denemeyin, negatif girerseniz yazdırmaya çalıştığında kilitlenir chr(-1).

İşte program yazarken not aldığım açıklamalı sürüm . Nasıl çalıştığını daha iyi anlamak istersen ... iyi şanslar ve anlarsan haberim olsun.

# 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 # script), 221 bayt

Açıkçası bu herhangi bir ödül kazanamayacak ama ...

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)))))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.