Sommaire
Le golf de code est bon. La tarte est bonne . Lorsque vous associez les deux, seules les bonnes choses peuvent arriver.
Caractéristiques
Dans ce défi, vous gérerez une boutique de tarte. L'utilisateur sera en mesure de saisir cinq commandes différentes: list
, count
, buy
, sell
, et exit
. Voici les spécifications de chacun:
list
Imprimez une liste de toutes les tartes possédées et combien. Séparez avec
|
et garnissez avec un espace de chaque côté.|
s doivent être alignés. Le montant du gâteau peut être négatif (cela signifie que vous devez un gâteau à quelqu'un:(
). Par exemple:| apple | 500 | | blueberry | 2 | | cherry | -30 |
count [type]
Imprimez le nombre de
{{type}}
tartes. Imprimer "Il n'y a pas de{{type}}
tarte!" s'il n'y en a pas.{{type}}
correspondra toujours à l'expression régulière\w+
(c'est-à-dire qu'il s'agira toujours d'un seul mot). Par exemple, si j'avais le nombre de tartes indiqué dans la liste d'exemples ci-dessus, alors> count apple 500 > count peach There is no peach pie!
buy [n] [type]
Ajoutez
{{n}}
au nombre de{{type}}
tartes et imprimez-le. Créez une{{type}}
tarte si elle n'existe pas.{{n}}
correspondra toujours à l'expression rationnelle[0-9]+
(c.-à-d., ce sera toujours un nombre). Voici un autre exemple (avec le même inventaire à tarte que les exemples précédents):> count blueberry 2 > buy 8 blueberry 10
sell [n] [type]
Soustrayez
{{n}}
le nombre de{{type}}
tartes et imprimez-le. Créez une{{type}}
tarte si elle n'existe pas. La tarte peut être négative (oh non, cela voudrait dire que vous devez une tarte à quelqu'un!).> sell 15 blueberry -5 > buy 5 blueberry 0
exit
Imprimer "Le magasin de tarte a fermé!" et quittez le programme.
> exit The pie store has closed!
Précisions supplémentaires
- Si une fonction inexistante est appelée (le premier mot), imprimez «Ce n'est pas une commande valide».
- Si une fonction existante est appelée avec des arguments invalides (les mots après le premier mot), le comportement de votre programme n'a pas d'importance. "Arguments invalides" comprend trop d'arguments, trop peu d'arguments,
{{n}}
n'étant pas un nombre, etc. - La tarte est bonne.
- Votre entrée doit être distinguée de votre sortie. Si vous exécutez le programme sur la ligne de commande / terminal / shell / autre élément textuel, vous devez préfixer l'entrée avec "
> "
(un signe" supérieur à "et un espace) ou un autre élément de préfixe d'entrée de shell. - La tarte est bonne.
Si toutes ces clarifications ne sont pas suffisantes, voici quelques exemples de sortie:
> 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!
Si vous achetez / vendez une tarte et que le nombre net devient
0
, vous pouvez le conserver dans lelist
ou non, et vous pouvez soit le retourner,0
soitThere is no {{type}} pie!
quand vouscount
le souhaitez .- C'est du code-golf ; le code le plus court gagne.
- Ai-je mentionné que la tarte est bonne?
buy 1 apple
etsell 1 apple
. Et serait-il alors valable pourcount apple
revenir à la0
place deThere is no apple pie!
?Réponses:
Rubis,
335330Quelques astuces ici:
L'idée de Doorknob d'utiliser un formateur est prise un peu plus loin ici, littéralement. Tout d'abord, la chaîne la plus longue du hachage parmi toutes les clés et valeurs est formatée en utilisant
" %%%ds |"
pour produire une chaîne comme" %6s |"
. Oui, pas d'emballage sous film rétractable séparément. Il n'y a jamais eu l'obligation de le faire. Taille unique. Cette chaîne est ensuite dupliquée et utilisée comme chaîne de formatage pour le tableau à deux éléments contenant la ligne actuelle. Enfin, le+
début du mot obtient son mot et ajoute un seul tuyau de tête. Oh, etputs
a une belle gestion des tableaux.Ruby a une interpolation dans les littéraux d'expression régulière. C'est une sauvegarde serrée, mais ça économise un peu.
Ruby requiert des points-virgules après l'
when
expression, mais pas avant le mot-clé. Cela conduit à un artefact de rendu étrange lorsque le point-virgule est remplacé par une nouvelle ligne.Et, bien sûr, le perlisme connu sous le nom de globaux magiques et l'appariement automatique des littéraux d'expression régulière contre eux.
De plus, la plupart des instructions, y compris des
case
expressions.la source
Hash.new(0)
au lieu de{}
?nil
(qui ne autoriser l'ajout). Le littéral utilisenil
comme valeur par défaut.h=Hash.new(0)
=>h=Hash.new 0
,print"> "
=>$><<'> '
, et je pense que cela[*h]
peut être justeh
. J'ai essayé de créer une version sans l'instruction switch car tout ce texte passe-partout s'additionne vraiment: gist.github.com/chron/6315218 . J'essayais de faire fonctionner quelque chose,ruby -ap
mais l'exigence de l'invite rend la$><<
imprimer une nouvelle ligne. Quant à la dernière suggestion ... malheureusement, les hachages n'ont pas de méthode "aplatir".Ruby,
427384 caractèresMerci à Jan Dvorak d'une énorme amélioration de 427 à 384 (!)
la source
loop{...}
place dewhile 1do...end
.split
sans son argument. Par défaut, il se divise par des espaces (ou$;
si cela est défini)p.keys.group_by(&:size).max[0]
- cherchez-vousp.keys.map(&:size).max
oup.map{|x,_|x.size}.max
? Ici:[(t=p.values).max.to_s.size,t.min.to_s.size].max
cherchez-vousp.map{|_,x|x.to_s.size}.max
? Je vais prendre votre idée et abuser du formateur, cependant :-)p[t]=p[t]+m
est équivalent àp[t]+=m
(saufp[t]
est évalué deux fois au lieu d'une fois) et plus long. Utilisez ce dernier.+=
opérateur; c'est pourquoi je ne l'ai pas utilisé. Peut-être que c'est juste pour++
. Je modifierai mon article sous peuPythonPie -thon 437Je suis sûr qu'il y a un peu de jeu sur l'avant-dernière ligne, mais l'exigence d'aligner les barres pour le type et le nombre de tarte est un doozy.
Selon le commentaire d'Igby Largeman, les règles ne sont pas claires sur ce qu'il faut faire s'il y avait une tarte d'un type spécifique, mais il y en a
0
maintenant. Je l'ai donc interprété en ma faveur.Exemple de sortie:
la source
> count potato
produitThat's not a valid command.
au lieu deThere is no potato pie!
pie.py
:: PC # -
571 568559Amener l'arrière comme d'habitude avec le C # désespérément verbeux.
J'ai pris une certaine liberté avec la règle sur la sortie de liste. Pour enregistrer certains caractères, j'ai codé en dur la largeur de la colonne de comptage à la largeur maximale d'une valeur entière. (Les règles ne disaient pas que les espaces supplémentaires n'étaient pas autorisés.)
Formaté:
la source
Python 3, 310
la source
Java -
772751739713666619Je sais que ce n'est pas gagner le concours, mais juste pour le plaisir!
Avec les sauts de ligne et les tabulations:
la source
if/else
être moins cher, mais en raison du fait que je devais le faires[0]=s[0].intern()
pour pouvoir comparer==
, cela finit toujours par être plus . Je sais, très contre-intuitif.