Это мой день рождения: D

112

Введение

В прошлом году был мой день рождения (правда!), И, к сожалению, мне пришлось организовать собственную вечеринку. Ну, теперь вы знаете, не могли бы вы по крайней мере сделать торт?

Вызов

Учитывая целое число в nкачестве входных данных, напишите полную программу для вывода торта на день рождения со nсвечами.

Выход

Кусок торта с одной свечой на это:

 $
 |
---
~~~
---

И кусок пирога с тремя свечами на это:

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

Я уверен, что вы можете решить это из этого

Однако для ввода0необходимо вывести следующее:

Congratulations on your new baby! :D

Для ввода меньше чем 0, вы должны вывести торт без свечи:

---
~~~
---

Ничто не может быть выведено на STDERR.

Конечные переводы строки и пробелы разрешены.

выигрыш

Самый короткий код в байтах побеждает.

Leaderboard

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 Нет. Это код для фрагмента.
сиг

Ответы:

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
PurkkaKoodari
источник
Самый маленький код, конечно, кажется наименее читаемым человеком.
Сатиш Сандживи
Что это за хрень??? 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 Ruby интерпретирует -1 как означающий последний элемент массива и выводит свечу без торт.

Уровень реки St
источник
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: очень умный.
Уровень Река
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,"")
flodel
источник
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")}
Tensibai
источник
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);
edc65
источник
Попробуйте это $('div pre code')[2].innerHTML;)
Васу Адари
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=""))}
}
Cath
источник
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 строк, где первые две строки состоят из свечей, а последние три строки состоят из основы торта.

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

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

Попробуйте онлайн!

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

rayryeng
источник
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')

Чтобы увидеть вывод в моноширинном шрифте, замените «alert» на «console.log»

Nainemom
источник
Добро пожаловать в PPCG! :)
2
К сожалению, это отображает поздравительное сообщение и для отрицательного ввода.
manatwork
@BetaDecay tnx :-)
Nainemom,
Манатворк прав: / Я не знаю достаточно JS, чтобы помочь
@ Manatwork да, ты прав! я неправильно понял!
Наинемом,
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
Добро пожаловать в программирование головоломок и Code Golf!
Деннис
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")

Чтобы увидеть вывод в моноширинном шрифте (и переместить выход в консоль) используйте

alert=x=>console.log(x)
Qwertiy
источник
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("--","-")}}

Unminified и обильно разнесены

#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 ( "--", "-" )
        }   
}
Funmungus
источник
Без С шаблона № определяет всего и основной корпус 247.
Funmungus
Добро пожаловать в PPCG! Это действительно хороший ответ - мне особенно нравится злоупотребление макросами A. Я вижу еще пару пробелов, которые можно удалить, и вы можете избавиться от них i, используя cвместо этого переменную цикла. Кроме того, по крайней мере с gcc, включая stdio.h или указывать тип возвращаемого значения main (), нет необходимости: компилятор жалуется на это, но эй, это код гольф. ;)
DLosc 10.09.15
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](вопрос не говорит об использовании аргументов вместо стандартного ввода), и вы можете использовать унарный, +чтобы преобразовать в число:$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"));}}

Оригинал, еще не сыгранный в гольф (при условии, что отрицательные лепешки имеют ширину 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условие, условие выполняется только тогда, когда значения не равны NULL, и, таким образом, компилятор знает, что значения не равны NULL для следующего кода. (Если ничего не введено (EOF), readline возвращает ноль. Если parseInteger встречает нецелое число, он также возвращает ноль. Наша программа затем ничего не делает. Поскольку поведение для этих случаев не было определено, я думаю, это нормально.)

Также у нас есть <=>оператор, который отображается на 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)+"-");}}}

Я попытался импортировать псевдоним repeatas 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 символа (= байт):

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
SimonPJ
источник
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
---
~~~
---
manatwork
источник
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"

Близко к авторскому питону :(

Blex
источник
3

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

Вот версия ревизии 3, в которой нет новых пустых строк на отрицательном вводе - 132 байта.

$==<>;map{print$_ x(!$=||(/ /?$=:($=<1||$=)*2+1)).(/ /&&$=<0?'':$/)}!$=?'Congratulations on your new baby! :D':split 0,' $0 |0-0~0-'
phillipo
источник
Привет, добро пожаловать! Думаю, я поделюсь несколькими способами, как вы можете сэкономить несколько байтов! Вы можете опустить скобки "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это правда (то есть не ноль):
    • 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
 $ $
 | |
-----
~~~~~
-----

С днем ​​рождения!

DLosc
источник
2

Perl, 144 байта

143 байта кода, плюс один дополнительный байт для -nпереключателя для захвата стандартного ввода.

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

СпецБАС, 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))
moorecm
источник
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")

Довольно просто. 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

Луа, 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
FabiF
источник
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

пб , 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]
undergroundmonorail
источник
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)))))
Джастин Данлэп
источник