To moje urodziny: D


112

Wprowadzenie

W zeszłym roku były moje urodziny (naprawdę!) I niestety musiałem zorganizować własne przyjęcie. Teraz wiesz, czy nie mógłbyś przynajmniej zrobić ciasta?

Wyzwanie

Biorąc pod uwagę liczbę całkowitą njako dane wejściowe, napisz pełny program, aby wypuścił tort urodzinowy z nzapalonymi świecami.

Wynik

Kawałek ciasta z jedną świecą to:

 $
 |
---
~~~
---

A kawałek ciasta z trzema świecami to:

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

Jestem pewien, że możesz to rozwiązać

Jednak w przypadku danych wejściowych0należy wygenerować następujące dane:

Congratulations on your new baby! :D

Dla danych wejściowych mniejszych niż 0, powinieneś otrzymać ciasto bez świec:

---
~~~
---

Nic nie może być wysyłane do STDERR.

Końcowe znaki nowej linii i spacje są dozwolone.

Zwycięski

Najkrótszy kod w bajtach wygrywa.

Tabela liderów

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
Wszystkiego najlepszego z okazji urodzin!
Dennis

1
czy w przypadku ciasta bez świec dopuszcza się wiodące białe znaki (na przykład 2 znaki nowej linii)?
Level River St

2
@steveverrill Tak

2
@ PaŭloEbermann Ciasto 3 szerokości

4
@jvriesem Nie. To kod fragmentu kodu.
sigod

Odpowiedzi:


36

Pyth, 73 72 71 69 67 bajtów

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

Wypróbuj online .

Dane wyjściowe dla n <0 zawierają 2 wiodące znaki nowej linii, jak dopuszcza się w komentarzach . Aby się ich pozbyć, użyj

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

Najmniejszy kod, oczywiście, wydaje się być najmniej czytelny dla człowieka.
Sathish Sanjeevi

Co to do cholery jest??? LOL
Starx

18

CJam, 76 75 bajtów

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

Wypróbuj online w interpretatorze CJam .

Jak to działa

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

Rubin, 120 bajtów

Wersja 1 (120 bajtów)

18 bajtów zaoszczędzonych dzięki manatwork

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

Wersja 0 (138 bajtów)

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

Dla liczb dodatnich: iteruje się przez ciąg odpowiadający każdej linii ciasta. Są one używane jako łańcuchy padów w celu uzasadnienia pustego łańcucha na długość 2 * n + 1. Pozwala to uniknąć komplikacji związanych z koniecznością drukowania nieparzystej liczby znaków, gdy naturalne powtarzanie jest równe skokowi świec (tj. 2 znaki). n>0&&Jest to konieczne, aby uniknąć wyprowadzenia pojedynczej kolumny w przypadku wprowadzenia zera.

Dla wszystkich liczb: „ n<=>0” znajduje znak wejścia. Komunikat potomny jest wyprowadzany dla n = 0, a pusty ciąg dla dodatniego n (jak podano już poprawne wyjście). W przypadku ujemnego n Ruby interpretuje -1 jako ostatni element tablicy i wysyła bez świec ciasto.


1
Czy nie ma ich zbyt wiele puts? n=gets.to_i puts ['Congratulations on your new baby! :D',%w{\ $ \ | - ~ -}.map{|e|''.rjust 2*n+1,e},'--- ~~~ ---'][n<=>0]
manatwork

1
Jeszcze jedno: ''.rjuste.ljust.
manatwork

@manatwork dzięki, powinienem to zauważyć, ale zrobiłem to bardzo szybko. Nie wiedziałem o przestrzeni odwrotnego ukośnika z% w. I e.just: bardzo sprytny.
Level River St

11

R 157

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

2
Dużo się uczę na temat zapisywania parametrów. Genialny
Tensibai

10

R, 228 226 220 221 bajtów


Ostatnia edycja, aby poprawić ciasto bez świec, była tak szeroka jak pozytywna w negatywnych przypadkach, dziękuję @CathG i @jbaums za opinie

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
Można zapisać kilka bajtów: <-można =i można używać a=b='-~-'.
jbaums

Ho, dzięki @jbaums zapomniałem pierwszego = i nie pomyślałem o podwójnym przypisaniu
Tensibai

Mam gdzieś problem z Error: unexpected '}'
nawiasami

@flodel poprawiony. Problem z kopiowaniem / wklejaniem
Tensibai

10

JavaScript ES6, 136

Użycie alertu do wydruku - zła czcionka proporcjonalna, a wynik jest brzydki. W poniższym fragmencie alert jest przekierowywany do wyciętego ciała, co daje lepszy wynik.
Nowa linia w backticks jest znacząca i liczona.

Przetestuj uruchomienie fragmentu w przeglądarce 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>

Mniej golfa

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

Spróbuj tego $('div pre code')[2].innerHTML;)
Vasu Adari,

7

R, 279 bajtów

Wersja interaktywna (286 bajtów):

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

Wersja nieinteraktywna (279 bajtów):

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

7

MATLAB / Octave, 194 198 195 189 171 167 bajtów

Wszystkiego najlepszego Beta Decay! :)

Dzięki HamtaroWarrior za golenie 4 bajtów!


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)]);

Przykładowe przebiegi

Umieściłem to w skrypcie o nazwie happy_birthday.m, a następnie uruchomiłem go kilka razy w wierszu polecenia. Pamiętaj, że po wprowadzeniu liczby ujemnej są dwa wiodące zwroty karetki, ale jest to dozwolone w tym wyzwaniu:

>> 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
 $ $ $ $ $ 
 | | | | | 
-----------
~~~~~~~~~~~
-----------

Kod z odstępami i objaśnieniami

% 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)]);

Część wyświetlająca na końcu jest prawdopodobnie najbardziej zaciemnioną częścią kodu. Zostanie wyświetlona macierz znaków 5-rzędowa, w której pierwsze dwa rzędy składają się ze świec, a ostatnie trzy rzędy składają się z podstawy ciasta.

Podstawą górnej połowy wyświetlacza są albo dwie spacje w kolumnie, a następnie kolejne dwie spacje w innej kolumnie w przypadku, gdy wiek jest ujemny, lub a $,-w kolumnie, po której następują dwie spacje w innej kolumnie. Jest to macierz 2 x 2 znaki. Podstawą dolnej połowy wyświetlacza jest wektor jednokolumnowy, -,~,-którego matryca ma wymiary 3 x 1.

Polecenie wyświetlania najpierw zajmuje się pierwszymi dwoma rzędami ciasta, umieszczając dwie spacje w pierwszej kolumnie, a następnie pary kolumn $,-lub kolumny spacji, jeśli njest ujemna, która zmienia się na n=1, i kolejną kolumnę dwóch spacji powtarzaną dla ogółem nrazy. Kolejne trzy rzędy po prostu replikują -,$,-wektor kolumny 2*n + 1razy, aby wyrównać świece razem z podstawą, uzupełniając w ten sposób obraz.

Wypróbuj online!

Możesz wypróbować to online za pomocą kompilatora Octave IDEOne: http://ideone.com/4qXDdJ - jednak występuje niewielki błąd podczas odczytu wartości ze standardowego wejścia. W związku z tym skrypt jest nieco modyfikowany, w którym należy zmienić wartość nna początku kodu. Rozwidlaj nową wersję skryptu i zmień ją na dowolną liczbę całkowitą, która Ci odpowiada, aby zobaczyć, jak wygląda wyjście.


1
Szkoda, że ​​nie możesz zapisać kropki ' '.'!
Luis Mendo,

1
@LuisMendo - wiem! ... choć jestem pewien, że nie sprzeciwisz się stosowaniu transpozycji w ten sposób :)
rayryeng

1
Hahaha. Powiedziano mi kiedyś, że ta strona jest przeznaczona do nadużywania języka. I wiernie przestrzegam tej zasady!
Luis Mendo,

1
@LuisMendo - Naprawdę chciałem pozbyć się kropki ... ale nie mogłem, ponieważ MATLAB interpretuje to jako pojedynczy cytat w ciągu :(. Oszczędziłby mi kilka bajtów ... ale po wielu iteracjach było to najlepsze, co mogłem wymyślić.
rayryeng

@LuisMendo - udało się go zmniejszyć do 171!
rayryeng

6

JavaScript, 143 153 bajtów

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

Aby zobaczyć wynik w czcionce mono space, zamień „alert” na „console.log”


Witamy w PPCG! :)

2
Niestety wyświetla to również komunikat z gratulacjami dla negatywnych danych wejściowych.
manatwork

@BetaDecay tnx :-)
Nainemom

Manatwork ma rację: / Nie wiem wystarczająco dużo JS, aby pomóc

@manatwork tak masz rację! Źle zrozumiałem!
Nainemom,

5

Moonscript, 141 bajtów

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
Witamy w Programowaniu zagadek i Code Golf!
Dennis,


4

JavaScript ES6, 154 znaków

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

I jeszcze jeden (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")

Aby wyświetlić dane wyjściowe czcionką monospace (i przenieść ouptut do konsoli), użyj

alert=x=>console.log(x)

4

Mysz , 164 161 bajtów

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

Mysz najwyraźniej nie jest idealnym wyborem do tego zadania, ale była fajna.

Nie golfowany:

? 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
@

Stos może zawierać tylko liczby całkowite. !'usuwa liczbę całkowitą ze stosu i drukuje znak ASCII z tym kodem.


4

CoffeeScript, 160 bajtów

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"

Nie golfowany:

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

Używaj go jak:

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

Wypróbuj online: link (zawiera niestandardowy kod wyświetlania, więc wszystko wygląda tak ładnie ...)

Ups, prawie zapomniałem! Wszystkiego najlepszego, @BetaDecay!


4

C, 392 bajtów

(znany błąd segmentacji, jeśli nie podano argumentów)

#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 i obficie rozmieszczone

#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 ( "--", "-" )
        }   
}


Witamy w PPCG! To naprawdę dobra odpowiedź - szczególnie podoba mi się nadużycie makr A. Widzę jeszcze kilka spacji, które można usunąć i można się ich pozbyć i, używając czamiast tego zmiennej pętli. Ponadto, przynajmniej w przypadku gcc, w tym stdio.h lub określenia typu zwracanego przez main (), nie jest konieczne: kompilator narzeka na to, ale hej, to jest kod golfowy. ;)
DLosc

4

PowerShellu, 139 134 132 126 bajtów

$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'}

Możesz zapisać 5 bajtów, używając $inputzamiast $args[0](pytanie nie mówi, aby użyć argumentów zamiast standardowego wejścia), i możesz użyć unary, +aby przekonwertować na liczbę:$n=+$input;
briantist

Wydawało się, że wejście + $ nie działa - narzekało, że $ input to moduł wyliczający i nie ma operatora dodawania. Jednak $args[0]może i powinien być faktyczną int, pozwalając nam przynajmniej upuścić [int].
Justin Dunlap,

1
To jest naprawdę stare, ale można zaoszczędzić kilka bajtów, przenosząc dane wejściowe do ifi zamieniając elsena ;exit- 122 bajty -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

Cejlon, 322 307 300 282 278 260 bajtów

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

Nie grał jeszcze w golfa (zakładając, że negatywne ciasta mają szerokość 3 zamiast –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) + "-");
        }
    }
}

Zawiera listę warunków w instrukcji if, przy czym każdy warunek definiuje wartość użyteczną w następujących warunkach oraz w treści. Ponieważ mają taką wartość exist, warunek jest spełniony tylko wtedy, gdy wartości nie są puste, a zatem kompilator wie, że wartości nie są puste dla następującego kodu. (Jeśli nic nie zostanie wprowadzone (EOF), readline zwraca null. Jeśli parseInteger trafi na liczbę całkowitą, to również zwróci null. Nasz program nie robi nic. Ponieważ zachowanie dla tych przypadków nie zostało zdefiniowane, myślę, że to jest w porządku.)

Również mamy do <=>operatora, który mapuje do Comparable.comparemetody i zwraca Comparisonobiekt, czyli jedną equal, smalleri larger. Kompilator wie, że wyczerpują one Comparisontyp, więc elsew naszej switchinstrukcji nie jest wymagana żadna klauzula .

repeatMetoda klasy String robi to, co można by oczekiwać. W rzeczywistości jest dziedziczony z metody o tej samej nazwie w interfejsie Iterable (ponieważ ciąg znaków, oprócz innych rzeczy, jest tylko listą znaków).

Zastąpienie moich identyfikatorów jednoliterowymi i usunięcie niepotrzebnych białych znaków daje 322 znaki:

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)+"-");}}}

Zastąpienie serii printjawnymi \ns (i jednym pojedynczym print) sprowadza ją do 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)+"-");}}}

Próbowałem alias-importowanie repeatjak r, ale to nie pomaga (deklaracja importowa dodaje 40 znaków, a my możemy tylko zaoszczędzić 25 zastępując repeatz r).

To, co nieco pomaga, to używanie n.signzamiast n<=>0. Chociaż te dwa wyrażenia mają taką samą długość tekstową, mają różne rodzaje: ten drugi jest typu Comparisonwymienionego wcześniej (który ma trzy wartości smaller, largeri equal), byłego jeden ma typ Integer, z wartościami -1, 1, 0... i dlatego Integerma wiele innych wartości, potrzebujemy także elseklauzuli. Ma 300 znaków:

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{}}}

Tutaj z białymi znakami:

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 {}
    }
}

Możemy jeszcze trochę zabezpieczyć rezygnując z naszej instrukcji switch i używając if, dochodząc do 282 znaków (= bajtów):

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)+"-");}}}

Sformatowany:

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) + "-");
        }
    }
}

Możemy zabezpieczyć kolejny bajt, zamieniając skrzynki, ponieważ >jest on krótszy niż ==. Kolejnym „rozdrażnieniem” jest powtarzanie się repeat(n)- możemy zdefiniować funkcję lokalną (zamknięcie, pamięta nz bloku definiującego) o krótszej nazwie:

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

Jest to krótszy sposób napisania tego:

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

Możemy użyć functionzamiast typu zwracanego do wnioskowania o typ, ale nie jest to krótsze. To daje nam 278 bajtów:

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

Sformatowany:

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

Właściwie użycie operatorów theni elsezamiast ifinstrukcji pozwala nam zapisać niektóre wywołania print(i niektórych nawiasów klamrowych):

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

To tylko 261 bajtów:

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

(Użyłem runzamiast bnazwy funkcji, ponieważ w ten sposób można ją uruchomić ceylon runbez podawania nazwy funkcji.)

Moje repozytorium Github ma skomentowaną wersję tego .


3

Python 2, 158 bajtów


i=input()
l='\n'
s=''
if i==0:s='Congratulations on your new baby! :D'
elif i<0:s='---\n~~~\n---'
else:n=i*2+1;a=l+'-'*n;s=' $'*i+l+' |'*i+a+l+'~'*n+a
print s

3

golflua, 113 znaków

\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"-"$

Przykładowy przebieg:

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 bajtów

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"

Blisko autora Python :(


3

Perl, 139 127 117 bajtów

Nie wymaga opcji „-n” ani „-p”.

Wersja 3 (dzięki dzięki Dom Hastings poniżej):

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

Wersja 2:

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

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

Oto wersja wersji 3, która nie ma wiodących pustych nowych wierszy na ujemnym wejściu - 132 bajty.

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

Cześć, witaj! Pomyślałem, że podzielę się kilkoma sposobami na zaoszczędzenie niektórych bajtów! Można upuścić nawiasy wokół "Congratulations..."i jeśli zastąpi ' $',' |','-','~','-'się split 0,' $0 |0-0~0-'można odrzucić te wsporniki też. Innym Zapisz zastępuje $n=<>;$n==0się ($n=<>)==0. Również możesz ?1:być ||taki, jak mówisz $n==0(czyli 1) lub twoje obliczenia. Mam nadzieję, że to pomaga!
Dom Hastings,

Cześć, dzięki za to. Te nawiasy są dobre, a przypomnienie mi o semantyce ||jest bardzo pomocne - przypomniało mi $=to zasadniczo chompo danych wejściowych, eliminując konieczność testowania konkretnych wartości 0. Nie jestem pewien, co masz na myśli $n=<>;$n==0- mój golf tego nie ma, a biorąc pod uwagę, że jako argument wejściowy zajmuję się przypadkiem input = 0 map{}(), nie jestem pewien, jak by to miało zastosowanie? W każdym razie, biorąc pod uwagę twoje komentarze i używając $=jako mojej zmiennej, zostało to obniżone do 117 parbytes. Dziękuję bardzo!
phillipo

Żaden problem! Cieszę się, że pomogłem! Chodzi mi o to, że masz $n=<>;na początku, a potem $n==0z tyłu, map{}...więc myślę, że możesz mieć czek, ($n=<>)==0ale jeśli używasz $=zamiast tego, możesz być w stanie go bardziej zmniejszyć! I zawsze zapomnieć o których $-albo $=nie może być ujemna, więc nie chciałem wspomnieć o tym i się mylić! :)
Dom Hastings,

3

Pip, 74 + 1 = 75 bajtów

Traktuje wiek jako argument wiersza poleceń. Wymaga -nflagi.

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

Repozytorium Github dla Pip

Argument wiersza polecenia jest przechowywany w a. Podzielimy "-~-"się na listę znaków i Yzakotwiczymy w zmiennej y. Reszta programu to duże trójstronne wyrażenie:

  • a?
    Jeśli ajest prawdą (tzn. Nie zero):
    • a<0?yX3
      Jeśli ajest ujemny, wróć yz każdym elementem powtarzanym 3 razy:["---";"~~~";"---"]
    • W przeciwnym razie ( ajest dodatnia):
      • (s.^"$|")Xa
        Podziel "$|"na listę znaków, dodaj do nich spację ( s) i powtórz każdy wynikowy element arazy
      • yX2*a+1
        Powtórz każdy element y 2*a+1razy
      • AL
        Dołącz dwie listy
  • W przeciwnym razie ( awynosi zero), zwróć ciąg gratulacyjny

Pod koniec programu -nflaga zapewnia, że ​​listy są drukowane z elementami w osobnych wierszach, wyświetlając w ten sposób odpowiednio warstwowe ciasto.

Oto kroki do wprowadzenia 2:

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

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

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

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

Wszystkiego najlepszego z okazji urodzin!


2

Perl, 144 bajty

143 bajty kodu plus jeden dodatkowy bajt dla -nprzełącznika do przechwytywania standardowego wejścia.

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).$/!gerna ciasto?
manatwork

Jeśli zmienisz przełącznik na -pten, będzie również działać:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
manatwork

2

SpecBAS, 164

Używa skrótu apostrofu, aby przejść do nowej linii

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

Sformatowany dla łatwiejszego czytania

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 bajtów

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

2

Julia, 143 bajty

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

Całkiem proste. Nie golfowany:

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

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

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

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

2

Lua, 299 bajtów

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
Witamy w PPCG! Twój kod w obecnej postaci wydaje się wyświetlać błąd ( attempt to compare string with number), ale dodanie go 0+przedtem io.read()naprawia dla mnie. Możesz także zaoszczędzić sporo bajtów, przypisując printi string.repdo zmiennych jednoznakowych.
DLosc

@DLosc dzięki, dobry pomysł :) i tak, masz rację z powodu błędu przepraszam za to
FabiF

2

Mathematica, 164 bajtów

Całkowicie opuściłem ciastka bez świec dla n <0, dodając dodatkowe 15 znaków

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
Witamy w PPCG, to wyzwanie nazywane jest golfem kodowym, w którym starasz się, aby Twój kod był jak najkrótszy. Można to zrobić, usuwając niepotrzebne białe znaki i skracając nazwy zmiennych.

Dzięki @BetaDecay dostałem szybką wersję .. minimalizuję teraz. Pozdrawiam: D
Martin John Hadley,

Nie ma problemu. Wygląda dobrze :)

2

sb , 567 bajtów

^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]

Żałuję trochę.

Jest kilka sposobów, które mogłyby być lepsze. Na przykład po ustaleniu, że dane wejściowe są ujemne, następnie dedukuję, która to liczba ujemna. Jest to niepotrzebne i być może kiedyś wrócę do tego kodu, aby go zatrzymać.

Nie próbuj uruchamiać tego w trybie „oglądania” pbi, jeśli wpiszesz znak ujemny, zawiesi się podczas próby drukowania chr(-1).

Oto wyjaśniona wersja wersji, w której robiłem notatki podczas pisania programu. Jeśli chcesz lepiej zrozumieć, jak to działa ... powodzenia i daj mi znać, jeśli to rozwiążesz.

# 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 (skrypt C #), 221 bajtów

Oczywiście nie wygra to żadnych nagród, ale ...

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)))))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.