Implémentez une calculatrice scriptable d'opération d'entier simple.
Concept
L'accumulateur démarre à 0 et des opérations y sont effectuées. A la fin du programme, sortir la valeur de l'accumulateur.
Opérations:
+
ajoute1
à l'accumulateur-
soustrait1
de l'accumulateur*
multiplie l'accumulateur par2
/
divise l'accumulateur par2
Exemple de script
L'entrée ++**--/
doit donner la sortie 3
.
Exemple d'implémentation
def calc(s)
i = 0
s.chars.each do |o|
case o
when '+'
i += 1
when '-'
i -= 1
when '*'
i *= 2
when '/'
i /= 2
end
end
return i
end
Règles
- Il s'agit de code-golf , donc la réponse la plus basse en octets l'emporte, mais elle n'est pas sélectionnée.
- Les implémentations créatives sont encouragées.
- Les failles standard sont interdites.
- Vous obtenez le programme via stdin ou des arguments, et vous pouvez sortir la réponse via la valeur de retour ou stdout.
- S'amuser.
- La division est tronquée car il s'agit d'une division entière.
- Le programme
-/
revient-1
.
Cas de test
*///*-*+-+
-1
/*+/*+++/*///*/+-+//*+-+-/----*-*-+++*+**+/*--///+*-/+//*//-+++--++/-**--/+--/*-/+*//*+-*-*/*+*+/+*-
-17
+++-+--/-*/---++/-+*-//+/++-*--+*+/*/*/++--++-+//++--*/***-*+++--+-*//-*/+*/+-*++**+--*/*//-*--**-/-*+**-/*-**/*+*-*/--+/+/+//-+*/---///+**////-*//+-+-/+--/**///*+//+++/+*++**++//**+**+-*/+/*/*++-/+**+--+*++++/-*-/*+--/++*/-++/-**++++/-/+/--*/-/+---**//*///-//*+-*----+//--/-/+*/-+++-+*-*+*+-/-//*-//+/*-+//+/+/*-/-/+//+**/-****/-**-//+/+-+/*-+*++*/-/++*/-//*--+*--/-+-+/+/**/-***+/-/++-++*+*-+*+*-+-//+/-++*+/*//*-+/+*/-+/-/*/-/-+*+**/*//*+/+---+*+++*+/+-**/-+-/+*---/-*+/-++*//*/-+-*+--**/-////*/--/*--//-**/*++*+/*+/-+/--**/*-+*+/+-*+*+--*///+-++/+//+*/-+/**--//*/+++/*+*////+-*-//--*+/*/-+**/*//+*+-//+--+*-+/-**-*/+//*+---*+//*/+**/*--/--+/*-*+*++--*+//+*+-++--+-*-*-+--**+/+*-/+*+-/---+-*+-+-/++/+*///*/*-+-*//-+-++/++/*/-++/**--+-////-//+/*//+**/*+-+/+/+///*+*///*-/+/*/-//-*-**//-/-+--+/-*--+-++**++//*--/*++--*-/-///-+/+//--+*//-**-/*-*/+*/-*-*//--++*//-*/++//+/-++-+-*/*-+++**-/-*++++**+-+++-+-***-+//+-/**-+/*+****-*+++*/-*-/***/-/*+/*****++*+/-/-**-+-*-*-++**/*+-/*-+*++-/+/-++*-/*-****-*
18773342
code-golf
math
number
arithmetic
dkudriavtsev
la source
la source
/
peut donner des non-entiers.-/
revenir?Réponses:
Python 2, 48 octets
Est-ce que
+2
,-2
,*2
ou/2
. En faisant+2
et-2
plutôt que+1
et-1
, nous travaillons dans des unités doublées, donc la sortie finale doit être divisée par deux. Sauf que la division du sol/
doit maintenant être arrondie à un multiple de 2, ce qui est fait avec&-2
.la source
0q{2\~-2&}/2/
(2\~
évoque l'opérateur avec le deuxième opérande2
,-2&
est le bit au niveau ET,2/
est la division finale par deux.q{...}/
Est un foreach sur l'entrée et0
n'est que l'initial .)Haskell, 51 octets
Exemple d'utilisation:
foldl(#)0 $ "++**--/"
->3
.la source
Gelée ,
1817 octetsEssayez-le en ligne!
Comment ça marche
Les six premières lignes définissent des liens auxiliaires avec des indices allant de 1 à 6 ; ils incrémentent, ne font rien, décrémentent, ne font rien, divisent par deux (revêtement de sol) et doublent.
Le lien principal -
O0;ṛĿ/
- convertit les caractères d'entrée en leurs points de code (O
), ajoute un 0 (valeur initiale) au tableau de points de code0;
, puis réduit le tableau généré comme suit.La valeur initiale est le premier élément du tableau, c'est-à-dire le 0 ajouté . Le lien rapide
ṛĿ
est appelé pour chaque élément suivant du tableau, avec la dernière valeur de retour comme argument de gauche et l'élément actuel comme argument de droite. Il inspecte son bon argument (ṛ
) et évalue le lien avec cet index monadiquement (Ŀ
), appliquant ainsi l'opération souhaitée.la source
Python 2, 54 octets
L'entrée est prise comme un littéral de chaîne.
~ord(c)%5%3
mappe les opérateurs aux opérandes de droite correspondants.Auparavant, j'utilisais
hash(c)%55%3
ce qui ne donnait pas de résultats cohérents entre les différentes versions de Python. Cela m'a encouragé à explorer d'autres formules.la source
hash
version Python est spécifique - ideone utilise 2.7.10 qui donne[1, 1, 2, 2]
comme quatre mappages, alors que localement sur 2.7.12 je reçois[2, 0, 1, 0]
SILOS ,
133211 octetsPrend les codes ASCII des opérateurs.
Essayez-le en ligne avec des cas de test:
-/
++**--/
*///*-*+-+
la source
-/
devrait retourner -1 , pas 0 .Machine de Turing - 23 états (684 octets)
Essayez-le ici - permalien
L'entrée ne doit pas contenir de '*' car il s'agit d'un caractère spécial dans le code machine Turing. Utilisez plutôt 'x'. Sort la réponse en binaire.
Code non obscurci
Explication des états:
Initialisation:
Ces états sont visités une fois au début de chaque exécution, en commençant par init2
Instructions de lecture:
Ces états seront visités plusieurs fois tout au long du programme
readop: se déplace complètement vers la droite jusqu'à ce qu'il lit un opérateur ou le '.'. S'il frappe un opérateur, passez à l'état correspondant (+, -, x, /). Si elle atteint un «.», Changez-la en état «fin».
return: renvoie la tête vers l'espace vide entre le total cumulé et les opérateurs. Passe ensuite à «readop».
Opérations:
ces opérations font le sale boulot
+: Déplacez-vous vers la gauche jusqu'à ce que la tête lise tout caractère non blanc. Si ce caractère est un «-», déplacez-vous vers la gauche et passez à «déc». Sinon, passez à «inc».
-: Similaire à '+', sauf changer en 'inc' s'il y a un '-' et 'dec' sinon.
inc: Si le chiffre sous la tête est un 0 (ou un espace), changez-le en 1 et changez en «zéro». Si le chiffre est un 1, changez-le en 0, puis répétez sur le chiffre suivant.
dec: Similaire à inc, sauf que 1 passe à 0, 0 à 1, et si la tête lit un espace, changez en «neg».
x, x0, x1: Déplacez le numéro un vers la gauche. Passez à «retour».
/, //, div, div0, div1: déplacez-vous complètement à droite du nombre, puis décalez-en un à droite. S'il y a un «-», changez en «inc». Cela simule l'arrondi des nombres négatifs. Sinon, passez à «zéro»
neg: Placez un '-' après le nombre puis changez en 'readop'
zéro, zéro1, zéro2: supprimez les zéros de tête et passez à «readop»
Nettoyage: rend la sortie présentable
la source
Perl 6 ,
5352 octetsExplication:
Usage:
la source
C,
636257 octetsWandbox
la source
05AB1E , 20 octets
Merci à Enigma d' avoir
-/
corrigé le bogue!16 octets si elle n'a pas été entier division:
Î"+-*/""><·;"‡.V
.Explication:
Utilise l' encodage CP-1252 . Essayez-le en ligne!
la source
-/
devrait retourner -1 , pas 0 .Î…+-*"><·"‡'/"2÷":.V
le même nombre d'octets.JavaScript ES6,
8068 octets12 octets sauvés grâce à Neil!
la source
"c"+
et écriviez"c+1 c-1 c*2 c/2|0".split
etc.o=>c=[c+1,c-1,c*2,c/2|0]["+-*/".indexOf(o)]
, ou je pense que vous pouvez ensuite enregistrer un octet supplémentaire en utilisanto=>c={"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o]
.k=>[...k].reduce((c,o)=>+{"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o],0)
pourrait fonctionner encore plus court encore, mais j'ai perdu le compte ...}
et[o]
, donc cela ne fait que 66 octets de long. En outre, le PO a clarifié;-/
devrait retourner -1 , pas 0 .Rubis,
484442 + 1 = 43 octets+1 octet pour le
-n
drapeau. Prend entrée sur STDIN.Voir sur ideone (utilise
$_
depuis ideone ne prend pas les drapeaux de ligne de commande): http://ideone.com/3udQ3Hla source
PHP 76 octets
la source
Python 2,
5856 octets-2 octets grâce à @Lynn
Les ordinaux des personnages
+-*/
sont43,45,42,47
modulo 11 ce sont10,1,9,3
modulo 3 ce sont1,1,0,0
, 2 moins ceux -ci sont1,1,2,2
donnant les montants dont nous avons besoin pour chaque opération:r=r+1
,r=r-1
,r=r*2
etr=r/2
Précédent:
la source
2-ord(c)%11%3
?Mathematica,
837370 octets10 octets enregistrés grâce à @MartinEnder .
Fonction anonyme. Prend une liste de caractères en entrée et renvoie un nombre en sortie. Suggestions de golf bienvenues.
la source
SILOS ,
175164 octetsEssayez-le en ligne!
Méthode d'entrée saine. Division entière correcte (arrondie vers l'infini).
la source
C #,
8781 octetsNon golfé:
L'entrée est supposée être valide. La division par deux se fait en décalant d'un bit vers la droite, car la division régulière arrondit toujours vers zéro, et le décalage de bits arrondit toujours vers le bas. L'incrémentation et la décrémentation font un usage pratique de la distance 1 entre les codes ASCII pour
+
et-
.la source
int f(string s)=>s.Aggregate(0,(i,c)=>c<43?i*2:c<46?i+44-c:i>>1);
(65 octets)Javascript (ES6), 57 octets (tableau) / 60 octets (entier)
Renvoyer un tableau de tous les résultats intermédiaires:
Par exemple, la sortie de
"++**--/"
sera[1, 2, 4, 8, 7, 6, 3]
.Renvoyer uniquement le résultat final:
Comment ça marche
Les deux solutions sont basées sur la même idée: utiliser la fonction de hachage parfaite
eval(2+c+3)&3
pour mapper les différents caractères d'opérateurc
dans[0, 3]
.la source
JavaScript (ES6), 57
Remarque: la valeur initiale de l'accumulateur est la chaîne de programme, en utilisant les opérations sur les bits (~, >>, <<, |), elle est convertie en 0 à la première utilisation.
En remarque, la réponse intelligente de @xnor marquerait 40 portés en javascript:
(si vous aimez ça, votez pour lui)
Tester
la source
Java, 77 octets
Utilise les flux java 8.
la source
r >> 1
pourr>>1
et enregistrer 2 octets?s->s.chars().reduce(0,(r,c)->c<43?r*2:c<46?r+44-c:r>>1);
qui vous donnera 56 octetsGNU sed,
655957 octetsEdit: 2 octets plus court grâce aux commentaires de Toby Speight
Courir:
Sortie:
Le
sed
script prépare l'entrée pour l'dc
appel shell à la fin, ce dernier acceptant l'entrée en notation polonaise inversée . Sur division, si le nombre est négatif (d0>
), la[1-]
commande de décrémentation stockée dans le registre@
est appelée. Exemple de conversion:+ - * /
->1+ 1- 2* d0>@2/
.la source
[1-]
modèle ...s
avecS
. J'ai oublié qu'il ne remplace pas la pile du registre, il pousse dessus, ayant l'effet contraire de ce que je voulais (puisque je l'ai utilisé pour tout/
). Les guillemets sont toujours nécessaires car vous avez des/
symboles qui rendent la chaîne interprétée comme un chemin de fichier :) J'ai rasé 1 octet de plus en supprimant l'espace après le-e
.-e
comme nom de fichier, vous n'avez donc pas besoin de guillemets pour le/
- essayez-le! Je pense qu'il est raisonnable pour un code-golf d'exiger que le répertoire de travail actuel ne contienne aucun fichier commençant par01s@
ou0-s@
.-e
ce qui concerne/
, mais les cours ne sont pas encore tenu que je viens de voir maintenant. Le>
est interprété directement par le shell comme un opérateur de redirection, je pense, car j'ai eu cette erreur:cannot create @2/d0: Directory nonexistent
>
. Vous avez besoin de devis, après tout. Toutes mes excuses pour (avoir tenté de) tromper! Et, bien que l'ajout d'une barre oblique inverse ressemble à un personnage, il doit être doublé dans uns///
remplacement, donc aucun avantage là-bas ...PHP, 75 octets
Il utilise une version modifiée de la réponse de Jörg Hülsermann .
Il s'appuie fortement sur la substitution de chaînes, en utilisant une simple expression régulière (
~.~
).La variable
$s
est réaffectée avec la nouvelle valeur pour chaque caractère. À la fin, il produit le résultat.Remarque : Ceci est destiné à être exécuté à l'aide du
-r
drapeau.Essayez-le ici:
Afficher l'extrait de code
Ou essayez: http://sandbox.onlinephpfunctions.com/code/7d2adc2a500268c011222d8d953d9b837f2312aa
Différences:
echo$s
, j'utilisesprintf($s)
. Les deux effectuent la même action sur les nombres. Puisque c'est juste pour les tests, c'est très bien.++*+
le premier argument, qui devrait s'afficher5
.la source
e
modificateur est de retour! : De
, qui a été remplacé parpreg_replace_callback
et pourrait être utilisé abusivement ... mais ce n'est pas tout à fait ça.Lot, 61 octets
Traduction de la réponse xcellent xcellent Python de @ xnor.
la source
Pyke,
2422 octetsEssayez-le ici!
Ou 12 octets (non compétitif)
Essayez-le ici!
Ajouter un
translate
nœud - essentiellement plusieurs recherches et remplacements.la source
PHP,
10410282 octetsPremière version avec eval:
Deuxième version avec opérateurs ternaires:
Prend la chaîne d'entrée comme premier argument de la ligne de commande.
Cela "ne fonctionne" que pour les chaînes d'entrée de moins de 10 000 caractères - ce qui devrait être suffisant. Testé avec tous les cas de test, malheureusement ne peut pas économiser sur l'initialisation au début.La deuxième version fonctionne avec des chaînes de n'importe quelle longueur et sans initialisation. :-)L'élément principal est la fonction eval qui manipule
$i
sur la base d'une carte des opérations arithmétiques, qui sont assez simples à l'exception de la division. PHP renvoie un flottant lors de l'utilisation/
etintdiv
est trop d'octets, nous faisons donc un décalage vers la droite .Mises à jour
$i=$i>>1
à$i>>=1
pour la division entière.la source
Python 3,
986660 octetsMerci Tukkax!
Pas aussi golfique que l'autre réponse, mais je ne peux pas rivaliser avec eux sans plagiat.
J'ai également une solution lambda récursive
7367 octets (amélioré!)la source
i=0 for c in input():i+=[1,-i//2,-1,i][ord(c)%23%4] print(i)
. (non formaté correctement bien sûr). Je pense également que vous devez mentionner que vous utilisez Python3. En Python2,input()
serait évalué àint(raw_input())
.+-
fait 1)R, 201 octets
Golfé
Commenté
La stratégie consiste à affiner les
+, -, %
opérateurs. Divisez la chaîne, puis analysez la chaîne en une longue liste de fonctions, à alimenter dans l'Reduce()'s
accumulateur.Je ne pouvais plus jouer au golf. Si quelqu'un peut se rendre
b=body<-
au travail, il pourrait y avoir quelques octets d'économies (affiner chaque fonction avecb
après"-"="+"="/"="*"
). Initialement essayé de substituer et d'analyser eval, mais l'ordre des opérations et les parenthèses étaient terrifiants.la source
f, ...
dans la définition de laReduce
fonction et de se débarrasser destdin()
dans ,scan
mais je viens d' essayer un naïf approche qui a laissé tomber deux octets de plus en définissant les fonctions un peu différemment. tio.run/##XcvLCsMgEAXQrwnO6Gge29B/…Lex + C,
78,74, 73 octetsLe premier caractère est un espace.
Lit
stdin
, renvoie le résultat.Compiler avec
lex golfed.l && cc lex.yy.c main.c -lm -lfl
, test principal:la source
Javascript (ES5), 127 octets
Non golfé:
la source
Pyth, 23 octets
Un programme complet qui prend l'entrée sous forme de chaîne et imprime le résultat.
Il s'agit d'un portage de la réponse Python @ xnor .
Essayez-le en ligne
Comment ça marche
la source
u@[yGhG0tG0/G2)CHQ0
19 octetsPHP, 79 octets
la source
1
; vous devez diviser et multiplier par2