Це мій день народження: 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]

Для позитивних чисел: це повторюється через рядок, відповідний кожному рядку торта. Вони використовуються як рядки колодок, щоб право виправдати порожній рядок довжиною 2 * n + 1. Це дозволяє уникнути будь-яких ускладнень з необхідністю друку непарної кількості символів, коли природне повторення дорівнює тону свічок (тобто 2 символи.) n>0&&, Щоб уникнути виведення одного стовпця у разі нульового введення.

Для всіх чисел: " n<=>0" знаходить знак введення. Повідомлення немовляти виводиться за n = 0, а порожній рядок для позитивного n (оскільки правильний вихід вже вказано вище). Для негативного n Рубі інтерпретує -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
Ще один: ''.rjuste.ljust.
манатура

@manatwork спасибі, я мав це помітити, але це зробив дуже швидко. Я не знав про простір зворотної косої риси з% w. І e.just: дуже розумно.
Рівень р. Св.

11

R, 157

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

2
Я там багато навчаюся на параметрах запису. Блискучий
Тенсібай

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 забув перше = і не мав думки про подвійне призначення
Тенсібай

У вас десь проблема з Error: unexpected '}'
дужками

@flodel виправлено. Випуск копію / вставлення
Tensibai

10

JavaScript ES6, 136

Використання сповіщення для виведення - неправильний пропорційний шрифт, а результат некрасивий. У фрагменті нижче сповіщення переспрямовується на відрізане тіло, що дає кращий результат.
Новий рядок всередині задньої панелі є вагомим і враховується.

Перевірте запуск фрагмента у Firefox.

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

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

Менше гольфу

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

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

alert(output);

Спробуйте це $('div pre code')[2].innerHTML;)
Vasu Adari

7

R, 279 байт

Інтерактивна версія (286 байт):

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

Не інтерактивна версія (279 байт):

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

7

MATLAB / Octave, 194 198 195 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-ти рядкову матрицю символів, де перші два ряди складаються із свічок, а останні три ряди складаються з основи торта.

Основою для верхньої половини відображення є або два пробіли у стовпці з подальшими ще двома пробілами в іншому стовпці у випадку, коли вік від’ємний, або a $,-у стовпці, за яким два пробіли в іншому стовпці. Це матриця розміром 2 x 2. Основою для нижньої половини дисплея є одинарний вектор стовпця, -,~,-матриця якого становить 3 х 1 символів.

Команда відображення спочатку займається першими двома рядками торта, розміщуючи два пробіли в першому стовпчику, після чого пари стовпця $,-або стовпця пробілів, якщо nце від’ємник, який стає зміненим n=1, та інший стовпчик з двох пробілів, повторений для всього nразів. Наступні три ряди просто повторюють -,$,-вектор стовпчика на 2*n + 1рази, щоб вирівняти свічки разом із основою, таким чином доповнивши малюнок.

Спробуйте в Інтернеті!

Ви можете спробувати це в Інтернеті за допомогою компілятора Octave IDEOne: http://ideone.com/4qXDdJ - однак, незначна помилка при зчитуванні значень зі стандартного вводу. Таким чином, сценарій трохи змінений, де вам доведеться змінити значення nна початку коду. Створіть нову версію сценарію та змініть це на те, що відповідає цілому значенню, щоб побачити, як виглядає вихід.


1
Шкода, що ви не можете зберегти крапку в ньому ' '.'!
Луїс Мендо

1
@LuisMendo - Я знаю! ... хоча я впевнений, що ви не заперечуєте проти використання транспозиції таким чином :)
rayryeng

1
Хахаха. Мені одного разу тут сказали, що цей сайт - за зловживання мовою. І я дотримуюся цього правила сумлінно!
Луїс Мендо

1
@LuisMendo - Я дуже хотів позбутися точки ... але не міг, тому що MATLAB трактує це як єдину цитату в рядку :(. Врятував би мені кілька байт ... але після багатьох ітерацій це було найкраще, що я міг придумати.
rayryeng

@LuisMendo - вдалося зменшити його до 171!
rayryeng

6

JavaScript, 143 153 байт

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

Щоб побачити вихід у монопростірному шрифті, замініть на "сигнал" на "console.log"


Ласкаво просимо до PPCG! :)

2
На жаль, це відображає вітання також для негативного введення.
манатство

@BetaDecay tnx :-)
Nainemom

Право Manatwork в: / Я не знаю , досить , щоб допомогти JS

@manatwork так, ти прав! я неправильно зрозумів!
Nainemom

5

Самопис, 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 (і перемістіть його до консолі), використовуйте

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

Миша, очевидно, не є ідеальним вибором для цього завдання, але це було весело.

Безголовки:

? 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 на # визначає основний корпус 247.
Funmungus

Ласкаво просимо до PPCG! Це дійсно гарна відповідь - мені особливо подобається зловживання макрокомандою A. Я бачу ще пару пробілів, які можна було б видалити, і ви можете позбутися i, використовуючи cзамість цього змінну циклу. Крім того, принаймні з gcc, включаючи stdio.h або із зазначенням типу повернення main (), не потрібно: компілятор скаржиться на це, але еге, це код гольфу. ;)
DLosc

4

Powershell, 139 134 132 126 байт

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

Ви можете зберегти 5 байтів, використовуючи $inputзамість $args[0](запитання не говорить про використання аргументів замість stdin), а ви можете використовувати унар +для перетворення в число:$n=+$input;
британіст

+ $ введення, здається, не працює - він скаржився, що $ input є перерахувачем і не має оператора додавання. Однак $args[0]може бути і має бути фактичним цілим, що дозволяє нам принаймні скинути це [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"));}}

Ще не оригінальний оригінал (якщо негативні коржі мають ширину 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 (оскільки рядок, крім інших речей, є лише списком символів).

Заміна моїх ідентифікаторів однобуквенними та видалення зайвого пробілу дає 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)+"-");}}}

Я спробував імпорт псевдоніму repeatяк 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 {}
    }
}

Ми можемо захистити ще декілька, відмовившись від нашого оператора перемикання та використовуючи if282 символи (= байти):

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замість типу return для виводу типу, але це не коротше. Це дає нам 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

гольфлуа, 113 символів

\p(c)w(S.t(c,n))~$n=I.r()+0?n==0w"Congratulations on your new baby! :D"!??n>0p" $"p" |"n=n*2+1!?n=3$p"-"p"~"p"-"$

Проба зразка:

bash-4.3$ golflua -e '\p(c)w(S.t(c,n))~$n=I.r()+0?n==0w"Congratulations on your new baby! :D"!??n>0p" $"p" |"n=n*2+1!?n=3$p"-"p"~"p"-"$' <<< 5
 $ $ $ $ $
 | | | | |
-----------
~~~~~~~~~~~
-----------

bash-4.3$ golflua -e '\p(c)w(S.t(c,n))~$n=I.r()+0?n==0w"Congratulations on your new baby! :D"!??n>0p" $"p" |"n=n*2+1!?n=3$p"-"p"~"p"-"$' <<< 0
Congratulations on your new baby! :D

bash-4.3$ golflua -e '\p(c)w(S.t(c,n))~$n=I.r()+0?n==0w"Congratulations on your new baby! :D"!??n>0p" $"p" |"n=n*2+1!?n=3$p"-"p"~"p"-"$' <<< -5
---
~~~
---

3

Python 2, 150 байт

m=input()
n=m-1
p="---"+"--"*n
g="\n~~~"+"~~"*n+"\n"
if m>0:print" $"*m,"\n"," |"*m
s=p+g+p
print s if m!=0 else"Congratulations on your new baby! :D"

Близько до авторського Python :(


3

Perl, 139 127 117 байт

Не вимагає параметрів '-n' або '-p'.

Версія 3 (завдяки Дому Гастінгсу нижче):

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

Версія 2:

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

Версія 1:

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

Ось версія версії 3, в якій немає провідних порожніх нових рядків на негативному введенні - 132 байти.

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

Гей, ласкаво просимо! Думав, я поділюсь кількома способами, як можна зберегти кілька байт! Ви можете опустити дужки навколо, "Congratulations..."а якщо замінити ' $',' |','-','~','-'на них split 0,' $0 |0-0~0-', можете також скинути ці дужки. Ще одне заощадження - це заміна $n=<>;$n==0на ($n=<>)==0. Також ваш ?1:може бути, ||як ви сказали $n==0(це 1), або ваш розрахунок. Сподіваюся, що це допомагає!
Дом Гастінгс

Гей, дякую за це. Ці дужки є хорошим, і нагадування мені про семантику ||дуже допомагає - це нагадало мені $=в основному chompвведення, виключаючи вимогу до конкретних тестів на значення 0. Я не впевнений, що ви маєте на увазі $n=<>;$n==0- мій гольф цього не має, і, враховуючи, що я обробляю випадок input = 0 як вхід у map{}(), я не впевнений, як це застосовуватиметься? У будь-якому разі, беручи до уваги ваші коментарі та використовуючи $=мою змінну, це було знижено до 117 парбайт. Дуже дякую!
Філіпо

Ніяких проблем взагалі! Радий, що допоміг! Що я маю на увазі, що у вас є $n=<>;на початку, а потім $n==0в задній частині, map{}...так що я думаю, ви могли б мати чек, ($n=<>)==0але якщо ви використовуєте $=замість цього, ви можете більше зменшити його! Я завжди забуваю, що може бути $-чи $=не може бути негативним, тому я не хотів згадувати про це і помиляюся! :)
Дом Гастінгс

3

Піп, 74 + 1 = 75 байт

Приймає вік як аргумент командного рядка. Потрібен -nпрапор.

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

Сховище Github для Pip

Аргумент командного рядка зберігається в a. Ми розбиваємо "-~-"на список символів і Yдодаємо його до змінної y. Решта програми - це великий потрійний вираз:

  • a?
    Якщо aє truthy (тобто не нуль):
    • 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

Пітон 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()виправити це для мене. Ви також можете зберегти досить багато байтів, призначивши printі string.repоднозначні змінні.
DLosc

@DLosc дякую гарну ідею :) і так, ви мали рацію з помилкою про це вибачте
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, якщо ви введете мінус, він під час спроби друку буде збій 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)))))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.