Einführung
Letztes Jahr war mein Geburtstag (wirklich!) Und leider musste ich meine eigene Party organisieren. Nun, jetzt weißt du, könntest du nicht wenigstens den Kuchen machen?
Herausforderung
n
Schreiben Sie mit einer Ganzzahl als Eingabe ein vollständiges Programm, um eine Geburtstagstorte mit n
Kerzen auszugeben .
Ausgabe
Ein Stück Kuchen mit einer Kerze ist:
$
|
---
~~~
---
Und ein Stück Kuchen mit drei Kerzen ist:
$ $ $
| | |
-------
~~~~~~~
-------
Ich bin sicher, Sie können es daraus herausarbeiten
Allerdings , fürEingabe0
müssen Sie Ausgabe des folgenden:
Congratulations on your new baby! :D
Für Eingaben unter 0
sollten Sie einen kerzenlosen Kuchen ausgeben:
---
~~~
---
Es darf nichts nach STDERR ausgegeben werden.
Nachgestellte Zeilenumbrüche und Leerzeichen sind zulässig.
Gewinnen
Kürzester Code in Bytes gewinnt.
Bestenliste
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>
Antworten:
Pyth,
7372716967 BytesProbieren Sie es online aus .
Die Ausgabe für n <0 enthält 2 führende Zeilenumbrüche, wie in Kommentaren zulässig . Um sie loszuwerden, verwenden Sie
quelle
CJam,
7675 BytesProbieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
Ruby, 120 Bytes
Revision 1 (120 Bytes)
18 Bytes gespart dank Handarbeit
Revision 0 (138 Bytes)
Für positive Zahlen: Dies durchläuft eine Zeichenfolge, die jeder Zeile des Kuchens entspricht. Diese werden als Pad-Zeichenfolgen verwendet, um die leere Zeichenfolge mit der Länge 2 * n + 1 rechtsbündig auszurichten. Dies vermeidet Komplikationen beim Drucken einer ungeraden Anzahl von Zeichen, wenn die natürliche Wiederholung dem Abstand der Kerzen entspricht (dh 2 Zeichen)
n>0&&
, um die Ausgabe einer einzelnen Spalte bei Eingabe von Null zu vermeiden.Für alle Zahlen: "
n<=>0
" findet das Vorzeichen der Eingabe. Die Babynachricht wird für n = 0 und eine leere Zeichenfolge für positives n ausgegeben (da die korrekte Ausgabe bereits oben angegeben wurde). Für negatives n interpretiert Ruby das -1 als letztes Element des Arrays und gibt das kerzenlose Element aus Kuchen.quelle
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
: sehr schlau.R 157
quelle
R,
228226220221 BytesDie letzte Änderung zur Korrektur des kerzenlosen Kuchens war genauso umfangreich wie die positive für negative Fälle. Vielen Dank an @CathG und @jbaums für das Feedback
quelle
<-
kann sein=
, und Sie können verwendena=b='-~-'
.Error: unexpected '}'
JavaScript ES6, 136
Verwenden der Warnung für die Ausgabe - schlechte proportionale Schrift und das Ergebnis ist hässlich. Im folgenden Snippet wird die Warnung an den ausgeschnittenen Körper weitergeleitet, um ein besseres Ergebnis zu erzielen.
Der Zeilenvorschub innerhalb der Backticks ist signifikant und wird gezählt.
Testen Sie das Snippet in Firefox.
Weniger golfen
quelle
$('div pre code')[2].innerHTML
;)R, 279 Bytes
Interaktive Version (286 Bytes):
Nicht interaktive Version (279 Bytes):
quelle
MATLAB / Octave,
194198195189171167 BytesAlles Gute zum Geburtstag Beta Decay! :)
Vielen Dank an HamtaroWarrior für das Abschneiden von 4 Bytes!
Probeläufe
Ich habe dies in eine Skriptdatei mit dem Namen
happy_birthday.m
eingefügt und es dann einige Male in der Eingabeaufforderung ausgeführt. Beachten Sie, dass bei der Eingabe einer negativen Zahl zwei führende Zeilenumbrüche auftreten, was bei dieser Herausforderung jedoch zulässig ist:Code mit Abstand und Erläuterungen
Der Anzeigeteil am Ende ist wahrscheinlich der am meisten verschleierte Teil des Codes. Daraufhin wird eine 5-zeilige Zeichenmatrix angezeigt, in der die ersten beiden Zeilen aus den Kerzen und die letzten drei Zeilen aus der Basis des Kuchens bestehen.
Die Basis für die obere Hälfte der Anzeige sind entweder zwei Leerzeichen in einer Spalte, gefolgt von zwei Leerzeichen in einer anderen Spalte, falls das Alter negativ ist, oder a
$,-
in einer Spalte, gefolgt von zwei Leerzeichen in einer anderen Spalte. Dies ist eine 2 x 2 Zeichenmatrix. Die Basis für die untere Hälfte der Anzeige ist ein einzelner Spaltenvektor, von-,~,-
dem eine 3 × 1-Zeichenmatrix ist.Der Anzeigebefehl geht zuerst die ersten beiden Zeilen des Kuchens an, indem zwei Leerzeichen in die erste Spalte gesetzt werden, gefolgt von Paaren einer Spalte
$,-
oder einer Spalte mit Leerzeichen, fallsn
negativ, was in geändert wirdn=1
, und einer weiteren Spalte mit zwei Leerzeichen, die für a wiederholt wird insgesamtn
mal. In den nächsten drei Zeilen wird der-,$,-
Spaltenvektor einfach einige2*n + 1
Male repliziert , um die Kerzen an der Basis auszurichten und so das Bild zu vervollständigen.Probieren Sie es online!
Sie können dies online mit IDEOnes Octave-Compiler versuchen: http://ideone.com/4qXDdJ - es gibt jedoch einen kleinen Fehler beim Einlesen von Werten aus der Standardeingabe. Aus diesem Grund wird das Skript geringfügig geändert, sodass Sie den Wert
n
am Anfang des Codes ändern müssen. Öffnen Sie eine neue Version des Skripts und ändern Sie diese in einen beliebigen ganzzahligen Wert, um zu sehen, wie die Ausgabe aussieht.quelle
' '.'
!JavaScript,
143153 Bytesfor(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')
Ersetzen Sie "alert" durch "console.log", um die Ausgabe in Mono Space-Schrift zu sehen.
quelle
Mondschrift, 141 Bytes
quelle
rs , 117 bytes
Live-Demo und Testfälle.
quelle
JavaScript ES6, 154 Zeichen
Und noch eine (auch 154)
Verwenden Sie diese Option, um die Ausgabe in Monospace-Schriftarten anzuzeigen (und die Ausgabe in die Konsole zu verschieben)
quelle
Maus ,
164161 BytesMaus ist eindeutig keine ideale Wahl für diese Aufgabe, aber es hat Spaß gemacht.
Ungolfed:
Der Stapel kann nur Ganzzahlen enthalten.
!'
Nimmt eine Ganzzahl vom Stapel und druckt das ASCII-Zeichen mit diesem Code.quelle
CoffeeScript, 160 Bytes
Ungolfed:
Verwenden Sie es wie folgt:
Probieren Sie es online aus: link (Enthält einen benutzerdefinierten Anzeigecode, damit alles so gut aussieht ...)
Hoppla, hätte es fast vergessen! Alles Gute zum Geburtstag, @BetaDecay!
quelle
C 392 Bytes
(bekannter Segmentierungsfehler, wenn keine Argumente angegeben sind)
Uneingeschränkt und reichlich verteilt
quelle
A
. Ich sehe ein paar Leerzeichen mehr, die entfernt werden könnten, und Sie können diese entfernen,i
indem Sie stattdessenc
für die Schleifenvariable verwenden. Zumindest mit gcc, einschließlich stdio.h, oder der Angabe des Rückgabetyps von main () ist es nicht erforderlich: Der Compiler beschwert sich darüber, aber hey, das ist Code Golf. ;)Powershell,
139134132126 Bytesquelle
$input
anstelle von$args[0]
(Frage sagt nicht, Argumente anstelle von stdin zu verwenden), und Sie können+
$n=+$input;
$args[0]
kann und sollte eine tatsächliche int sein, so dass wir zumindest die fallen[int]
.if
und tauschen dieelse
für eine;exit
- 122 Bytes -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'
Ceylon,
322307260 Bytes300282278Das noch nicht golfene Original (unter der Annahme, dass negative Kuchen die Breite 3 anstelle von –2 · n + 1 haben):
Dies enthält die Bedingungsliste in der if-Anweisung, wobei jede Bedingung einen Wert definiert, der in den folgenden Bedingungen und im Hauptteil verwendet werden kann. Da sie das haben
exist
, ist die Bedingung nur erfüllt, wenn die Werte nicht null sind, und der Compiler weiß daher, dass die Werte für den folgenden Code nicht null sind. (Wenn nichts eingegeben wird (EOF), gibt readline null zurück. Wenn parseInteger auf eine Nicht-Ganzzahl trifft, gibt es auch null zurück. Unser Programm führt dann nichts aus. Da das Verhalten für diese Fälle nicht definiert wurde, ist dies wahrscheinlich in Ordnung.)Auch wir haben die
<=>
Betreiber, die auf die Karten -Comparable.compare
Methode, und gibt einComparison
Objekt, dh eine vonequal
,smaller
undlarger
. Der Compiler weiß, dass diese denComparison
Typ erschöpfen , daherelse
wird in unsererswitch
Anweisung keine Klausel benötigt .Die
repeat
Methode der Klasse String macht das, was man erwarten würde. Es wird tatsächlich von der gleichnamigen Methode in Interface Iterable geerbt (da eine Zeichenfolge neben anderen Dingen nur eine Liste von Zeichen ist).Wenn Sie meine Bezeichner durch Ein-Buchstaben-Bezeichner ersetzen und nicht benötigte Leerzeichen entfernen, erhalten Sie 322 Zeichen:
Wenn Sie die Reihe von
print
durch explizites\n
s (und ein einzelnesprint
) ersetzen, ergibt sich 307:Ich habe versucht , Alias-Import von
repeat
wier
, aber es hilft nicht (die Einfuhranmeldung 40 Zeichen hinzufügt, und wir können nur 25 sparen durch Austauschrepeat
mitr
).Was etwas hilft, ist die Verwendung
n.sign
anstelle vonn<=>0
. Während diese beiden Ausdrücke die gleiche Textlänge haben, sie unterschiedliche Typen haben: die letztere vom Typ istComparison
bereits erwähnt (die die drei Werte hatsmaller
,larger
undequal
), hat der ehemalige eine ArtInteger
, mit den Werten-1
,1
,0
... und daInteger
hat viel mehr Werte brauchen wir auch eineelse
Klausel. Dies ist 300 Zeichen lang:Hier mit Leerzeichen:
Wir können etwas mehr sparen, indem wir unsere switch-Anweisung abbrechen und mit
if
282 Zeichen (= Bytes) arbeiten:Formatiert:
Wir können ein weiteres Byte sichern, indem wir die Fälle vertauschen, da
>
kürzer als==
. Ein weiteres "Ärgernis" ist das wiederholterepeat(n)
- wir können eine lokale Funktion (eine Schließung, die sichn
an den definierenden Block erinnert) mit einem kürzeren Namen definieren:Dies ist eine kürzere Schreibweise:
Wir könnten
function
anstelle des Rückgabetyps den Rückgabetyp verwenden, dies ist jedoch nicht kürzer. Das ergibt 278 Bytes:Formatiert:
Die Verwendung der Operatoren
then
undelse
anstelle derif
Anweisungen ermöglicht es uns, einige Aufrufe vonprint
(und einige geschweifte Klammern) zu speichern :Dies sind nur 261 Bytes:
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"));}}
(Ich habe
run
anstelle vonb
für den Funktionsnamen verwendet, da er auf diese Weise ausgeführt werden kann,ceylon run
ohne einen Funktionsnamen zu übergeben.)Mein Github-Repository hat eine kommentierte Version davon .
quelle
Python 2, 158 Bytes
quelle
Golflua, 113 Zeichen
Probelauf:
quelle
Python 2, 150 Bytes
In der Nähe des Pythons des Autors :(
quelle
Perl,
139127117 BytesBenötigt keine Optionen '-n' oder '-p'.
Revision 3 (danke an Dom Hastings unten):
Revision 2:
Revision 1:
Hier ist eine Version von Revision 3, in der die führenden Leerzeilen bei negativen Eingaben nicht vorhanden sind - 132 Byte.
quelle
"Congratulations..."
und wenn Sie ersetzen' $',' |','-','~','-'
mitsplit 0,' $0 |0-0~0-'
Ihnen diese Klammern fallen können. Ein weiterer speichern ersetzt$n=<>;$n==0
mit($n=<>)==0
. Sie?1:
könnten auch so sein,||
wie Sie sagen würden$n==0
(was 1 ist) oder Ihre Berechnung. Ich hoffe, das hilft!||
ist sehr hilfreich , mich an die Semantik zu erinnern - es hat mich$=
anchomp
die Eingabe erinnert, sodass keine spezifischen 0-Wert-Tests erforderlich sind. Ich bin mir nicht sicher, was Sie damit meinen$n=<>;$n==0
- mein Golf hat das nicht, und wenn ich den Fall input = 0 als Eingabe in den behandelemap{}()
, bin ich mir nicht sicher, wie das zutreffen würde? Wie auch immer, unter Berücksichtigung Ihrer Kommentare und$=
als meine Variable wurde dies auf 117 Parbyte herabgesetzt. Vielen Dank!$n=<>;
am Anfang und dann$n==0
am Endemap{}...
hast, also denke ich, dass du den Scheck haben könntest,($n=<>)==0
aber wenn du ihn$=
stattdessen verwendest, könntest du ihn möglicherweise mehr verkleinern! Ich vergesse immer was von$-
oder$=
kann nicht negativ sein, also wollte ich es nicht erwähnen und mich irren! :)Pip, 74 + 1 = 75 Bytes
Nimmt das Alter als Befehlszeilenargument. Benötigt die
-n
Flagge.Github-Repository für Pip
Das Befehlszeilenargument wird in gespeichert
a
. Wir teilen uns"-~-"
in eine Liste von Zeichen auf undY
binden sie in die Variable einy
. Der Rest des Programms ist ein großer ternärer Ausdruck:a?
Wenn
a
ist wahr (dh nicht Null):a<0?yX3
Wenn
a
negativ, kehren Siey
mit jedem Element zurück, das dreimal wiederholt wird:["---";"~~~";"---"]
a
ist positiv):(s.^"$|")Xa
Split
"$|"
in eine Liste von Zeichen, prepend ein Raum (s
) zu jedem, und wiederholen Sie die jeweils resultierende Elementa
malyX2*a+1
Wiederholen Sie jedes Element von
y
2*a+1
ZeitenAL
Fügen Sie die beiden Listen an
a
ist Null) wird die Glückwunschzeichenfolge zurückgegebenAm Ende des Programms
-n
sorgt das Flag dafür, dass Listen mit Elementen in separaten Zeilen gedruckt werden und somit einen ordnungsgemäß geschichteten Kuchen anzeigen.Hier sind die Schritte für eine Eingabe von
2
:Alles Gute zum Geburtstag!
quelle
Perl, 144 Bytes
143 Byte Code plus ein zusätzliches Byte für den
-n
Switch zum Erfassen von stdin.quelle
print"-~-"=~s!.!$&x($_*2+1).$/!ger
für den Kuchen?-p
funktioniert dies auch:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
SpecBAS, 164
Verwendet die Apostrophverknüpfung, um in eine neue Zeile zu wechseln
Zum leichteren Lesen formatiert
quelle
Python 3, 169 Bytes
quelle
Julia, 143 Bytes
Ziemlich einfach. Ungolfed:
quelle
Lua, 299 Bytes
quelle
attempt to compare string with number
), aber das Hinzufügen0+
vor demio.read()
Beheben behebt ihn für mich. Sie können auch nicht wenige Bytes durch die Zuordnung speichernprint
undstring.rep
zu Variablen mit einem Zeichen.Mathematica, 164 Bytes
Verpasste die kerzenlosen Kuchen für n <0 komplett und fügte weitere 15 Zeichen hinzu
quelle
pb , 567 bytes
Ich bereue es.
Es gibt einige Möglichkeiten, wie dies besser sein könnte. Wenn ich zum Beispiel feststelle, dass die Eingabe negativ ist, gehe ich zu der Schlussfolgerung über, um welche negative Zahl es sich handelt. Dies ist unnötig, und vielleicht werde ich eines Tages wieder in diesen Code eintauchen, um ihn zu stoppen.
Versuchen Sie nicht, dies im "Watch" -Modus von pbi auszuführen. Wenn Sie ein Negativ eingeben, stürzt es beim Drucken ab
chr(-1)
.Hier ist die
erläuterte Version,in der ich mir beim Schreiben des Programms Notizen gemacht habe. Wenn Sie besser verstehen möchten, wie es funktioniert ... viel Glück und lassen Sie es mich wissen, wenn Sie es herausfinden.quelle
ScriptCS (C # -Skript), 221 Byte
Das wird natürlich keine Preise gewinnen, aber ...
quelle