... ou y en a-t-il?
Votre défi consiste à analyser ma facture de déjeuner, qui contient le prix de base, les pourboires, les remises, les coupons et les extras et à savoir si mon déjeuner était de 0 $ ou moins . S'il s'agit de l'entrée:
12.34
15 tip
25 discount
1.5 extra
2 coupon
Ensuite, la sortie pourrait être false
. Voici comment ça fonctionne:
12.34
est le prix de base.
15 tip
signifie ajouter 15% au total.
25 discount
signifie soustraire 25% du total.
1.5 extra
signifie ajouter 1,5 au total.
2 coupon
signifie soustraire 2 du total.
Il peut y avoir n'importe quel nombre de pourboires, de remises, de coupons et d'extras, mais il y aura toujours un prix de base.
Ensuite, nous faisons (12.34 * 1.15) * 0.75 + 1.5 - 2
pour une sortie de 10,14. 10.14 est supérieur à 0, donc nous sortons false. Mon déjeuner n'était pas gratuit.
Règles
nombre tip
moyen d'ajouter le numéro pour cent au total.
nombre discount
signifie soustraire le nombre pour cent du total
nombre extra
signifie ajouter un nombre au total
nombre coupon
signifie soustraire le nombre du total
Un autre exemple:
10
20 tip
20 discount
2 coupon
2 coupon
1 coupon
50 discount
2.55 coupon
Le prix est -0.24
((10 * 1,20 * 0,80 - 2 - 2 - 1) * 0,5 - 2,55), donc la sortie est vraie (mon déjeuner était gratuit.)
Remarques:
- La précision doit être d'au moins 2 décimales.
- Vous pouvez prendre l'entrée comme une chaîne avec des sauts de ligne (retour à la ligne en option) ou un autre caractère de séparation, ou un tableau / liste des entrées.
15 tip
tant que0.15 tip
Réponses:
05AB1E ,
373334 octetsEssayez-le en ligne!
Explication
Emprunte l'
mod 7
astuce de la réponse Jelly de Jonathan Allanla source
1
lorsque la valeur est <1.JavaScript (ES6),
8885 octetsPrend l'entrée comme un tableau de chaînes. Retours
0
non gratuits ou1
gratuits.Comment ça fonctionne
Chaque ligne est divisée sur l'espace pour obtenir
a
= montant,b
= type d'opération. S'il n'y a aucune opération (ce qui est le cas sur la première ligne),b
est défini par défaut sur"e"
"extra".Pour ajouter le montant correct au total
t
, nous utilisons un objet dont les clés sont la première lettre de l'opération:Remarque : Si la facture ne comprenait qu'un seul élément,
map()
elle renverrait un tableau à un seul élément qui serait contraint à un entier lors de l'application par l'|
opérateur, ce qui ferait échouer le test final. Mais l'OP a confirmé que cela ne pouvait pas arriver. (Les tableaux de 2 éléments ou plus sont contraints à 0.)Démo
Afficher l'extrait de code
la source
CJam ,
4542 octetsPrenez l'entrée comme un tableau de chaînes, et prenez la pointe et l'escompte en décimales.
Essayez-le en ligne!
Explication
Le code qui est évalué en fonction des premières lettres:
la source
Gelée ,
4239 octetsPrend une liste de chaînes avec des nombres au format décimal
(zéros de tête vont travailler, mais ont l'effet secondaire de zéros à l' impression STDOUT avant le résultat final).
Essayez-le en ligne! - pas libre; ou gratuit .
Comment?
la source
GNU sed + dc,
117111107 octetsUtilisation du
-z
drapeau d'interprète (inclus dans le score sous la forme d'un octet):Explication
Étant donné que l'entrée est déjà très proche de la notation polonaise inversée, il est simple de transformer
extra
etcoupon
de+
et-
, et pas beaucoup plus de changer les pourcentages en multiplicateurs. Ensuite, invoquezdc
et produisez un résultat lisible selon qu'il-
est trouvé (nous devons annuler le résultat, donc a-
implique "non libre", sinon 0 serait un cas spécial qui aurait besoin de sa propre gestion).Exemple
Le deuxième cas de la question est:
Cela devient ce
dc
programme:Résultant en:
la source
JavaScript,
173169145 145 octetsIl devrait y avoir encore beaucoup de golf à faire
Essayez-le en ligne! (145 octets actuellement)
Essaye le:
Merci à programmer5000 pour tous ses conseils de golf
la source
{w=i.split`<nl>`
où <nl> est une nouvelle ligne littéralef=
pièce, elle est autorisée par les règles et vous pouvez la remplacer$.split(' ')
par$.split` `
.JavaScript (ES6), 97
107Entrée sous forme de chaîne multiligne avec un retour à la ligne de fin.
L'expression régulière fractionne la partie texte numérique et facultative pour chaque ligne en d et b .
Les calculs devraient être plus ou moins évidents. Juste une note:
- utiliser
-=
pour éviter les problèmes de mélange de nombre avec des chaînes- la somme est annulée pour économiser 1 octet, donc la dernière vérification est pour
>= 0
au lieu de<= 0
PS est encore bien plus long que celui d'Arnauld. Les rats.
Tester
la source
C #
324219 octetsCe n'est pas joli, et ce n'est probablement pas le meilleur moyen, mais le voici. Requiert que l'entrée soit passée sous forme de tableau de chaînes et que les pourboires / remises soient transmis sous forme de flottants (
0.15 tip
au lieu de15 tip
) car cela a été clarifié comme étant acceptable dans les commentaires de la spécification.Explication:
Il doit y avoir une meilleure façon de le faire, mais cela fonctionne au moins
la source
100
dans lat
branche.float.Parse(s.Split(' ')[0])
quelque chose pour réduire la duplication. Cela économisera environ 80 caractères.PowerShell ,
218156143 octetsEssayez-le en ligne!
EDIT Octets enregistrés en divisant la variable redirigée au préalable
EDIT 2 Stocké la deuxième partie de la chaîne afin que je puisse faire de meilleurs appels génériques
la source
Python 133 octets
Similaire à la version JavaScript ES6. Mais la conversion de type est requise pour les
float
valeurs en Python.Explication:
Extrayez la première valeur et convertissez-la en float.
Pour chaque autre ligne de la facture:
float
dict
pour sélectionner la bonne opération en fonction de la première lettreUsage:
la source
Java 227 octets
Cela fait un moment et toujours pas de réponse Java que je peux voir, alors voici ma réponse C # portée sur Java, au coût de 8 octets
Pour une explication et autres, voir ma réponse C #
Comme cette réponse, cette réponse s'attend à ce que le pourboire et la remise soient transmis sous forme de flotteurs (
0.15
non15
)la source
var
type générique par C # et les lambdas (je sais que Java en a, mais les C # sont plus golfeurs)Jq 1.5 ,
129119114112 octetsÉtendu
Essayez-le en ligne!
la source