Vous et un ami entrez dans un bar. Le barman vous traite bien, vous décidez donc de lui donner un pourboire. Donc, vous sortez votre fidèle ordinateur de poche et écrivez un programme rapide pour calculer un pourboire car il n'a pas de calculatrice intégrée. Mais attendez! Vos clés d'opérateur sont cassées! Votre tâche consiste à calculer un pourboire de 20% pour tout montant d'entrée donné. Les entrées de test seront sous la forme de xx.xx, par exemple 20,96. Voici les règles:
- Aucune utilisation des opérateurs de forme mathématique suivants:
+ - * / %
(Merci Wally West) - Aucune utilisation des fonctions de pourcentage ou des API intégrées
- Pas d'accès au réseau
- Pas d'utilisation
eval
ou similaire - Pas de calculatrice Windows (oui, les gens y ont déjà répondu)
- Pas de fonctions de pointe intégrées (pas que n'importe quelle langue en aurait une)
La sortie doit être arrondie à deux décimales près.
Le score est basé sur la longueur en octets.
-20% si votre programme peut accepter n'importe quel montant de pourboire. L'entrée pour le montant sera donnée sous la forme de xx par exemple 35 pas 0,35
*
?Réponses:
Javascript 81
EDIT : Le résultat est maintenant un véritable arrondi, non tronqué.
N'utilisez AUCUN math ici, juste une manipulation de chaîne et des opérateurs au niveau du bit.
Tous les
+
caractères sont une concaténation de chaînes ou une conversion de chaîne en flottant .Fonctionne pour toutes les entrées et sorties xx.xx au format (x) x.xx
Astuce expliquée: 20% est divisé par 10 et multiplié par 2.
la source
99.99
, cela revient19.998
, donc ce n'est pas "arrondi à deux décimales" selon l'OP.J (9 caractères)
Une réponse courte en J:
la source
^
mais~
indique ici que l'ordre doit être inversé;(^.2)
est log (.2), et l'initiale^.
qui est exécutée en dernier est le logarithme de tout le calcul précédent: donc log (32 ^ log (.2))Pure bash,
5043 caractèresJe suis sûr que ce sera battu, mais voici un début:
Selon les commentaires:
/
n'est pas un opérateur de division ici, il fait partie d'une expansion des paramètres de substitution de motifs%
n'est pas un opérateur modulo ici, il fait partie d'une expansion de paramètres-
n'est pas un opérateur de soustraction ici, c'est une négation, qui a été autorisée selon les commentairesProduction:
la source
/
fait partie d'une expansion de paramètre bash et non un opérateur de division. Autorisé ou non?Python 98 * 0,8 = 78,4
Python 74 (sans bonus)
Remarque
+
est utilisé pour la concaténation de chaînes*
utilisé pour créer des copies de chaîneNon golfé
Remarque
Dans l'esprit de la question, je crois que la solution suivante, bien qu'elle respecte toutes les règles de la question, est un abus
Python 41
finalement
Si vous insistez pour que les symboles mathématiques soient interdits, c'est une solution à 90 caractères
Python 90 (sans symbole mathématique)
la source
*
et+
sont brisés KEYS (tout ce que vous les utilisez pour).No use of the following in mathematical form operators: + - * / % (Thanks Wally West)
. En d'autres termes, la question doit être reformulée. Et je ne les ai pas utilisés sous forme mathématique0.05
.`input`
(backticks inclus) au lieu deraw_input
.APL (9 caractères, nouveau code à 7 caractères, fixé à 13 caractères)
Calculez 20% du montant donné.
Dans APL
*
est l'opérateur exponentiel.Essayez-le en ligne .
Mais pourquoi utiliser une fonction pour ça? Voir cette nouvelle version:
Essayez-le en ligne .
S'il vous plaît, avant de voter, le
*
n'est pas interdit en tant que CLÉ et cela ne signifie pas la multiplication ici.OK, voici la version arrondie à 2 décimales (Dyalog APL):
la source
*
est interdite sous toute forme mathématique selon les règles du défi.*
est interdit comme clé et non comme sa signification mathématique.^
) pour un tel opérateur, ou un appel de fonction est utilisé. Il n'y a aucune spécification par l'OP qui*
n'est interdite que si elle est utilisée dans le contexte de la multiplication. Je soupçonne qu'il serait utile que OP se prononce sur cette question, pour déterminer lequel d'entre nous interprète mal les règles du défi et pour dissiper la confusion.×
- être et÷
sont autorisés, ceux-ci ne sont pas répertoriés.R,
30273634Mis à jour pour arrondir à 2 décimales
Sauvé 2 personnages grâce à plannapus
Crée un vecteur de 0 à x et prend le 2ème élément.
Exemple:
Plus d'explications:
crée un vecteur de longueur 6 de 0 à la valeur d'entrée x, les valeurs intermédiaires étant également espacées.
La première valeur est alors 0%, la seconde 20%, la troisième 40%, etc.
la source
dc + sed + pipes (44 caractères)
Ma troisième réponse (un APL, un J, et maintenant un avec l'ancien et vénérable dc).
Il demandera une entrée INTEGER et calculera 20% d'une manière délicate. L'entrée est convertie en base 5 (facile à faire avec de nombreux autres outils mais attendez ...); un point est ajouté avant le dernier chiffre avec sed (malheureusement, dc ne peut pas très bien gérer les chaînes), et ALORS, dc se reconvertit à partir de la base 5 sur un nombre flottant (tous les outils ne peuvent pas le faire).
la source
dc -e 5o?p|sed 's/\(.\)\./.\1/'|dc -e 5i?p
. Avec cela et en supprimantsed
s-e
s, c'est 42. Mais le résultat n'est toujours pas conforme (pas 2 décimales)Python, 88
Ce n'est pas loin d'être court, mais cela montre comment une division mentale normale par cinq devrait être effectuée. Cela suppose que l'entrée doit être de la forme xx.xx
Ou pour une entrée de n'importe quelle longueur, un ajout de 3 caractères est requis.
Explication: Nous prenons l'entrée sous forme de chaîne, puis déplaçons la virgule décimale d'une place vers l'avant (en divisant par 10). Nous le jetons ensuite sur un flotteur et utilisons le
ldexp
fonction pour le multiplier par 2.Notez que dans cette réponse, les
+
opérateurs de concaténation sont des chaînes et%
sont utilisés pour formaterprint
.Si vous insistez pour ne pas utiliser l'un de ces caractères, voici une solution à 159 caractères:
la source
+
et-
sont autorisées car les clés sont cassées (quoi qu'elles signifient dans votre morceau de code)..split('.')
dans ma réponse, haché un caractèredc + sed - 45 * 0,8 = 36
(Inspiré par la réponse de ברוכאל )
Exemple s'exécute (l'entrée est acceptée via STDIN):
la source
.0+
idée est géniale; J'ai voté pour votre solution inspirée de la mienne, mais certains diront que vous utilisez l'addition; peut-être une solution? J'ai essayédc -e 9k5o?v2^p
mais c'est 2 caractères de plus.-20%
!Mathematica, 19
Aucune utilisation des opérateurs mathématiques
+
,-
,*
,/
ou%
. Utilise les propriétés des logarithmes pour calculer la réponse; lorsque vous simplifiez l'expression, vous obtenez.2*Input[]
Avec le bonus ( 30 * 0,8 = 24 ):
Saisissez d'abord le pourcentage, puis le montant.
Lorsque vous simplifiez l'expression, vous obtenez
Input[]*Input[]*.01
.Merci à ברוכאל pour son aide à raccourcir le code.
la source
Log[E^2]
ouLog[E^Input[]]
peut être écrit plus rapidement. Même10^-1
peut être écrit.01
(bien que je n'utilise pas Mathematica mais je suis sûr que c'est possible). L'expression entière(E^10^-1)^Log[E^2]
semble être quelque chose comme çaE^.2
, n'est-ce pas?TI-89 Basic - 39 * 0,8 = 31,2
Fonctionne en saisissant les deux nombres, puis en utilisant les propriétés du logarithme pour calculer
x * y / 100
.Si je peux supposer l'entrée du placement dans des variables globales
x
ety
, alors c'est beaucoup plus court, pour un score de 17 * 0,8 = 13,6 :Sans bonus ( 12 ):
Mais si elle doit être enveloppée dans une fonction, alors cela fonctionne ( 38 caractères, pour 30.4 ):
la source
Input x,y
??? Fonctionne en 83/84.Input{x,y}
(83/84 en aln
?)žr¹msmžr.n
- port sans vergogne de ce code dans 05AB1E.PHP 107 * .8 = 85,6
ne peut pas vraiment fonctionner pour le code-golf avec PHP, mais au moins je peux opérer sur des chaînes. accepte les deux nombres comme arguments de ligne de commande.
a dû l'inverser deux fois car je ne peux pas utiliser -2 :(
la source
Python,
81 8089 caractèresExplication
Techniquement, cela triche car il tronque à deux décimales plutôt que de l'arrondir, mais je peux affirmer qu'il arrondit (mieux pour vous, moins de pourboire).
la source
[-3:]
place de[-3:-1]
JavaScript 251 (restriction forcée: pas de +, -, *,? Ou% de quelque manière que ce soit)
Bien que je sache que cela ne gagnera pas, je me suis dit que j'essaierais d'obtenir des points de brownie en adoptant une approche très stricte et sans même penser à utiliser les opérateurs restreints sous quelque forme que ce soit ... en conséquence, j'ai trouvé cette beauté ...
J'ai utilisé des opérations au niveau du bit pour créer la fonction Ajouter
A
, puis j'ai commencé à chaîner à partir de là:La fonction de division entière a
D
utilisé une série d'addition négative (soustraction sous forme deA(x,A(~y,1)
sur une boucle; le reste est une manipulation de chaîne et une concaténation afin d'éviter d'utiliser des+
opérateurs de concaténation ...Le numéro doit être fourni sous forme décimale avec deux décimales pour que cela fonctionne ...
la source
Perl,
5060 octetsL'entrée est attendue à STDIN. Il doit contenir le séparateur décimal avec deux chiffres décimaux. La sortie est écrite dans STDOUT.
Mise à jour: l'étape
$_<<=1
supprime les zéros non significatifs. Par conséquentm|\d{3}$|
, ne correspondrait pas aux factures <1. Par conséquent, dix octets$_="00$
ont été ajoutés, maintenant même0.00
fonctionne .Exemples:
20.96
sortie:4.19
12.34
sortie:2.47
Version non golfée:
Tout d'abord, le nombre est lu à partir de STDIN. Ensuite, le point décimal est supprimé, multiplié par 100. Ensuite, le montant est doublé par un opérateur de décalage. Ensuite, le point décimal est réinséré et le résultat est imprimé et arrondi à deux chiffres décimaux.
50 octets, si facture ≥ 1:
Si
x.xx
est supérieur ou égal à1.00
, 10 octets peuvent être supprimés:la source
JavaScript (ES6) (Regex) 142
Regex est génial et il peut faire beaucoup de choses. Il peut même faire des maths!
Version lisible:
La
tip()
fonction attend l'argument String, plutôt que Number.Toutes les instances de
*
,/
,+
ne sont pas liés à des opérations mathématiques.+
est la concaténation de chaînes dans tous les cas où elle est utilisée.*
fait partie de la syntaxe RegExp/
est le délimiteur du littéral RegExpL'entrée doit utiliser
.
comme point décimal, et il doit y avoir avoir 2 chiffres après le point décimal.Extrait de pile
la source
Haskell 32 caractères -20% = 25,6 caractères
Abuse le fait que les exposants deviennent multiplication dans les logarithmes.
la source