Défi:
Votre travail consiste à créer un simple interprète pour une langue de golf simple.
Contribution:
L'entrée sera sous la forme d'une chaîne séparée par des espaces.
Vous pouvez remplacer la séparation d'espace par ce que vous voulez
Production:
Affiche le résultat (un nombre ou une chaîne) obtenu après avoir effectué toutes les opérations. S'il y a plus d'une sortie, joignez-les ensemble pour donner un seul résultat (pas de séparateurs). La valeur initiale de la variable est toujours nulle. c'est à dire: ça commence à0
Syntaxe de la langue:
La langue a les opérateurs suivants:
inc ---> add one to variable
dec ---> remove one from variable
mult ---> multiply variable by 2
half ---> divide the variable by 2
Pri ---> print the variable to console (or whatever your language has)
exit ---> end the program (anything after this is ignored)
Exemples:
inc inc inc dec Pri exit ---> 2
dec inc mult inc inc Pri ---> 2
inc inc inc mult half Pri exit inc ---> 3
inc Pri inc Pri inc Pri exit half mult ---> 123
Pri exit ---> 0
inc half Pri exit ---> 0.5
Restriction:
Il s'agit de code-golf, donc le code le plus court en octets pour chaque langue gagnera.
Remarque:
- L'entrée sera toujours valide. (chaîne d'opérateurs séparés par un espace)
- Vous pouvez arrondir à l'entier le plus proche si vous ne voulez pas de décimales.
code-golf
math
interpreter
Muhammad Salman
la source
la source
Réponses:
Bash , 61 octets
Essayez-le en ligne!
Convertit le programme en programme DC, puis l'évalue en tant que code DC. Cela prend l'entrée séparée par des retours à la ligne. Notez que dc est basé sur la pile et utilise la notation de polissage inversé.
L'entrée est d'abord dirigée vers sed
1i0
sur la première ligne d'entrée, insérez (ajoutez) un 0, ce sera l'accumulateurs/.//2g
supprimer tout sauf le premier caractère de chaque ligney"idmhe"+-*/q"
translittéreridmhe
en+-*/q
respectivement + - * / sont les commandes arithmétiques et q quitte le programme/+\|-/
sur chaque ligne contenant + ou -,i1
insérez un 1/*\|\//
sur chaque ligne contenant * ou /,i2
insérez un 2/P/
sur chaque ligne contenant P,cdn
changez-le endn
, équivalent à dupliquer et sortez sans nouvelle ligne en dcMaintenant, cela est évalué comme une expression cc.
la source
sed
syntaxe devienne encore plus étrangère que ce que l'on pensait possible lorsque le golf entre en jeu.Gelée , 21 octets
Essayez-le en ligne!
Notez que les valeurs ASCII des premiers caractères (
idmhPe
) modulo 11 sont uniques modulo 6.Utilisation de modulo 16:
Gelée , 21 octets
Essayez-le en ligne!
La chaîne utilisée pour l'indexation est
ḤH‘’IȮ
dans ce cas. Ils‘’
ne sont plus aux frontières.la source
“”
prend 2 octets,¤
prend 1 octet, les données elles-mêmes prennent 6 octets, il reste 2 octets pour faire quelque chose. Actuellement, c'est⁾
etj
, maisịØJ
ouṃØJ
est bien pire, etỌ
ne fonctionne pas (car Unicode).R ,
128125 octetsEssayez-le en ligne!
Doit être appelé avec
source(echo=FALSE)
pour empêcher l'impression automatique de la valeur de retour. L'alternative serait de tout envelopperinvisible
mais c'est beaucoup moins golfique (et ruine mon [encore] joli nombre d'octets).la source
05AB1E , 25 octets
Essayez-le en ligne!
Mappe chacune des fonctions de langage avec la fonction 05AB1E correspondante (en utilisant le premier caractère de chaque fonction), puis exécute la chaîne résultante en tant que code 05AB1E.
la source
Rouge , 121 octets
Essayez-le en ligne!
Lisible:
la source
Python 2 ,
131125122121118 118117115 octetsEssayez-le en ligne!
-6 et -3 avec merci à @Rod
-3 et -2 avec merci à @etene
-1 en remplaçant
"Pri"==x
par"P"in x
la source
split
sur"exit"
et obtenir le 1er bloc, au lieubreak
ing sauver 4 octets'idmh'
et utiliser à lafind
place deindex
, cela économisera quelques octetsex
pour en sauver 2 autresv=(v+1,v-1,v*2,v/2.)
avecv+=(1,-1,v,-v/2.)
cela devrait fonctionner, mais n'a pas été testéhalf
. Si simple! Merci.Python 3 ,
1109182 octetsexit
entraînera la fermeture du programme avec une erreur.Essayez-le en ligne!
la source
i='x+=1';d='x-=1';...
puis dans votreexec
appel, changez-le enexec(eval(c[0]))
print
déclaration!JavaScript (ES6),
8379 octets4 octets enregistrés grâce à @ l4m2
Remplace itérativement les instructions par la sortie ou des chaînes vides.
Essayez-le en ligne!
Commenté
la source
s=>s.replace(/\S+./g,w=>k<s?'':w<{}?k:(k+={d:-1,e:w,i:1,m:k}[w[0]]||-k/2,''),k=0)
w<{}
du mal pur: ps=>s.replace(/\S+./g,e=>m<s?'':e<{}?m:(m+={d:-1,e,i:1,m}[e[0]]||-m/2,''),m=0)
fonctionnent égalementFusain ,
3735 octetsEssayez-le en ligne! Le lien est vers la version détaillée du code. Inspiré par la réponse de @ RickHitchcock. Explication:
Effacez la variable.
Tronquez l'entrée à
x
s'il y en a une, puis bouclez et activez chaque caractère (le reste de) l'entrée.n
i n incrémente la variable.d
d ecrements la variable.m
m ultiplies la variable par deux ( par exemple double).h
h alves la variable.r
p r entre la variable transtypée en chaîne.la source
JavaScript (ES6),
7775 octets(Emprunté ( volé ) @ Astuce d'Arnauld d'utiliser
m
comme nom de variable, économisant 2 octets.)Parcourt récursivement la chaîne, recherchant des lettres distinctes par instruction et ignorant le reste:
Profite du fait qu'il
undefined
n'est ni supérieur ni inférieur à'x'
, provoquant l'arrêt de la récursivité à la fin de la chaîne ou lorsqu'elle rencontre la sortie'x'
in .Afficher l'extrait de code
la source
JavaScript (Node.js) , 107 octets
Essayez-le en ligne!
la source
f=
JavaScript (Node.js) , 91 octets
Essayez-le en ligne!
JavaScript (Node.js) , 96 octets
Essayez-le en ligne!
JavaScript (Node.js) , 99 octets
Essayez-le en ligne!
la source
JavaScript, 107 octets
la source
Haskell , 93 octets
Essayez-le en ligne!
Essentiellement une traduction de la réponse Python de mbomb007 .
la source
Lua, 207 octets
la source
Python 3 ,
114110109116 116 octetsEn fait, aurait pris deux octets de moins en Python 2 car
exec
c'est une instruction et n'a pas besoin de parenthèses ...4 octets supplémentaires enregistrés grâce à @ElPedro
Sauvegarde d'un octet supplémentaire en profitant du fait que
find
renvoie -1 en cas d'erreur, qui peut ensuite être utilisé comme index+7 octets car je n'avais pas remarqué la règle de non-retour à la ligne :(
Essayez-le en ligne!
Mappe le premier caractère de chaque mot saisi à un morceau de code Python. Celles-ci sont ensuite concaténées et
exec
éditées.Approche assez simple, qui pourrait probablement être un peu plus jouée au golf. La difficulté réside principalement dans la recherche de la forme la plus courte parmi les nombreuses possibles ...
la source
print(i,end='')
. Voir le 4ème cas de test.Ruby +
-na
,817365 octetsEssayez-le en ligne!
Assez simple. Pour la première lettre de chaque mot, recherchez la chaîne de commande correspondante et
eval
celle - ci. Utilise la division entière etexits
en lançant aZeroDivisionError
.-5 octets: utilisez
.ord%11%6
au lieu d'une recherche de chaîne. Le crédit revient à user202729-3 octets:
.ord
ne prend en compte que le premier caractère de la chaîne, je peux donc ignorer a[0]
.-8 octets: utilisez l'
-a
indicateur pour diviser automatiquement les entrées, grâce à Kirill L.la source
-a
option pour faire l'autosplit pour vous, comme ceciEmojicode , 270 octets
Essayez-le en ligne!
la source
SNOBOL4 (CSNOBOL4) , 165 octets
Essayez-le en ligne!
Brut.
la source
C # (.NET Core), 186 octets
la source
i
avecv
, consulter une table ASCII pour pouvoir utiliser des petits nombres, réorganiser lesif
s, puis utiliser un ternaire:class Z{static void Main(string[]a){int v=0,i;foreach(var s in a){i=s[0]%'d';if(i==1)break;if(i>9)System.Console.Write(v);else v=i<1?v-1:i<5?v/2:i<6?v+1:v*2;}}}
(PS une explication de la façon dont cela fonctionne et comment utiliser il (par exemple s'attend à des arguments de ligne de commande) est toujours apprécié!)%50
place de%'d'
)Perl 5
-a
, 61 octetsEssayez-le en ligne!
A volé @ user202729
ord%11%6
astuceComment?
la source
Pyth, 44 Bytes
Test Suite
explanation
la source
TI-BASIC, 112 bytes
This takes advantage of some assumptions that are AFAIK perfectly acceptable. Number one being that all variables are initialized to zero prior to execution; number two being that input is taken via
Ans
.la source
Java (OpenJDK 8) , 164 octets
Essayez-le en ligne!
Ci-dessus est ma solution qui arrondit aux nombres entiers, mais ci-dessous est ma solution qui gère les décimales. La façon odieuse dont les impressions java doublent ajoute 55 byes supplémentaires au score. J'ai laissé les nouvelles lignes pour rendre le code plus lisible dans la deuxième soumission uniquement parce que c'est essentiellement la même solution avec une commande supplémentaire et une instruction d'importation.
Java (OpenJDK 8) , 219 octets
Essayez-le en ligne!
la source
C (gcc) ,
120114111 bytes-6 octets grâce au plafond.
Essayez-le en ligne!
124 octets
Version à virgule flottante:
Essayez-le en ligne!
Je n'ai pas pris la peine d'une version qui arrondit, mais fait une exception pour 0, ce qui serait autorisé, si je comprends bien la chaîne de commentaires.
la source
33, 62 bytes
Try it online!
This program takes the instructions delimited by newlines
Explanation:
The code before that segment defines all the functions.
la source