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ą n
jako dane wejściowe, napisz pełny program, aby wypuścił tort urodzinowy z n
zapalonymi ś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ściowych0
należ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>
Odpowiedzi:
Pyth,
7372716967 bajtówWypró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
źródło
CJam,
7675 bajtówWypróbuj online w interpretatorze CJam .
Jak to działa
źródło
Rubin, 120 bajtów
Wersja 1 (120 bajtów)
18 bajtów zaoszczędzonych dzięki manatwork
Wersja 0 (138 bajtów)
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.źródło
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
: bardzo sprytny.R 157
źródło
R,
228226220221 bajtówOstatnia edycja, aby poprawić ciasto bez świec, była tak szeroka jak pozytywna w negatywnych przypadkach, dziękuję @CathG i @jbaums za opinie
źródło
<-
można=
i można używaća=b='-~-'
.Error: unexpected '}'
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.
Mniej golfa
źródło
$('div pre code')[2].innerHTML
;)R, 279 bajtów
Wersja interaktywna (286 bajtów):
Wersja nieinteraktywna (279 bajtów):
źródło
MATLAB / Octave,
194198195189171167 bajtówWszystkiego najlepszego Beta Decay! :)
Dzięki HamtaroWarrior za golenie 4 bajtów!
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:Kod z odstępami i objaśnieniami
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ślin
jest ujemna, która zmienia się nan=1
, i kolejną kolumnę dwóch spacji powtarzaną dla ogółemn
razy. Kolejne trzy rzędy po prostu replikują-,$,-
wektor kolumny2*n + 1
razy, 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ść
n
na 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.źródło
' '.'
!JavaScript,
143153 bajtówfor(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”
źródło
Moonscript, 141 bajtów
źródło
rs , 117 bajtów
Prezentacje na żywo i przypadki testowe.
źródło
JavaScript ES6, 154 znaków
I jeszcze jeden (154)
Aby wyświetlić dane wyjściowe czcionką monospace (i przenieść ouptut do konsoli), użyj
źródło
Mysz ,
164161 bajtówMysz najwyraźniej nie jest idealnym wyborem do tego zadania, ale była fajna.
Nie golfowany:
Stos może zawierać tylko liczby całkowite.
!'
usuwa liczbę całkowitą ze stosu i drukuje znak ASCII z tym kodem.źródło
CoffeeScript, 160 bajtów
Nie golfowany:
Używaj go jak:
Wypróbuj online: link (zawiera niestandardowy kod wyświetlania, więc wszystko wygląda tak ładnie ...)
Ups, prawie zapomniałem! Wszystkiego najlepszego, @BetaDecay!
źródło
C, 392 bajtów
(znany błąd segmentacji, jeśli nie podano argumentów)
Unminified i obficie rozmieszczone
źródło
A
. Widzę jeszcze kilka spacji, które można usunąć i można się ich pozbyći
, używającc
zamiast 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. ;)PowerShellu,
139134132126 bajtówźródło
$input
zamiast$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;
$args[0]
może i powinien być faktyczną int, pozwalając nam przynajmniej upuścić[int]
.if
i zamieniającelse
na;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'
Cejlon,
322307260 bajtów300282278Nie grał jeszcze w golfa (zakładając, że negatywne ciasta mają szerokość 3 zamiast –2 · n + 1):
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 doComparable.compare
metody i zwracaComparison
obiekt, czyli jednąequal
,smaller
ilarger
. Kompilator wie, że wyczerpują oneComparison
typ, więcelse
w naszejswitch
instrukcji nie jest wymagana żadna klauzula .repeat
Metoda 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:
Zastąpienie serii
print
jawnymi\n
s (i jednym pojedynczymprint
) sprowadza ją do 307:Próbowałem alias-importowanie
repeat
jakr
, ale to nie pomaga (deklaracja importowa dodaje 40 znaków, a my możemy tylko zaoszczędzić 25 zastępującrepeat
zr
).To, co nieco pomaga, to używanie
n.sign
zamiastn<=>0
. Chociaż te dwa wyrażenia mają taką samą długość tekstową, mają różne rodzaje: ten drugi jest typuComparison
wymienionego wcześniej (który ma trzy wartoścismaller
,larger
iequal
), byłego jeden ma typInteger
, z wartościami-1
,1
,0
... i dlategoInteger
ma wiele innych wartości, potrzebujemy takżeelse
klauzuli. Ma 300 znaków:Tutaj z białymi znakami:
Możemy jeszcze trochę zabezpieczyć rezygnując z naszej instrukcji switch i używając
if
, dochodząc do 282 znaków (= bajtów):Sformatowany:
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ętan
z bloku definiującego) o krótszej nazwie:Jest to krótszy sposób napisania tego:
Możemy użyć
function
zamiast typu zwracanego do wnioskowania o typ, ale nie jest to krótsze. To daje nam 278 bajtów:Sformatowany:
Właściwie użycie operatorów
then
ielse
zamiastif
instrukcji pozwala nam zapisać niektóre wywołaniaprint
(i niektórych nawiasów klamrowych):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
run
zamiastb
nazwy funkcji, ponieważ w ten sposób można ją uruchomićceylon run
bez podawania nazwy funkcji.)Moje repozytorium Github ma skomentowaną wersję tego .
źródło
Python 2, 158 bajtów
źródło
golflua, 113 znaków
Przykładowy przebieg:
źródło
Python 2, 150 bajtów
Blisko autora Python :(
źródło
Perl,
139127117 bajtówNie wymaga opcji „-n” ani „-p”.
Wersja 3 (dzięki dzięki Dom Hastings poniżej):
Wersja 2:
Wersja 1:
Oto wersja wersji 3, która nie ma wiodących pustych nowych wierszy na ujemnym wejściu - 132 bajty.
źródło
"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==0
się($n=<>)==0
. Również możesz?1:
być||
taki, jak mówisz$n==0
(czyli 1) lub twoje obliczenia. Mam nadzieję, że to pomaga!||
jest bardzo pomocne - przypomniało mi$=
to zasadniczochomp
o 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 = 0map{}()
, 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!$n=<>;
na początku, a potem$n==0
z tyłu,map{}...
więc myślę, że możesz mieć czek,($n=<>)==0
ale 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ć! :)Pip, 74 + 1 = 75 bajtów
Traktuje wiek jako argument wiersza poleceń. Wymaga
-n
flagi.Repozytorium Github dla Pip
Argument wiersza polecenia jest przechowywany w
a
. Podzielimy"-~-"
się na listę znaków iY
zakotwiczymy w zmiennejy
. Reszta programu to duże trójstronne wyrażenie:a?
Jeśli
a
jest prawdą (tzn. Nie zero):a<0?yX3
Jeśli
a
jest ujemny, wróćy
z każdym elementem powtarzanym 3 razy:["---";"~~~";"---"]
a
jest dodatnia):(s.^"$|")Xa
Podziel
"$|"
na listę znaków, dodaj do nich spację (s
) i powtórz każdy wynikowy elementa
razyyX2*a+1
Powtórz każdy element
y
2*a+1
razyAL
Dołącz dwie listy
a
wynosi zero), zwróć ciąg gratulacyjnyPod koniec programu
-n
flaga 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
:Wszystkiego najlepszego z okazji urodzin!
źródło
Perl, 144 bajty
143 bajty kodu plus jeden dodatkowy bajt dla
-n
przełącznika do przechwytywania standardowego wejścia.źródło
print"-~-"=~s!.!$&x($_*2+1).$/!ger
na ciasto?-p
ten, będzie również działać:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
SpecBAS, 164
Używa skrótu apostrofu, aby przejść do nowej linii
Sformatowany dla łatwiejszego czytania
źródło
Python 3, 169 bajtów
źródło
Julia, 143 bajty
Całkiem proste. Nie golfowany:
źródło
Lua, 299 bajtów
źródło
attempt to compare string with number
), ale dodanie go0+
przedtemio.read()
naprawia dla mnie. Możesz także zaoszczędzić sporo bajtów, przypisującprint
istring.rep
do zmiennych jednoznakowych.Mathematica, 164 bajtów
Całkowicie opuściłem ciastka bez świec dla n <0, dodając dodatkowe 15 znaków
źródło
sb , 567 bajtów
Ż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 wersjawersji, 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.źródło
ScriptCS (skrypt C #), 221 bajtów
Oczywiście nie wygra to żadnych nagród, ale ...
źródło