Zusammenfassung
Codegolf ist gut. Torte ist gut . Wenn Sie die beiden zusammenfügen, kann nur gutes Zeug passieren.
Spezifikationen
In dieser Herausforderung leiten Sie einen Tortenladen. Der Benutzer wird zur Eingabe von fünf verschiedenen Befehlen können: list
, count
, buy
, sell
, und exit
. Hier sind die Spezifikationen für jeden:
list
Drucken Sie eine Liste aller Kuchen im Besitz und wie viele. Trennen Sie sie mit
|
und füllen Sie sie mit einem Leerzeichen auf beiden Seiten auf.|
s muss ausgerichtet sein. Der Kuchenbetrag kann negativ sein (das bedeutet, dass Sie jemandem etwas schulden:(
). Beispielsweise:| apple | 500 | | blueberry | 2 | | cherry | -30 |
count [type]
Drucken Sie aus, wie viele
{{type}}
Kuchen es gibt. "Es gibt keine{{type}}
Torte!" wenn es keine gibt.{{type}}
wird immer mit dem regulären Ausdruck übereinstimmen\w+
(dh es wird immer ein einzelnes Wort sein). Wenn ich zum Beispiel die Anzahl der Torten in der obigen Beispielliste hätte, dann> count apple 500 > count peach There is no peach pie!
buy [n] [type]
Addieren Sie
{{n}}
zur Zählung des{{type}}
Kuchens und drucken Sie ihn aus. Erstellen Sie einen{{type}}
Kuchen, falls er nicht existiert.{{n}}
wird immer mit dem regulären Ausdruck übereinstimmen[0-9]+
(dh es wird immer eine Zahl sein). Hier ist ein weiteres Beispiel (mit demselben Kucheninventar wie in den vorherigen Beispielen):> count blueberry 2 > buy 8 blueberry 10
sell [n] [type]
Subtrahieren Sie
{{n}}
von der Anzahl der{{type}}
Kuchen und drucken Sie es. Erstellen Sie einen{{type}}
Kuchen, falls er nicht existiert. Torte kann negativ sein (oh nein, das würde bedeuten, dass Sie jemandem Torte schulden!).> sell 15 blueberry -5 > buy 5 blueberry 0
exit
Print "Der Tortenladen ist geschlossen!" und beenden Sie das Programm.
> exit The pie store has closed!
Weitere Erläuterungen
- Wenn eine nicht vorhandene Funktion aufgerufen wird (das erste Wort), drucken Sie "Das ist kein gültiger Befehl."
- Wenn eine vorhandene Funktion mit ungültigen Argumenten (die Wörter nach dem ersten Wort) aufgerufen wird, spielt es keine Rolle, wie sich Ihr Programm verhält. "Ungültige Argumente" enthalten zu viele Argumente, zu wenig Argumente,
{{n}}
keine Zahl usw. - Torte ist gut.
- Ihre Eingabe muss von Ihrer Ausgabe unterschieden werden. Wenn Sie das Programm auf der Befehlszeile / terminal / shell / other text-based thing ausführen, müssen Sie der Eingabe ein "
> "
(ein" Größer als "-Zeichen und ein Leerzeichen) oder ein anderes Shell-Eingabepräfix voranstellen. - Torte ist gut.
Wenn all diese Erläuterungen nicht gut genug sind, sehen Sie hier einige Beispiele:
> list > buy 10 apple 10 > sell 10 blueberry -10 > list | apple | 10 | | blueberry | -10 | > count apple 10 > count peach There is no peach pie! > exit The pie store has closed!
Wenn Sie Kuchen kaufen / verkaufen und der Nettozählwert wird
0
, können Sie ihn entweder im behaltenlist
oder nicht, und Sie können entweder zurückkehren0
oderThere is no {{type}} pie!
wann Siecount
ihn haben.- Das ist Code-Golf ; kürzester Code gewinnt.
- Habe ich schon erwähnt, dass Kuchen gut ist?
buy 1 apple
undsell 1 apple
. Und wäre es dann gültigcount apple
,0
statt zurückzukehrenThere is no apple pie!
?Antworten:
Rubin,
335330Einige Tricks hier:
Die Idee von Doorknob, einen Formatierer zu verwenden, wird hier buchstäblich einen Schritt weiter geführt. Zunächst wird die längste Zeichenfolge im Hash unter allen Schlüsseln und Werten formatiert
" %%%ds |"
, um eine Zeichenfolge wie zu erzeugen" %6s |"
. Ja, keine Schrumpffolie für jede Spalte einzeln. Es gab nie das Erfordernis dazu. Eine Grösse passt allen. Diese Zeichenfolge wird dann dupliziert und als Formatierungszeichenfolge für das Array mit zwei Elementen verwendet, das die aktuelle Zeile enthält. Schließlich+
bekommt der Nahe am Start sein Wort und stellt eine einzelne führende Pfeife voran. Oh, undputs
hat eine gute Handhabung von Arrays.Ruby hat Interpolation in Regex-Literalen. Es ist eine knappe Rettung, aber es spart ein wenig.
Ruby benötigt Semikolons nach dem
when
Ausdruck, jedoch nicht vor dem Schlüsselwort. Dies führt zu einem seltsamen Rendering-Artefakt, wenn das Semikolon durch eine neue Zeile ersetzt wird.Und natürlich Perlismus, bekannt als magische Globale und automatische Zuordnung von Regex-Literalen zu diesen.
Auch sind die meisten Aussagen einschließlich
case
Ausdrücke.quelle
Hash.new(0)
statt{}
?nil
(was nicht Addition zulassen) .Das Literal wirdnil
als Standardwert verwendet.h=Hash.new(0)
=>h=Hash.new 0
,print"> "
=> speichern$><<'> '
, und ich denke das[*h]
kann einfach seinh
. Ich habe versucht, eine Version ohne switch-Anweisung zusammenzustellen, da sich der gesamte Text auf dem Kessel wirklich summiert: gist.github.com/chron/6315218 . Ich habe versucht, etwas zumruby -ap
$><<
, eine neue Zeile zu drucken. Was den letzten Vorschlag angeht ... Hashes haben leider keine "Flatten" -Methode.Ruby,
427384 ZeichenVielen Dank an Jan Dvorak für die enorme Verbesserung von 427 auf 384 (!)
quelle
loop{...}
anstelle von verwendenwhile 1do...end
.split
ohne Argument verwenden. Standardmäßig wird nach Leerzeichen geteilt (oder$;
wenn dies festgelegt ist)p.keys.group_by(&:size).max[0]
- suchst dup.keys.map(&:size).max
oderp.map{|x,_|x.size}.max
? Hier:[(t=p.values).max.to_s.size,t.min.to_s.size].max
suchen Siep.map{|_,x|x.to_s.size}.max
? Ich werde Ihre Idee aufgreifen und den Formatierer missbrauchen :-)p[t]=p[t]+m
ist gleichbedeutend mitp[t]+=m
(außerp[t]
wird zweimal statt einmal ausgewertet) und länger. Verwenden Sie letzteres.+=
Operator; deshalb habe ich es nicht benutzt. Vielleicht ist das nur für++
. Ich werde meinen Beitrag in Kürze bearbeitenPythonPie- thon 437Ich bin mir sicher, dass die vorletzte Zeile etwas locker ist, aber die Anforderung, die Balken sowohl für den Tortentyp als auch für die Anzahl auszurichten, ist ein Trottel.
Wie pro Igby Largeman Kommentar sind die Regeln unklar um was , wenn es zu tun war eine Torte von einem bestimmten Typ, aber es gibt
0
jetzt. Also habe ich es zu meinen Gunsten ausgelegt.Beispielausgabe:
quelle
> count potato
produziert manThat's not a valid command.
stattThere is no potato pie!
pie.py
C # -
571 568559Wie gewohnt mit hoffnungslos wortreichem C # nach hinten rücken.
Ich habe mir die Regel zur Listenausgabe ein wenig erlaubt. Um einige Zeichen zu speichern, habe ich die Breite der Zählspalte auf die maximale Breite eines ganzzahligen Wertes fest programmiert. (Die Regeln besagten nicht, dass zusätzliche Leerzeichen nicht zulässig sind.)
Formatiert:
quelle
Python 3, 310
quelle
Java -
772751739713666619Ich weiß, es ist nicht der Gewinn des Wettbewerbs, sondern nur zum Spaß!
Mit Zeilenumbrüchen und Tabulatoren:
quelle
if/else
billiger zu werden, aber aufgrund der Tatsache, dass ich etwas tun musste,s[0]=s[0].intern()
um mich damit zu vergleichen==
, ist es immer mehr . Ich weiß, sehr eingängig.