내 생일이야 : D


112

소개

작년 은 내 생일 (정말!)이었고 슬프게도 내 파티를 조직해야했습니다. 글쎄요, 적어도 케이크를 만들 수 없습니까?

도전

n입력 으로 정수가 주어지면 촛불이 켜진 생일 케이크를 출력하는 전체 프로그램 을 작성하십시오 n.

산출

하나의 촛불이 달린 케이크 한 조각은 다음과 같습니다.

 $
 |
---
~~~
---

그리고 3 개의 촛불이 달린 케이크 조각은 다음과 같습니다.

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

나는 당신이 그걸로 해결할 수 있다고 확신합니다.

그러나 input의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
생일 축하!
Dennis

1
캔들리스 케이크에 선행 공백 (예 : 2 줄 바꾸기)이 허용됩니까?
Level River St

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 바이트)

manatwork 덕분에 18 바이트 절약

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

개정판 0 (138 바이트)

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

양수 : 케이크의 각 줄에 해당하는 문자열을 반복합니다. 빈 문자열을 길이 2 * n + 1로 오른쪽 정렬하기 위해 패드 문자열로 사용됩니다. 이렇게하면 자연 반복이 양초의 피치와 같은 경우 (예 : 2 자) 홀수의 문자를 인쇄해야하는 복잡한 문제를 피할 수 n>0&&있으며 입력 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]
manatwork

1
하나 더 : ''.rjuste.ljust.
manatwork

@ manatwork 덕분에, 나는 그것을 발견했을 것입니다. 그러나 나는 이것을 매우 빨리했습니다. % w의 백 슬래시 공간에 대해서는 몰랐습니다. 그리고 e.just: 매우 영리합니다.
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
거기에서 쓰기 매개 변수에 대해 많이 배우고 있습니다. 화려한 하나
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
몇 바이트를 저장할 수 있습니다 : <-can =, 사용할 수 있습니다 a=b='-~-'.
jbaums

Ho, 고맙습니다 @jbaums는 첫 번째 =를 잊고 듀얼 할당을
생각하지 않았습니다

당신은 어딘가에 괄호 문제가 있습니다.Error: unexpected '}'
flodel

@flodel이 수정되었습니다. 복사 / 붙여 넣기 문제
Tensibai

10

자바 스크립트 ES6, 136

출력에 경고를 사용하면 비례 글꼴이 잘못되어 결과가 추악합니다. 아래 스 니펫에서 경고는 스니핑 된 바디로 리디렉션되어 더 나은 결과를 제공합니다.
백틱 내부의 줄 바꿈은 중요하며 계산됩니다.

Firefox에서 스 니펫 실행을 테스트하십시오.

/* Redefine alert for testing purpose */ alert=x=>O.innerHTML=x;

alert((n=+prompt())?[...'$|-~-'].map((c,i)=>(i>1?c:' '+c).repeat(i>1?n>0?n-~n:3:n>0&&n)).join`
`:'Congratulations on your new baby! :D')
<pre id=O></pre>

덜 골프

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

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

alert(output);

이것을보십시오 $('div pre code')[2].innerHTML;)
Vasu Adari

7

R, 279 바이트

대화식 버전 (286 바이트) :

b<-function(){
n=scan()
if(n==0)cat("Congratulations on your new baby! :D\n")
if(n>0){k=2*n+1;m=rep("-",k);cat(paste(c(rep(c(" ","$"),l=k),"\n",rep(c(" ","|"),l=k),"\n",m,"\n",rep("~",k),"\n",m,"\n"),collapse=""))}
if(n<0){m=rep("-",3);cat(paste(c(m,"\n",rep("~",3),"\n",m,"\n"),collapse=""))}
}

대화식 버전이 아님 (279 바이트) :

b<-function(n){
if(n==0)cat("Congratulations on your new baby! :D\n")
if(n>0){k=2*n+1;m<-rep("-",k);cat(paste(c(rep(c(" ","$"),l=k),"\n",rep(c(" ","|"),l=k),"\n",m,"\n",rep("~",k),"\n",m,"\n"),collapse=""))}
if(n<0){m=rep("-",3);cat(paste(c(m,"\n",rep("~",3),"\n",m,"\n"),collapse=""))}
}

7

MATLAB / 옥타브 194 198 195 189 171 167 바이트

생일 축하합니다. 베타 붕괴! :)

4 바이트를 줄여준 HamtaroWarrior에게 감사드립니다!


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

샘플 실행

이것을이라는 스크립트 파일 happy_birthday.m에 넣은 다음 명령 프롬프트에서 몇 번 실행했습니다. 음수를 입력하면 두 개의 주요 캐리지 리턴이 있지만이 문제에서는 허용됩니다.

>> 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 문자 행렬 인 단일 열 벡터입니다 .

디스플레이 명령은 먼저 첫 번째 열에 두 개의 공백을 두어 음수 $,-의 공백 또는 한 열의 열 쌍으로 변경하여 케이크의 처음 두 행을 처리합니다 . 총 횟수 다음 3 개의 행은 단순히 양초를베이스와 정렬하기 위해 열 벡터를 단순히 복제 하여 그림을 완성합니다.nn=1n-,$,-2*n + 1

온라인으로 사용해보십시오!

IDEOne의 Octave 컴파일러 ( http://ideone.com/4qXDdJ)를 사용하여 온라인으로 시도해 볼 수 있지만 표준 입력에서 값을 읽을 때 약간의 버그가 있습니다. 따라서 n코드 시작 부분의 값을 변경해야하는 경우 스크립트가 약간 수정 됩니다. 스크립트의 새 버전을 포크하고 출력이 어떻게 보이는지 확인하기 위해 원하는 정수 값으로 변경하십시오.


1
안타깝게도 점을 저장할 수 없습니다 ' '.'!
Luis Mendo

1
@LuisMendo-알아요! ...하지만 당신은 그런 식으로 조옮김을 반대하지 않을 것입니다 :)
rayryeng

1
하하하 나는이 사이트가 언어 를 남용 하는 것이라고 한 번 들었다 . 그리고 나는 그 규칙을 충실히 따릅니다!
Luis Mendo

1
@LuisMendo-점을 제거하고 싶었습니다 ...하지만 MATLAB은 문자열에서 작은 따옴표로 해석하기 때문에 실패했습니다 : (. 몇 바이트를 절약했을 것입니다 ... 내가 올 수있는 최고
rayryeng

@LuisMendo-171로 줄였습니다!
rayryeng

6

자바 스크립트, 143 153 바이트

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

모노 스페이스 글꼴로 출력을 보려면 'alert'를 'console.log'로 바꾸십시오.


PPCG에 오신 것을 환영합니다! :)

2
슬프게도 이것은 부정적인 입력에 대한 축하 메시지를 표시합니다.
manatwork

@BetaDecay tnx :-)
Nainemom

Manatwork의 권리 : / 나는 도울 JS가 충분하지 않다

@manatwork 그래 맞아! 나는 오해했다!
Nainemom

5

Moonscript, 141 바이트

n=0+io.read!
m=3
f=(s='-')->print s\rep m
if n>0
 m=n
 m=1+2*m,f' $',f' |'
if n==0 print"Congratulations on your new baby! :D"else f f!,f'~'

3
프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다!
Dennis


4

자바 스크립트 ES6, 154 자

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

그리고 하나 더 (154도)

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

모노 스페이스 글꼴로 출력을 확인하고 ouptut을 콘솔로 이동하려면 다음을 사용하십시오.

alert=x=>console.log(x)

4

마우스 , 164161 바이트

?N:N.0=["Congratulations on your new baby"33!'" :D"$]N.0>[#P,32!'36,N.;#P,32!'124,N.;]N.0<[1N:]2N.*1+D:#P,45,D.;#P,126,D.;#P,45,D.;$P0I:(I.2%=0=^1%!'I.1+I:)"!"@

마우스는이 작업에 이상적인 선택은 아니지만 재미있었습니다.

언 골프 드 :

? N.                               ~ Read N from STDIN
N. 0 = [                           ~ Have a baby for N == 0
  "Congratulations on your new baby" 33 !' " :D" $
]
N. 0 > [                           ~ If N > 0...
  #P, 32 !' 36, N.;                ~ Print the candle flames
  #P, 32 !' 124, N.;               ~ Print the candle sticks
]
N. 0 < [                           ~ If N < 0...
  1 N:                             ~ Set N = 1
]
2 N. * 1 + D:                      ~ Assign D = 2N + 1
#P, 45, D.;                        ~ Print the top cake layer
#P, 126, D.;                       ~ Print the middle layer
#P, 45, D.;                        ~ Print the bottom
$P                                 ~ Define the printing macro...
  0 I:                             ~ Initialize I to 0
  ( I. 2% = 0 = ^                  ~ While I != the second input
    1% !'                          ~ Print the first input
    I. 1 + I:                      ~ Increment I
  )
  "!"                              ~ Print a newline
@

스택은 정수만 포함 할 수 있습니다. !'스택에서 정수를 가져와 해당 코드와 함께 ASCII 문자를 인쇄합니다.


4

CoffeeScript, 160 바이트

f=(i,l=[" $ "," | ",_="---","~~~",_])->if!i then"Congratulations on your new baby! :D"else (if i<0then[_,l[3],_]else i++;(Array(i).join r for r in l)).join "\n"

언 골프 드 :

f=(i)->
  l = [" $ "," | ","---","~~~","---"] # The layers
  if i == 0
    return "Congratulations on your new baby! :D"
  else if i < 0
    return [l[2], l[3], l[2]].join("\n")
  else
    i++
    return (Array(i).join(r) for r in l).join("\n")

다음과 같이 사용하십시오.

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

온라인을 시도 링크 (일부 사용자 지정 디스플레이 코드를 포함, 그래서 모든 것이 김 착해 보이는 ...)

죄송합니다. 거의 잊어 버렸습니다! 생일 축하합니다, @BetaDecay!


4

C, 392 바이트

(인수가 제공되지 않으면 알려진 분할 오류)

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

축소 및 복사 공간

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

C 상용구가 없으면
#defines

PPCG에 오신 것을 환영합니다! 이것은 정말 좋은 답변입니다 A. 특히와 같은 매크로 남용이 마음에 듭니다 . 제거 할 수있는 공백이 몇 개 더 있고 루프 변수 대신 for i를 사용하여 제거 할 수 있습니다 c. 또한 적어도 stdio.h를 포함하거나 main ()의 반환 유형을 지정하는 gcc에서는 필요하지 않습니다. 컴파일러가 그것에 대해 불평하지만 코드 골프입니다. ;)
DLosc

4

파워 쉘, 139 134 132 126 바이트

$n=$args[0];if($n){$d=3;if($n-gt0){' $'*$n;' |'*$n;$d=$n*2+1}'-'*$d;'~'*$d;'-'*$d}else{'Congratulations on your new baby! :D'}

당신은을 사용하여 5 바이트를 저장할 수 있습니다 $input대신 $args[0](질문 대신에 표준 입력의 인수를 사용하는 말을하지 않음), 당신은 단항 사용할 수있는 +숫자로 변환 :$n=+$input;
briantist

+ $ input이 작동하지 않는 것 같습니다. $ input은 열거 자이며 추가 연산자가 없다고 불평했습니다. 그러나 $args[0]실제 int가 될 수 있어야하며 적어도을 삭제할 수 [int]있습니다.
저스틴 던랩

1
그래서,이 정말 오래된, 그러나 당신은에 입력을 이동하여 몇 바이트를 저장할 수 있습니다 if및 교환 else위한 ;exit- 122 바이트 -if($n=$args[0]){$d=3;if($n-gt0){' $'*$n;' |'*$n;$d=$n*2+1}'-'*$d;'~'*$d;'-'*$d;exit}'Congratulations on your new baby! :D'
AdmBorkBork

4

실론 322 307 300 282 278 260 바이트

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

아직 골프를 타지 않은 원본 (네거티브 케이크의 너비가 –2 · n + 1이 아니라고 가정) :

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

이것은 if 문의 조건 목록을 특징으로하며, 각 조건은 다음 조건과 본문에서 사용할 수있는 값을 정의합니다. 이 값이 있기 때문에 exist값이 null이 아닌 경우에만 조건이 충족되므로 컴파일러는 다음 코드의 값이 null이 아님을 알고 있습니다. (EOF)를 입력하지 않으면 readline은 null을 반환합니다. parseInteger가 정수가 아닌 경우 null도 반환합니다. 그러면 프로그램이 아무 것도 수행하지 않습니다. 이러한 경우에 대한 동작이 정의되지 않았으므로 괜찮습니다.

또한 우리는이 <=>받는 사람 매핑 운영자, Comparable.compare방법 및 반환 Comparison, 개체 중 하나를 즉 equal, smaller하고 larger. 컴파일러는 Comparison유형을 모두 사용하므로 문 else에 절이 필요 하지 않다는 것을 알고 switch있습니다.

repeatString 클래스메소드 는 예상 한 것을 수행합니다. 실제로 Iterable 인터페이스의 동일한 이름의 메소드에서 상속됩니다 (문자열은 다른 것 외에도 문자 목록 일뿐입니다).

식별자를 한 글자로 바꾸고 불필요한 공백을 제거하면 322자가됩니다.

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

시리즈를 printexplicit \ns (와 하나의 single print)로 바꾸면 307이됩니다.

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

repeatas의 별칭 가져 오기를 시도했지만 r도움이되지 않습니다 (가져 오기 선언은 40자를 추가하고로 대체 repeat하여 25 개만 저장할 수 있습니다 r).

약간 도움이되는 것은 n.sign대신을 사용 하고 n<=>0있습니다. 이 두 표현이 같은 텍스트의 길이를 가지고 있지만, 서로 다른 유형이 : 후자는 타입이다 Comparison(세 개의 값이있는 전에 언급 smaller, largerequal), 전 하나는 유형이 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자를 사용 하여 282 자 (= 바이트)로 더 안전합니다.

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

형식화 :

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

>보다 짧으므로 케이스를 교체하여 다른 바이트를 안전하게 할 수 있습니다 ==. 또 다른 "불쾌감"이 반복 됩니다. 더 짧은 이름 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");
        }
    }
}

실제로, 문 대신 thenelse연산자를 사용하면 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

파이썬 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

파이썬 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"

저자의 파이썬에 가까운 :(


3

펄, 139 (127) 117 바이트

'-n'또는 '-p'옵션이 필요하지 않습니다.

개정 3 (아래 Dom Hastings 덕분에) :

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

개정 2 :

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

개정 1 :

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

음수 입력-132 바이트에 빈 줄이없는 개정 3 버전이 있습니다.

$==<>;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내 골프에는 그것을 가지고 있지 않으며 input = 0 케이스를에 입력으로 처리하면 map{}()이것이 어떻게 적용되는지 잘 모르겠습니다. 어쨌든, 귀하의 의견 $=을 듣고 내 변수로 사용 하면, 이것은 117 parbyte로 골프되었습니다. 매우 감사합니다!
phillipo

전혀 문제 없습니다! 도와 주셔서 감사합니다! 내 말은 당신이 가진 것이 었 $n=<>;시작 부분에 다음 $n==0(가)의 뒤쪽에 map{}...그래서 당신이 수표를 가질 수 있다고 생각 ($n=<>)==0당신이 사용하는 경우하지만 $=당신이 더 축소 할 수있을 것 대신에! 나는 항상 어느 것을 부정 $-하거나 $=부정 할 수 없으므로 잊어 버리고 잘못하고 싶지 않았습니다! :)
Dom Hastings

3

핍, 74 + 1 = 75 바이트

연령을 명령 줄 인수로 사용합니다. -n깃발이 필요합니다 .

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

Pip 용 Github 리포지토리

명령 줄 인수는에 저장됩니다 a. "-~-"문자 목록으로 나누고 Y변수에 고정 y합니다. 프로그램의 나머지 부분은 큰 삼항 표현입니다.

  • a?
    a진실한 경우 (즉, 0이 아님) :
    • 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

펄, 144 바이트

143 바이트의 코드와 -n스위치가 stdin을 캡처하기 위한 1 바이트의 추가 바이트 .

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

1
print"-~-"=~s!.!$&x($_*2+1).$/!ger케이크를 위해?
manatwork

스위치를 변경하면 다음과 같이 -p작동합니다.$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
manatwork

2

SpecBAS, 164

아포스트로피 단축키를 사용하여 새 줄로 이동

INPUT n: IF n=0 THEN PRINT "Congratulations on your new baby! :D" ELSE IF n<0 THEN PRINT "---"'"~~~"'"---" ELSE PRINT " $"*n'" |"*n'"-";"--"*n'"~";"~~"*n'"-";"--"*n

더 읽기 쉬운 형식

INPUT n
IF n=0 THEN PRINT "Congratulations on your new baby! :D" 
ELSE IF n<0 THEN PRINT "---"'"~~~"'"---" 
ELSE PRINT " $"*n'" |"*n'"-";"--"*n'"~";"~~"*n'"-";"--"*n

2

파이썬 3, 169 바이트

n=int(input())
m=max(n*2+1,3)
f=' {}'*n+'\n'+' {}'*n+'\n'+'-'*m+'\n'+'~'*m+'\n'+'-'*m
if n==0:f='Congratulations on your new baby! :D'
print(f.format(*['$']*n+['|']*n))

2

줄리아, 143 바이트

n=int(readline())
p=println
l="\n"
n>0&&p(" \$"^n*l*" |"^n)
d=2(n<0?1:n)+1
p(d>1?"-"^d*l*"~"^d*l*"-"^d:"Congratulations on your new baby! :D")

꽤 직설적 인. 언 골프 드 :

# Read n from STDIN and convert to an integer
n = int(readline())

# Print the candles for positive n
n > 0 && println(" \$"^n * "\n" * " |"^n)

# Define d as the width of the cake
d = 2(n < 0 ? 1 : n) + 1

# Newborns can't eat cake
if d > 1
    println("-"^d * "\n" * "~"^d * "\n" * "-"^d)
else
    println("Congratulations on your new baby! :D")
end

2

루아, 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()해결됩니다. 또한 할당하여 꽤 많은 바이트를 저장할 수 있습니다 printstring.rep단일 문자 변수.
DLosc

@DLosc 고맙습니다 좋은 생각 :) 그리고 그래 u는 그것에 대해 죄송합니다 오류
FabiF

2

매스 매 티카, 164 바이트

n <0 인 양초가없는 케이크를 완전히 놓치면 15자가 추가됩니다.

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

1
PPCG에 오신 것을 환영합니다.이 과제는 코드 골프라고하며 코드를 최대한 짧게 만들어보십시오. 불필요한 공백을 제거하고 변수 이름을 줄임으로써이를 수행 할 수 있습니다.

감사합니다 @BetaDecay 빠른 버전을 받고 있었다 .. 지금 최소화. 건배 : D
마틴 존 해들리

문제 없어요. 좋아 보인다 :)

2

pb , 567 바이트

^w[B=45]{vb[-1]^b[0]>w[B!0]{t[B]b[0]<b[T]>>}<}w[B!0]{>}b[65]w[X!0]{<b[B-48]}>w[B!65]{t[B]<t[B*10+T]b[0]>b[T]>}b[0]<t[B]b[0]<[X]>b[T]<b[T]vw[B=0]{b[1]}t[B]b[0]^b[B*T]vw[X!3]{b[45]vb[126]vb[45]^^>}^<<t[B]<b[B+T]w[B!0]{<vw[X!3]{b[0]vb[0]vb[0]^^>}^<<t[B]vvw[T!0]{b[124]^b[36]v>>t[T-1]}v<w[X!-1]{b[45]vb[126]vb[45]^^<}}^[Y]^<[X]>w[B=0]{>vvw[X!-1]{b[0]vb[0]^<}^>}t[111]b[67]>b[T]>b[110]>b[103]>b[114]>b[97]>b[116]>b[117]>b[108]>b[97]>b[116]>b[105]>b[T]>b[110]>b[115]>>b[T]>b[110]>>b[121]>b[T]>b[117]>b[114]>>b[110]>b[101]>b[119]>>b[98]>b[97]>b[98]>b[121]>b[33]>>b[58]>b[68]

후회가 있습니다.

이것이 더 나을 수있는 몇 가지 방법이 있습니다. 예를 들어, 입력이 음수라는 것을 알면 입력 한 음수를 추론합니다. 이것은 불필요하며 언젠가는이 코드로 돌아가서 중지시킬 것입니다.

pbi의 "watch"모드에서 이것을 실행하지 마십시오. 음수를 입력하면 인쇄하려고 할 때 충돌합니다 chr(-1).

다음 은 프로그램을 작성하는 동안 메모 한 설명 버전 입니다. 그것이 어떻게 작동하는지 더 잘 이해하고 싶다면 ... 행운을, 그리고 알아 내면 알려주십시오.

# parse number

^w[B=45]{vb[-1]^b[0]>     # if negative, put a -1 at (0, 0)
    w[B!0]{t[B]b[0]<b[T]>>} # move all digits left
<}
w[B!0]{>}b[65]        # put an "A" at the end of the number
w[X!0]{<b[B-48]}      # subtract 48 from each byte to get the digits of the number
>w[B!65]{             # while there's no "A" at the second digit
    t[B]<t[B*10+T]      # set T to (first digit * 10) + second digit
    b[0]                # destroy first digit
    >b[T]               # override 2nd digit with T
    >}                  # point at second digit to restart loop
b[0]<t[B]b[0]<[X]>b[T]<b[T] # move number to (0, -1) and (1, -1)
vw[B=0]{b[1]}t[B]b[0]^b[B*T] # multiply (0, -1) by -1 if required
vw[X!3]{b[45]vb[126]vb[45]^^>} # draw the negative cake
^<<t[B]<b[B+T]w[B!0]{ # if it's positive
    <vw[X!3]{b[0]vb[0]vb[0]^^>} # erase the cake
    ^<<t[B]vvw[T!0]{b[124]^b[36]v>>t[T-1]} # draw the candles
    v<w[X!-1]{b[45]vb[126]vb[45]^^<}       # draw the cake
}^[Y]^<[X]>w[B=0]{>vvw[X!-1]{b[0]vb[0]^<}^>} # erase the part of the cake that would show up
# hardcoded string for input 0
t[111]b[67]>b[T]>b[110]>b[103]>b[114]>b[97]>b[116]>b[117]>b[108]>b[97]>b[116]>b[105]>b[T]>b[110]>b[115]>>b[T]>b[110]>>b[121]>b[T]>b[117]>b[114]>>b[110]>b[101]>b[119]>>b[98]>b[97]>b[98]>b[121]>b[33]>>b[58]>b[68]

2

ScriptCS (C # 스크립트), 221 바이트

분명히 이것은 상을받지는 않지만 ...

var n=int.Parse(Env.ScriptArgs[0]);Console.WriteLine(n==0?"Congratulations on your new baby! :D":string.Join("\n",new[]{" $"," |","-","~","-"}.Select((s,i)=>string.Concat(Enumerable.Repeat(s,i>1?(n>0?n:1)*2+1:n>0?n:0)))))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.