มันเป็นวันเกิดของฉัน: D


112

บทนำ

ปีที่แล้วเป็นวันเกิดของฉัน (จริง ๆ !) และน่าเศร้าที่ฉันต้องจัดปาร์ตี้ของตัวเอง ตอนนี้คุณรู้แล้วอย่างน้อยคุณก็ไม่สามารถทำเค้กได้หรือ

ท้าทาย

ระบุจำนวนเต็มnเป็นอินพุตให้เขียนโปรแกรมเต็มรูปแบบเพื่อแสดงเค้กวันเกิดพร้อมกับnเทียน

เอาท์พุต

เค้กชิ้นหนึ่งที่มีเทียนหนึ่งอันคือ:

 $
 |
---
~~~
---

และเค้กที่มีเทียนสามชิ้นบนคือ:

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

ฉันแน่ใจว่าคุณสามารถทำงานได้จากที่

อย่างไรก็ตามสำหรับอินพุต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ŭloEbermannเค้กที่มีความกว้าง 3

4
@jvriesem ไม่เป็นรหัสสำหรับตัวอย่าง
sigod

คำตอบ:


36

Pyth, 73 72 71 69 67 ไบต์

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

ลองมันออนไลน์

เอาท์พุทสำหรับ n <0 มี 2 บรรทัดใหม่ชั้นนำที่ได้รับอนุญาตในการแสดงความคิดเห็น เพื่อกำจัดพวกเขาใช้

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

รหัสที่เล็กที่สุดของหลักสูตรดูเหมือนจะเป็นมนุษย์น้อยที่สุดที่อ่านได้
Sathish Sanjeevi

WTF คืออะไร ??? LOL
Starx

18

CJam, 76 75 ไบต์

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

ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

ri           e# Read an integer from STDIN.
_W>          e# Check if it is greater than -1.
\_           e# Swap input and Boolean and copy the input.
1e>)         e# Take the maximum of input and 1 and increment the result.
             e# Let's call the result R.
" $ |--~~--" e# Push that string.
2/           e# Split it into [" $" " |" "--" "~~" "--"].
f*           e# Repeat each chunk R times.
Wf<          e# Discard the last character of each repeated chunk.
N*           e# Join the repreated chunks, separating by linefeeds.

"Congratulations on your new baby! :D"

?            e# If the input is non-zero, select the cake; else, keep the string.
_8>          e# Push a copy and discard the first 8 characters (single candle).
?            e# Select the unmodified cake/string if the input was non-negative,
             e# a candleless cake otehrwise.

11

ทับทิม 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]

สำหรับตัวเลขที่เป็นบวก: จะวนซ้ำผ่านสตริงที่สอดคล้องกับแต่ละบรรทัดของเค้ก สิ่งเหล่านี้ถูกใช้เป็นสตริงของ pad เพื่อจัดชิดสตริงว่างให้ยาว 2 * n + 1 วิธีนี้จะช่วยหลีกเลี่ยงภาวะแทรกซ้อนใด ๆ ที่ต้องพิมพ์จำนวนอักขระแปลก ๆ เมื่อการทำซ้ำตามธรรมชาติมีค่าเท่ากับระดับเสียงเทียน (เช่น 2 ตัวอักษร) n>0&&จำเป็นต้องหลีกเลี่ยงการแสดงผลคอลัมน์เดียวในกรณีที่ป้อนศูนย์

สำหรับตัวเลขทั้งหมด: " 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
หนึ่งที่เพิ่มเติม: →''.rjust e.ljust
จัดการ

@ การจัดการขอบคุณฉันควรจะเห็นว่า แต่ฉันทำอย่างนี้อย่างรวดเร็ว ฉันไม่ทราบเกี่ยวกับพื้นที่ทับขวาด้วย% 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
ฉันเรียนรู้มากมายเกี่ยวกับพารามิเตอร์การเขียนที่นั่น Brilliant one
Tensibai

10

R, 228 226 220 221 ไบต์


การแก้ไขครั้งล่าสุดเพื่อแก้ไขเค้กที่ปราศจากแสงเทียนมีความกว้างเท่ากับบวกในกรณีลบขอบคุณ @CathG และ @jbaums สำหรับความคิดเห็น

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

1
คู่ของไบต์สามารถบันทึก: <-สามารถและคุณสามารถใช้= a=b='-~-'
jbaums

โฮขอบคุณ @ jbaums ลืมคนแรก = และไม่ได้ทำภารกิจสองอย่าง
Tensibai

คุณมีปัญหาในการจัดวางที่ไหนสักแห่งฉันได้Error: unexpected '}'
flodel

แก้ไข @flodel แล้ว คัดลอก / วางปัญหา
Tensibai

10

JavaScript ES6, 136

การใช้การแจ้งเตือนสำหรับเอาต์พุต - แบบอักษรที่มีสัดส่วนไม่ดีและผลลัพธ์นั้นน่าเกลียด ในตัวอย่างด้านล่างการแจ้งเตือนจะถูกเปลี่ยนเส้นทางไปยังเนื้อหาที่จัดไว้ให้ผลลัพธ์ที่ดีกว่า
บรรทัดใหม่ภายใน backticks มีความสำคัญและนับ

ทดสอบการเรียกใช้ตัวอย่างข้อมูลใน 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>

น้อย golfed

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 / Octave, 194 198 195 189 171 167 ไบต์

สุขสันต์วันเกิดให้คุณเบต้าสลาย! :)

ขอบคุณ HamtaroWarrior สำหรับการกำจัด 4 ไบต์!


n=input('');m='$|'.';d='  '.';if(n==0)disp('Congratulations on your new baby! :D'),break;elseif(n<0)m=d;n=1;end,disp([[d repmat([m d],1,n)];repmat('-~-'.',1,2*n+1)]);

ตัวอย่างการวิ่ง

ฉันวางสิ่งนี้ลงในไฟล์สคริปต์ที่เรียกว่าhappy_birthday.mจากนั้นรันสองสามครั้งในพรอมต์คำสั่ง โปรดทราบว่าเมื่อคุณป้อนตัวเลขติดลบจะมีการขึ้นบรรทัดใหม่สองครั้ง แต่สิ่งที่ได้รับอนุญาตในการท้าทายนี้:

>> happy_birthday
-1


---
~~~
---
>> happy_birthday
0
Congratulations on your new baby! :D
>> happy_birthday
1
 $ 
 | 
---
~~~
---
>> happy_birthday
2
 $ $ 
 | | 
-----
~~~~~
-----
>> happy_birthday
3
 $ $ $ 
 | | | 
-------
~~~~~~~
-------
>> happy_birthday
4
 $ $ $ $ 
 | | | | 
---------
~~~~~~~~~
---------
>> happy_birthday
5
 $ $ $ $ $ 
 | | | | | 
-----------
~~~~~~~~~~~
-----------

รหัสที่มีระยะห่างและคำอธิบาย

% Get the input number from the user
n=input('');

% If the number is positive, the core candle sequence is going to be a column vector of a $ followed by a | character
m='$|'.';    

%// Array of one column and it has two spaces - going to use more than once
d = '  '.';

% If the number is 0, display the congratulations message and get out
if(n==0)
    disp('Congratulations on your new baby! :D')
    break;

% m stores the core candle sequence for displaying on the screen
% If the number is negative, the core candle sequence is going to be a column of two blank spaces
elseif(n<0)
    m=d; 
    n=1; % n is set to 1 as this is the number of "blank candles" we want to display
end

% This displays candles and the base together
% The top half is the displaying of the candles
% It is a column vector of spaces, followed by pairs of $,| in a column
% and another column of spaces - repeated n times
% The bottom half is the displaying of the cake
% The bottom half is a column vector of -,~,- for the base of the cake
% and is repeated 2*n + 1 times to match the candle display
disp([[d repmat([m d],1,n)];repmat('-~-'.',1,2*n+1)]);

ส่วนการแสดงผลในตอนท้ายน่าจะเป็นส่วนที่สับสนที่สุดของรหัส นี่จะแสดงเมทริกซ์อักขระ 5 แถวโดยที่สองแถวแรกประกอบด้วยเทียนและสามแถวสุดท้ายประกอบด้วยฐานของเค้ก

พื้นฐานสำหรับครึ่งบนของจอแสดงผลเป็นช่องว่างสองช่องในคอลัมน์ตามด้วยอีกสองช่องว่างในคอลัมน์อื่นในกรณีที่อายุเป็นลบหรือ$,-ในคอลัมน์ตามด้วยช่องว่างสองช่องในคอลัมน์อื่น นี่คือเมทริกซ์อักขระ 2 x 2 พื้นฐานสำหรับครึ่งล่างของจอแสดงผลเป็นเวกเตอร์คอลัมน์เดียวของ-,~,-ซึ่งเป็นเมทริกซ์อักขระ 3 x 1

คำสั่ง display แรกจะจัดการสองแถวแรกของเค้กโดยการวางช่องว่างสองช่องในคอลัมน์แรกตามด้วยคู่ของคอลัมน์$,-หรือคอลัมน์ของช่องว่างหากnเป็นค่าลบซึ่งเปลี่ยนเป็นn=1และคอลัมน์อีกสองช่องว่างซ้ำสำหรับ จำนวนnครั้งทั้งหมด สามแถวถัดไปจะทำซ้ำ-,$,-เวกเตอร์คอลัมน์เพียง2*n + 1ครั้งเดียวเพื่อจัดเรียงเทียนเข้ากับฐานเพื่อให้ภาพสมบูรณ์

ลองออนไลน์!

คุณสามารถลองใช้งานออนไลน์ได้โดยใช้ Octave compiler: http://ideone.com/4qXDdJ - อย่างไรก็ตามมีข้อผิดพลาดเล็กน้อยเมื่ออ่านค่าจากอินพุตมาตรฐาน ดังนั้นสคริปต์จะถูกปรับเปลี่ยนเล็กน้อยซึ่งคุณจะต้องเปลี่ยนค่าของnจุดเริ่มต้นของรหัส แยกสคริปต์เวอร์ชันใหม่ออกและเปลี่ยนเป็นค่าจำนวนเต็มที่เหมาะกับคุณเพื่อดูว่าเอาต์พุตมีลักษณะอย่างไร


1
น่าเสียดายที่คุณไม่สามารถช่วยจุดใน' '.'!
Luis Mendo

1
@LuisMendo - ฉันรู้ ... แต่ฉันแน่ใจว่าคุณไม่คัดค้านการใช้ของ transpose ที่วิธีการที่ :)!
rayryeng

1
ฮ่า ๆ ๆ ๆ ฉันเคยบอกที่นี่ว่าเว็บไซต์นี้มีไว้สำหรับการใช้ภาษาที่ไม่เหมาะสม และฉันก็ทำตามกฎนั้นด้วยความนับถือ!
Luis Mendo

1
@ LuisMendo - ฉันต้องการกำจัดจุด ... แต่ทำไม่ได้เพราะ MATLAB ตีความว่าเป็นคำพูดเดียวในสตริง :( จะช่วยฉันสักสองสามไบต์ ... แต่หลังจากทำซ้ำหลายครั้งนี่เป็น สิ่งที่ดีที่สุดที่ฉันสามารถทำได้
rayryeng

@LuisMendo - ย่อขนาดลงเหลือ 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')

หากต้องการดูผลลัพธ์ในฟอนต์พื้นที่ขาวดำให้แทนที่ 'alert' โดย 'console.log'


ยินดีต้อนรับสู่ PPCG! :)

2
น่าเศร้าที่นี่แสดงข้อความแสดงความยินดีสำหรับอินพุตเชิงลบด้วย
จัดการ

@BetaDecay tnx :-)
Nainemom

การจัดการที่ถูกต้อง: / ฉันไม่รู้ว่า JS จะช่วยได้เพียงพอ

@ การจัดการใช่คุณถูกต้อง! ฉันเข้าใจผิด!
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")

และอีกหนึ่ง (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")

เมื่อต้องการดูผลลัพธ์ในแบบอักษร monospace (และย้าย ouptut ไปยังคอนโซล) ใช้

alert=x=>console.log(x)

4

เมาส์ , 164 161 ไบต์

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

เห็นได้ชัดว่าเม้าส์ไม่ใช่ตัวเลือกที่เหมาะสำหรับงานนี้ แต่มันสนุก

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
@

สแต็กสามารถมีจำนวนเต็มเท่านั้น !'นำจำนวนเต็มออกจากสแต็กและพิมพ์อักขระ 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"

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

ใช้มันเหมือน:

f(10) # In the CoffeeScript console
alert(f(~~prompt("Y"))) # Browser, alert popup
console.log(f(~~prompt("Y"))) # Browser, log to console, and thus has monospace font

ลองใช้ออนไลน์: ลิงก์ (มีรหัสที่แสดงบางอย่างดังนั้นทุกอย่างดูดีมาก ... )

อ๊ะเกือบลืมไปแล้ว! สุขสันต์วันเกิด @BetaDecay!


4

C, 392 ไบต์

(ความผิดพลาดของการแบ่งส่วนที่รู้จักกันหากไม่ได้รับข้อโต้แย้ง)

#include <stdio.h>
#define P(s) printf(s);
#define F for(i=0;i<n;i++)
#define A(s, e) F{P(s)}P(e "\n")
int main(int c, char**v){int i,n=atoi(v[1]);if(n<0){n=3;A("-",)A("~",)A("-",)}else if(!n)P("Congratulations on your new baby! :D\n")else{A(" $",)A(" |",)A("--","-")A("~~","~")A("--","-")}}

ไม่ระบุและเว้นระยะอย่างมาก

#include <stdio.h>
#define P(s) printf ( s ) ;
#define F for ( i = 0 ; i < n ; i++ )
#define A(s, e) F { P ( s ) } P ( e "\n" )
int main ( int c, char ** v )
{
        int i, n = atoi ( v [ 1 ] ) ; 
        if ( n < 0 ) 
        {   
                n = 3 ; 
                A ( "-", )
                A ( "~", )
                A ( "-", )
        }   
        else if ( ! n ) 
                P ( "Congratulations on your new baby! :D\n" )
        else
        {   
                A ( " $", )
                A ( " |", )
                A ( "--", "-" )
                A ( "~~", "~" )
                A ( "--", "-" )
        }   
}

# C กำหนดตัวหลักและตัวหลักทั้งหมด 247
Funmungus

ยินดีต้อนรับสู่ PPCG! นี่คือคำตอบที่ดีจริงๆ - Aโดยเฉพาะอย่างยิ่งผมชอบการละเมิดมาโคร ฉันเห็นช่องว่างอีกสองสามที่สามารถลบออกได้และคุณสามารถกำจัดได้iโดยใช้cสำหรับตัวแปรวนรอบแทน นอกจากนี้อย่างน้อยกับ gcc รวมถึง stdio.h หรือระบุประเภทการคืนของ main () ไม่จำเป็น: คอมไพเลอร์บ่นเกี่ยวกับมัน แต่เดี๋ยวก่อนนี่คือ code golf ;)
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](คำถามไม่ได้บอกว่าจะใช้อาร์กิวเมนต์แทน stdin) และคุณสามารถใช้ unary +เพื่อแปลงเป็นตัวเลขได้:$n=+$input;
briantist

+ $ input ดูเหมือนจะไม่ทำงาน - มันบ่นว่า $ input เป็นตัวแจงนับและไม่มีโอเปอเรเตอร์เพิ่มเติม แต่$args[0]สามารถและควรจะเป็น int [int]จริงช่วยให้เราอย่างน้อยลดลง
Justin Dunlap

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

Ceylon, 322 307 300 282 278 260 ไบต์

shared void run(){if(exists t=process.readLine(),exists n=parseInteger(t)){String r(String s)=>s.repeat(n);print(n>0thenr(" $")+"\n"+r(" |")+"\n"+r("--")+"-\n"+r("~~")+"~\n"+r("--")+"-"else(n<0then"---\n~~~\n---"else"Congratulations on your new baby! :D"));}}

ต้นฉบับที่ยังไม่ตีกอล์ฟ (สมมติว่าเค้กลบมีความกว้าง 3 แทน –2 · n + 1):

shared void birthdayCake() {
    if (exists text = process.readLine(), exists number = parseInteger(text)) {
        switch (number <=> 0)
        case (equal) {
            print("Congratulations on your new baby! :D");
        }
        case (smaller) {
            print("---\n~~~\n---");
        }
        case (larger) {
            print(" $".repeat(number));
            print(" |".repeat(number));
            print("--".repeat(number) + "-");
            print("~~".repeat(number) + "~");
            print("--".repeat(number) + "-");
        }
    }
}

คุณลักษณะนี้มีรายการเงื่อนไขในคำสั่ง if แต่ละเงื่อนไขกำหนดค่าที่ใช้ได้ในเงื่อนไขต่อไปนี้และในเนื้อความ เนื่องจากมีexistเงื่อนไขจะปฏิบัติตามเมื่อค่าไม่เป็นโมฆะเท่านั้นและคอมไพเลอร์รู้ว่าค่าไม่เป็นโมฆะสำหรับรหัสต่อไปนี้ (ถ้าไม่มีการป้อนอะไร (EOF), readline จะคืนค่า null ถ้า parseInteger ไปที่ไม่ใช่จำนวนเต็มมันจะคืนค่าเป็น null โปรแกรมของเราก็ไม่ทำอะไรเลยเนื่องจากพฤติกรรมของกรณีเหล่านั้นไม่ได้กำหนดไว้

นอกจากนี้เรายังมี<=>โอเปอเรเตอร์ซึ่งแผนที่ไปที่Comparable.compareวิธีการและผลตอบแทนComparisonวัตถุเช่นหนึ่งequal, และsmaller largerคอมไพเลอร์รู้ว่าสิ่งเหล่านั้นหมดComparisonประเภทดังนั้นจึงไม่elseจำเป็นต้องมีประโยคในswitchคำสั่งของเรา

repeatวิธีการของ String ระดับไม่สิ่งที่ใครจะคาดคิด มันเป็นจริงที่สืบทอดมาจากวิธีการที่มีชื่อเดียวกันในอินเตอร์เฟซ Iterable (เป็นสตริงเป็นข้างสิ่งอื่น ๆ เพียงรายการของตัวละคร)

การแทนที่ตัวระบุของฉันด้วยตัวอักษรหนึ่งตัวและลบ white space ที่ไม่จำเป็นออกมีความยาว 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 อย่างชัดเจน(และหนึ่งรายการ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)+"-");}}}

ฉันลองใช้ alias-importing repeatเป็น as rแต่ไม่ช่วย (การประกาศการนำเข้าเพิ่ม 40 ตัวอักษรและเราสามารถบันทึก 25 โดยการแทนที่เท่านั้นrepeatด้วยrเท่านั้น)

สิ่งที่เล็กน้อยจะช่วยให้มีการใช้แทนn.sign n<=>0ในขณะที่ทั้งสองแสดงออกมีความยาวที่เป็นข้อความเดียวกันพวกเขามีชนิดที่แตกต่างกัน: หนึ่งหลังเป็นประเภทComparisonที่กล่าวถึงก่อน (ซึ่งมีค่าที่สามsmaller, largerและequal) อดีตคนมีพิมพ์Integerที่มีค่า-1, 1,0 ... และเพราะ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 ตัวอักษร (= bytes):

shared void b(){if(exists t=process.readLine(),exists n=parseInteger(t)){if(n==0){print("Congratulations on your new baby! :D");}else if(n<0){print("---\n~~~\n---");}else{print(" $".repeat(n)+"\n"+" |".repeat(n)+"\n"+"--".repeat(n)+"-\n"+"~~".repeat(n)+"~\n"+"--".repeat(n)+"-");}}}

จัดรูปแบบ:

shared void b() {
    if (exists t = process.readLine(), exists n = parseInteger(t)) {
        if (n == 0) {
            print("Congratulations on your new baby! :D");
        } else if (n < 0) {
            print("---\n~~~\n---");
        } else {
            print(" $".repeat(n) + "\n" +
                        " |".repeat(n) + "\n" +
                        "--".repeat(n) + "-\n" +
                        "~~".repeat(n) + "~\n" +
                        "--".repeat(n) + "-");
        }
    }
}

เราสามารถปลอดภัยไบต์อื่นโดยการแลกเปลี่ยนกรณีรอบตั้งแต่สั้นกว่า> =="ความน่ารำคาญ" อีกอย่างคือการทำซ้ำrepeat(n) - เราสามารถกำหนดฟังก์ชั่นท้องถิ่น (การปิดมันจำได้nจากการกำหนดบล็อก) ด้วยชื่อที่สั้นกว่า:

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

นี่เป็นวิธีที่สั้นกว่าในการเขียนสิ่งนี้:

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

เราสามารถใช้ functionแทนประเภทคืนสำหรับการอนุมานประเภท แต่ไม่สั้น สิ่งนี้ทำให้เรามี 278 ไบต์:

shared void b(){if(exists t=process.readLine(),exists n=parseInteger(t)){if(n>0){String r(String s)=>s.repeat(n);print(r(" $")+"\n"+r(" |")+"\n"+r("--")+"-\n"+r("~~")+"~\n"+r("--")+"-");}else if(n<0){print("---\n~~~\n---");}else{print("Congratulations on your new baby! :D");}}}

จัดรูปแบบ:

shared void b() {
    if (exists t = process.readLine(), exists n = parseInteger(t)) {
        if (n > 0) {
            String r(String s) => s.repeat(n);
            print(r(" $") + "\n" + r(" |") + "\n" + r("--") + "-\n" + r("~~") + "~\n" + r("--") + "-");
        } else if (n < 0) {
            print("---\n~~~\n---");
        } else {
            print("Congratulations on your new baby! :D");
        }
    }
}

ที่จริงแล้วการใช้ตัวดำเนินการthenและ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 117 ไบต์

ไม่ต้องการตัวเลือก '-n' หรือ '-p'

รุ่นที่ 3 (ด้วย Dom Hastings ด้านล่าง):

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

รุ่นที่ 2:

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

รุ่นที่ 1:

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

นี่คือเวอร์ชันของการแก้ไข 3 ที่ไม่มีบรรทัดใหม่ว่างนำหน้าในอินพุตลบ - 132 ไบต์

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

สวัสดีค่ะยินดีต้อนรับ! คิดว่าฉันจะแบ่งปันสองสามวิธีที่คุณสามารถบันทึกไบต์! คุณสามารถดร็อปวงเล็บไปรอบ ๆ"Congratulations..."และหากแทนที่' $',' |','-','~','-'ด้วยsplit 0,' $0 |0-0~0-'คุณสามารถดร็อปวงเล็บเหล่านั้นได้เช่นกัน เซฟไว้ได้ก็คือการเปลี่ยนด้วย$n=<>;$n==0 ($n=<>)==0นอกจากนี้คุณ?1:อาจเป็น||อย่างที่คุณจะพูด$n==0(ซึ่งคือ 1) หรือการคำนวณของคุณ หวังว่าจะช่วย!
Dom Hastings

เฮ้ขอบคุณสำหรับสิ่งนั้น วงเล็บเหล่านั้นเป็นสิ่งที่ดีและเตือนฉันถึงความหมายของการ||เป็นประโยชน์อย่างมาก - มันทำให้ฉันนึกถึงการป้อนข้อมูล$=โดยพื้นฐานchompขจัดความต้องการสำหรับการทดสอบค่า 0 ที่เฉพาะเจาะจง ฉันไม่แน่ใจว่าสิ่งที่คุณหมายถึง$n=<>;$n==0- กอล์ฟของฉันไม่ได้และฉันจัดการกับกรณีการป้อนข้อมูล = 0 เป็นข้อมูลเข้าสู่map{}()ฉันไม่แน่ใจว่าสิ่งนี้จะใช้? อย่างไรก็ตามการแสดงความคิดเห็นของคุณและใช้$=เป็นตัวแปรของฉันนี้ได้รับการ golfed ลงไปถึง 117 parbytes ขอบคุณมาก ๆ!
phillipo

ไม่มีปัญหาเลย! ดีใจที่ได้ช่วย! สิ่งที่ฉันหมายถึงคือคุณมี$n=<>;จุดเริ่มต้นแล้ว$n==0ที่ด้านหลังของmap{}...ดังนั้นฉันคิดว่าคุณสามารถตรวจสอบได้($n=<>)==0แต่ถ้าคุณใช้$=แทนคุณอาจหดตัวได้มากกว่านี้! ฉันมักจะลืมไปว่าจะลบ$-หรือ$=ไม่ดังนั้นฉันไม่ต้องการพูดถึงมันและผิด! :)
Dom Hastings

3

Pip, 74 + 1 = 75 ไบต์

ใช้อายุเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ต้องใช้-nธง

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

ที่เก็บ Github สำหรับ Pip

aอาร์กิวเมนต์บรรทัดคำสั่งที่ถูกเก็บไว้ใน เราแยก"-~-"ลงในรายการของตัวละครและYank yมันกลายเป็นตัวแปร โปรแกรมส่วนที่เหลือเป็นนิพจน์ประกอบไปด้วย:

  • a?
    หากaเป็นจริง (เช่นไม่เป็นศูนย์):
    • a<0?yX3
      หากaเป็นลบให้ส่งคืนyพร้อมกับองค์ประกอบแต่ละรายการซ้ำ 3 ครั้ง:["---";"~~~";"---"]
    • อื่น ( aเป็นบวก):
      • (s.^"$|")Xa
        แยก"$|"ลงในรายการของตัวอักษร, ย่อหน้าพื้นที่ ( s) ไปในแต่ละครั้งและทำซ้ำส่งผลให้แต่ละองค์ประกอบaครั้ง
      • yX2*a+1
        ทำซ้ำองค์ประกอบแต่ละy 2*a+1ครั้ง
      • AL
        ผนวกสองรายการ
  • อื่น ( aเป็นศูนย์) ส่งคืนสตริงแสดงความยินดี

ในตอนท้ายของโปรแกรม -nตั้งค่าสถานะให้แน่ใจว่ารายการจะถูกพิมพ์ด้วยองค์ประกอบในบรรทัดที่แยกต่างหากจึงแสดงเค้กชั้นอย่างถูกต้อง

นี่คือขั้นตอนสำหรับการป้อนข้อมูลของ2:

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

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

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

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

สุขสันต์วันเกิด!


2

Perl, 144 ไบต์

รหัส 143 ไบต์บวกหนึ่งไบต์พิเศษสำหรับ-nสวิตช์เพื่อดักจับ 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).$/!gerสำหรับเค้ก
จัดการ

หากคุณเปลี่ยนสวิตช์เป็น-pสิ่งนี้จะใช้งานได้:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
จัดการ

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

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

ตรงไปตรงมาสวย 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 ไบต์

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

1
ยินดีต้อนรับสู่ PPCG! ดูเหมือนว่ารหัสของคุณจะมีข้อผิดพลาด ( attempt to compare string with number) แต่การเพิ่ม0+ก่อนio.read()แก้ไขให้ฉัน คุณสามารถบันทึกได้ไม่กี่ไบต์ด้วยการกำหนดprintและstring.repตัวแปรตัวเดียว
DLosc

@DLosc ขอบคุณความคิดที่ดี :) และใช่ยูมีสิทธิที่มีข้อผิดพลาดขออภัยเกี่ยวกับที่
FabiF

2

Mathematica, 164 ไบต์

พลาดเค้กที่ไม่มีเทียนอย่างสมบูรณ์สำหรับ n <0 เพิ่มอีก 15 อักขระ

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

1
ยินดีต้อนรับสู่ PPCG ความท้าทายนี้เป็นที่รู้จักในนาม code golf ซึ่งคุณจะลองและทำให้รหัสของคุณสั้นที่สุด สิ่งนี้สามารถทำได้โดยการลบช่องว่างที่ไม่จำเป็นและลดชื่อตัวแปร

ขอบคุณ @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 # script), 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.