Введение
В прошлом году был мой день рождения (правда!), И, к сожалению, мне пришлось организовать собственную вечеринку. Ну, теперь вы знаете, не могли бы вы по крайней мере сделать торт?
Вызов
Учитывая целое число в 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>
Ответы:
Pyth,
7372716967 байтПопробуйте онлайн .
Вывод для n <0 содержит 2 ведущих символа новой строки, как это разрешено в комментариях . Чтобы избавиться от них, используйте
источник
CJam,
7675 байтПопробуйте онлайн в интерпретаторе CJam .
Как это устроено
источник
Рубин, 120 байт
Редакция 1 (120 байт)
18 байтов сэкономлено благодаря ручной работе
Редакция 0 (138 байт)
Для положительных чисел: это повторяет строку, соответствующую каждой строке торта. Они используются в качестве строк пэдов для выравнивания справа пустой строки длиной 2 * n + 1. Это позволяет избежать каких-либо сложностей с необходимостью печатать нечетное количество символов, когда естественное повторение равно шагу свечей (то есть 2 символа),
n>0&&
чтобы избежать вывода одного столбца в случае ввода нуля.Для всех чисел: "
n<=>0
" находит знак ввода. Детское сообщение выводится для n = 0, а пустая строка для положительного n (так как правильный вывод уже был дан выше.) Для отрицательного n Ruby интерпретирует -1 как означающий последний элемент массива и выводит свечу без торт.источник
puts
?n=gets.to_i puts ['Congratulations on your new baby! :D',%w{\ $ \ | - ~ -}.map{|e|''.rjust 2*n+1,e},'--- ~~~ ---'][n<=>0]
''.rjust
→e.ljust
.e.just
: очень умный.R 157
источник
R
228226220221 байтПоследнее изменение, исправляющее торт без свечей, было таким же широким, как и положительное в отрицательных случаях, спасибо @CathG и @jbaums за отзыв
источник
<-
может быть=
, и вы можете использоватьa=b='-~-'
.Error: unexpected '}'
JavaScript ES6, 136
Использование оповещения для вывода - неправильный пропорциональный шрифт и результат ужасный. В приведенном ниже фрагменте предупреждения перенаправляется на отсекаемое тело, что дает лучший результат.
Новая строка внутри обратных кавычек значительна и считается.
Попробуйте запустить фрагмент в Firefox.
Меньше гольфа
источник
$('div pre code')[2].innerHTML
;)R, 279 байт
Интерактивная версия (286 байт):
Неинтерактивная версия (279 байт):
источник
MATLAB / Octave,
194198195189171167 байтС днем рождения, Бета Декай! :)
Спасибо HamtaroWarrior за то, что он сбрил 4 байта!
Пробные прогоны
Я поместил это в файл сценария с именем
happy_birthday.m
, а затем запустил его несколько раз в командной строке. Обратите внимание, что когда вы вводите отрицательное число, есть два ведущих возврата каретки, но это разрешено в этом вызове:Код с пробелами и пояснениями
Часть отображения в конце, вероятно, самая запутанная часть кода. Это покажет матрицу символов из 5 строк, где первые две строки состоят из свечей, а последние три строки состоят из основы торта.
Основой для верхней половины дисплея являются либо два пробела в столбце, за которыми следуют еще два пробела в другом столбце в случае отрицательного возраста, либо символ a
$,-
в столбце, за которым следуют два пробела в другом столбце. Это матрица символов 2 x 2. Основой для нижней половины дисплея является вектор из одного столбца,-,~,-
матрица которого 3 x 1.Команда display сначала обрабатывает первые две строки торта, помещая два пробела в первый столбец, затем пары столбцов
$,-
или столбцов пробелов, еслиn
он отрицательный, который изменяется наn=1
, и еще один столбец из двух пробелов повторяется для всегоn
раз. Следующие три строки просто копируют-,$,-
вектор столбца на2*n + 1
время, чтобы выровнять свечи вместе с основанием, тем самым завершив картину.Попробуйте онлайн!
Вы можете попробовать это онлайн с помощью компилятора Octave компании IDEOne: http://ideone.com/4qXDdJ - однако при чтении значений из стандартного ввода есть небольшая ошибка. Таким образом, скрипт немного видоизменяется, когда вам нужно изменить значение
n
в начале кода. Создайте новую версию скрипта и измените ее на любое целочисленное значение, чтобы увидеть, как будет выглядеть вывод.источник
' '.'
!JavaScript,
143153 байта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»
источник
Moonscript, 141 байт
источник
RS , 117 байт
Живая демоверсия и тестовые случаи.
источник
JavaScript ES6, 154 символа
И еще один (154 тоже)
Чтобы увидеть вывод в моноширинном шрифте (и переместить выход в консоль) используйте
источник
Мышь ,
164161 байтМышь явно не идеальный выбор для этой задачи, но это было весело.
Ungolfed:
Стек может содержать только целые числа.
!'
берет целое число из стека и печатает символ ASCII с этим кодом.источник
CoffeeScript, 160 байт
Ungolfed:
Используйте это как:
Попробуйте онлайн: ссылка (содержит некоторый пользовательский код для отображения, так что все выглядит так хорошо ...)
Ой, почти забыл это! С Днем Рождения, @BetaDecay!
источник
C 392 байта
(известная ошибка сегментации, если аргументы не указаны)
Unminified и обильно разнесены
источник
A
. Я вижу еще пару пробелов, которые можно удалить, и вы можете избавиться от нихi
, используяc
вместо этого переменную цикла. Кроме того, по крайней мере с gcc, включая stdio.h или указывать тип возвращаемого значения main (), нет необходимости: компилятор жалуется на это, но эй, это код гольф. ;)Powershell,
139134132126 байтовисточник
$input
вместо$args[0]
(вопрос не говорит об использовании аргументов вместо стандартного ввода), и вы можете использовать унарный,+
чтобы преобразовать в число:$n=+$input;
$args[0]
может и должен быть фактическим int, что позволяет нам по крайней мере отбросить[int]
.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'
Цейлон,
322307260 байт300282278Оригинал, еще не сыгранный в гольф (при условии, что отрицательные лепешки имеют ширину 3 вместо –2 · n + 1):
Это содержит список условий в операторе if, каждое условие определяет значение, которое можно использовать в следующих условиях и в теле. Поскольку они имеют
exist
условие, условие выполняется только тогда, когда значения не равны NULL, и, таким образом, компилятор знает, что значения не равны NULL для следующего кода. (Если ничего не введено (EOF), readline возвращает ноль. Если parseInteger встречает нецелое число, он также возвращает ноль. Наша программа затем ничего не делает. Поскольку поведение для этих случаев не было определено, я думаю, это нормально.)Также у нас есть
<=>
оператор, который отображается наComparable.compare
метод и возвращаетComparison
объект, то есть один изequal
,smaller
иlarger
. Компилятор знает, что они исчерпываютComparison
тип, поэтомуelse
в нашемswitch
утверждении нет необходимости .repeat
Метод класса String , делает то , что можно было бы ожидать. Он на самом деле наследуется от метода с тем же именем в интерфейсе Iterable (поскольку строка, помимо всего прочего, просто список символов).Замена моих идентификаторов однобуквенными и удаление ненужных пробелов дает 322 символа:
Замена ряда
print
явных\n
s (и одного единственногоprint
) приводит к 307:Я попытался импортировать псевдоним
repeat
asr
, но это не помогает (объявление импорта добавляет 40 символов, и мы можем сохранить только 25, заменив ихrepeat
наr
).То, что немного помогает, использует
n.sign
вместоn<=>0
. В то время как эти два выражения имеют одинаковую текстовую длину, они имеют различные типы: последний один имеет типаComparison
упомянутый выше (который имеет три значенияsmaller
,larger
аequal
), бывший один имеет типInteger
, со значениями-1
,1
,0
... и потому , чтоInteger
имеет еще много значений, нам также нужноelse
предложение. Это 300 символов в длину:Здесь с пробелами:
Мы можем сэкономить еще немного, уйдя в отставку из-за нашего оператора switch и используя
if
, получая 282 символа (= байт):отформатирован:
Мы можем сохранить другой байт, поменяв местами регистры, так
>
как они короче, чем==
. Другое «раздражение» - это повторениеrepeat(n)
- мы можем определить локальную функцию (замыкание, которое она запоминаетn
из определяющего блока) с более коротким именем:Это более короткий способ написания этого:
Мы могли бы использовать
function
вместо возвращаемого типа для вывода типа, но это не короче. Это дает нам 278 байтов:отформатирован:
На самом деле, используя
then
иelse
оператор вместоif
утверждений позволяет сохранить некоторые вызовыprint
(и некоторые фигурные скобки):Это всего лишь 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 имеет закомментированную версию этого .
источник
Python 2, 158 байт
источник
Golflua, 113 символов
Образец прогона:
источник
Python 2, 150 байт
Близко к авторскому питону :(
источник
Perl
139127117 байтНе требует параметров «-n» или «-p».
Редакция 3 (с благодарностью Dom Hastings ниже):
Редакция 2:
Редакция 1:
Вот версия ревизии 3, в которой нет новых пустых строк на отрицательном вводе - 132 байта.
источник
"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
но если вы используете$=
вместо этого, вы могли бы уменьшить его больше! Я всегда забываю, какой из$-
или$=
не может быть отрицательным, поэтому я не хотел упоминать об этом и ошибаться! :)Пип, 74 + 1 = 75 байт
Принимает возраст в качестве аргумента командной строки. Требуется
-n
флаг.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
:С днем рождения!
источник
Perl, 144 байта
143 байта кода, плюс один дополнительный байт для
-n
переключателя для захвата стандартного ввода.источник
print"-~-"=~s!.!$&x($_*2+1).$/!ger
для торта?-p
это также будет работать:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
СпецБАС, 164
Использует ярлык апостроф для перехода на новую строку
Отформатирован для удобства чтения
источник
Python 3, 169 байт
источник
Юлия, 143 байта
Довольно просто. Ungolfed:
источник
Луа, 299 байт
источник
attempt to compare string with number
), но добавление0+
передio.read()
исправляет это для меня. Вы также можете сохранить несколько байтов, присваиваяprint
иstring.rep
символьные переменные.Mathematica, 164 байта
Полностью пропустили торты без свечей при n <0, добавив еще 15 символов
источник
пб , 567 байт
У меня есть некоторые сожаления.
Есть несколько способов, которыми это могло бы быть лучше. Например, выяснив, что вход является отрицательным, я затем продолжаю выводить, какое это отрицательное число. Это не нужно, и, возможно, однажды я вернусь к этому коду, чтобы остановить его.
Не пытайтесь запустить это в режиме pbi "watch", если вы введете отрицательный знак, он потерпит крах при попытке печати
chr(-1)
.Вот
объясненная версия,где я делал заметки во время написания программы. Если вы хотите лучше понять, как это работает ... удачи, и дайте мне знать, если вы поймете это.источник
ScriptCS (C # script), 221 байт
Очевидно, это не выиграет никаких призов, но ...
источник