Desafío:
Su trabajo es crear un intérprete simple para un lenguaje de golf simple.
Entrada:
La entrada será en forma de cadena separada por espacios.
Puedes reemplazar la separación del espacio con lo que quieras
Salida:
Salida del resultado (un número o una cadena) obtenido después de realizar todas las operaciones. Si hay más de una salida, únanse para dar un solo resultado (sin separadores). El valor inicial de la variable siempre es cero. es decir: comienza en0
Sintaxis del lenguaje:
El lenguaje tiene los siguientes operadores:
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)
Ejemplos:
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
Restricción:
Este es el código de golf, por lo que el código más corto en bytes para cada idioma ganará.
Nota:
- La entrada siempre será válida. (cadena de operadores separados con espacio)
- Puede redondear hacia abajo al entero más cercano si no desea lugares decimales.
code-golf
math
interpreter
Muhammad Salman
fuente
fuente
Respuestas:
Bash , 61 bytes
Pruébalo en línea!
Convierte el programa en un programa de CC, luego lo evalúa como código de CC. Esto toma la entrada separada por nuevas líneas. Tenga en cuenta que dc se basa en la pila y utiliza la notación de pulido inverso.
La entrada se canaliza primero a sed
1i0
en la primera línea de entrada, inserte (anteponga) un 0, este será el acumuladors/.//2g
eliminar todo menos el primer caracter de cada líneay"idmhe"+-*/q"
transcribiridmhe
en+-*/q
, respectivamente, + - * / son los comandos aritméticos y q sale del programa/+\|-/
en cada línea que contenga + o -,i1
inserte un 1/*\|\//
en cada línea que contiene * o /,i2
inserte un 2/P/
en cada línea que contiene P,cdn
cámbielo adn
, equivalente a duplicado y salida sin nueva línea en ccAhora esto se evalúa como una expresión de CC.
fuente
sed
sintaxis se vuelva aún más extraña de lo que se creía posible cuando el golf entra en juego.Jalea , 21 bytes
Pruébalo en línea!
Tenga en cuenta que los valores ASCII de los primeros caracteres (
idmhPe
) módulo 11 son únicos módulo 6.Usando el módulo 16:
Jalea , 21 bytes
Pruébalo en línea!
La cadena que se utiliza para indexar es
ḤH‘’IȮ
en este caso. El‘’
ya no está en los límites.fuente
“”
toma 2 bytes,¤
toma 1 byte, los datos en sí mismos toman 6 bytes, quedan 2 bytes para hacer algo. Actualmente es⁾
yj
, peroịØJ
oṃØJ
es mucho peor, yỌ
no funciona (porque Unicode).R ,
128125bytesPruébalo en línea!
Se debe llamar con
source(echo=FALSE)
para evitar que el valor de retorno se imprima automáticamente. La alternativa sería envolver todo,invisible
pero eso es mucho menos golfista (y arruina mi [todavía] buen número de bytes).fuente
05AB1E , 25 bytes
Pruébalo en línea!
Asigna cada una de las funciones del lenguaje con la función 05AB1E correspondiente (utilizando el primer carácter de cada función) y luego ejecuta la cadena resultante como código 05AB1E.
fuente
Rojo , 121 bytes
Pruébalo en línea!
Legible:
fuente
Python 2 ,
131125122121118117115 bytesPruébalo en línea!
-6 y -3 gracias a @Rod
-3 y -2 con gracias a @etene
-1 reemplazando
"Pri"==x
con"P"in x
fuente
split
en"exit"
y obtener la primera cuadra, en lugarbreak
ing ahorro de 4 bytes'idmh'
y usarfind
en lugar deindex
, que va a ahorrar unos pocos bytesex
para salvar otros 2v=(v+1,v-1,v*2,v/2.)
conv+=(1,-1,v,-v/2.)
él debería funcionar, aunque no lo probéhalf
. ¡Tan sencillo! Gracias.Python 3 ,
1109182 bytesexit
hará que el programa salga con un error.Pruébalo en línea!
fuente
i='x+=1';d='x-=1';...
y luego en suexec
llamada, cámbielo aexec(eval(c[0]))
print
declaración!JavaScript (ES6),
8379 bytesGuardado 4 bytes gracias a @ l4m2
Iterativamente reemplaza las instrucciones con la salida o cadenas vacías.
Pruébalo en línea!
Comentado
fuente
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<{}
es puro mal: ps=>s.replace(/\S+./g,e=>m<s?'':e<{}?m:(m+={d:-1,e,i:1,m}[e[0]]||-m/2,''),m=0)
también funcionaCarbón ,
3735 bytesPruébalo en línea! El enlace es a la versión detallada del código. Inspirado por la respuesta de @ RickHitchcock. Explicación:
Borrar la variable.
Trunca la entrada en el
x
caso de que haya una, luego repite y activa cada carácter de (el resto de) la entrada.n
i n crea la variable.d
d ecrements la variable.m
m multiplica la variable por dos (es decir, dobles).h
h alves la variable.r
p r ints la variable cast a string.fuente
JavaScript (ES6),
7775 bytes(Prestó ( robó ) el truco de @ Arnauld de usar
m
como nombre de variable, ahorrando 2 bytes).Recorre recursivamente la cadena, busca letras distintas por instrucción e ignora el resto:
Se aprovecha del hecho de que
undefined
no es ni mayor que ni menos que'x'
, haciendo que la recursión a tope en el extremo de la cadena o cuando se encuentra con el'x'
en la salida .Mostrar fragmento de código
fuente
JavaScript (Node.js) , 107 bytes
Pruébalo en línea!
fuente
f=
JavaScript (Node.js) , 91 bytes
Pruébalo en línea!
JavaScript (Node.js) , 96 bytes
Pruébalo en línea!
JavaScript (Node.js) , 99 bytes
Pruébalo en línea!
fuente
JavaScript, 107 bytes
fuente
Haskell , 93 bytes
Pruébalo en línea!
Esencialmente una traducción de la respuesta de Python de mbomb007 .
fuente
Lua, 207 bytes
fuente
Pitón 3 ,
114110109116 bytesEn realidad, habría tomado dos bytes menos en Python 2 porque
exec
es una declaración y no necesita paréntesis ...Ahorró 4 bytes adicionales gracias a @ElPedro
Se guardó un byte adicional aprovechando el hecho de que
find
devuelve -1 en caso de error, que luego se puede usar como índice+7 bytes porque no había notado la regla de no líneas nuevas :(
Pruébalo en línea!
Asigna el primer carácter de cada palabra de entrada a un fragmento de código Python. Estos se concatenan y
exec
ed.Enfoque bastante sencillo, que probablemente podría jugarse un poco más. La dificultad reside principalmente en encontrar la forma más corta entre muchas posibles ...
fuente
print(i,end='')
. Ver el cuarto caso de prueba.Ruby +
-na
,817365 bytesPruébalo en línea!
Muy claro. Para la primera letra de cada palabra, busque la cadena de comando correspondiente y
eval
esta. Utiliza la división de enteros yexits
arrojando aZeroDivisionError
.-5 bytes: uso en
.ord%11%6
lugar de una búsqueda de cadena. El crédito va al usuario202729-3 bytes:
.ord
solo considera el primer carácter de la cadena, por lo que puedo omitir a[0]
.-8 bytes: use la
-a
bandera para dividir automáticamente la entrada, gracias a Kirill L.fuente
-a
la opción de hacer el autosplit para usted, como esteEmojicode , 270 bytes
Pruébalo en línea!
fuente
SNOBOL4 (CSNOBOL4) , 165 bytes
Pruébalo en línea!
Bruto.
fuente
C # (.NET Core), 186 bytes
fuente
i
conv
, consultando una tabla ASCII para que pueda utilizar los números pequeños, la reordenación de laif
s, y luego usando un ternario: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 una explicación de cómo funciona y cómo utilizar (por ejemplo, espera argumentos de línea de comando) siempre es apreciado)%50
lugar de%'d'
)Perl 5
-a
, 61 bytesPruébalo en línea!
@ Robó de user202729
ord%11%6
truco¿Cómo?
fuente
Pyth, 44 bytes
Banco de pruebas
explicación
fuente
TI-BASIC, 112 bytes
Esto aprovecha algunos supuestos que son AFAIK perfectamente aceptables. El número uno es que todas las variables se inicializan a cero antes de la ejecución; número dos es que la entrada se toma a través de
Ans
.fuente
Java (OpenJDK 8) , 164 bytes
Pruébalo en línea!
Arriba está mi solución que se completa con números enteros, pero abajo está mi solución que maneja decimales. La forma desagradable en que las impresiones de Java se duplican agrega otros 55 byes al puntaje. Dejé las nuevas líneas para hacer que el código sea más legible en el segundo envío solo porque es esencialmente la misma solución con un comando adicional y una declaración de importación.
Java (OpenJDK 8) , 219 bytes
Pruébalo en línea!
fuente
C (gcc) ,
120114111 bytes-6 bytes gracias a ceilingcat.
Pruébalo en línea!
124 bytes
Versión de punto flotante:
Pruébalo en línea!
No me molesté con una versión que se redondea, pero hace una excepción para 0, que estaría permitida, si entiendo la cadena de comentarios correctamente.
fuente
33 , 62 bytes
Pruébalo en línea!
Este programa toma las instrucciones delimitadas por líneas nuevas
Explicación:
El código antes de ese segmento define todas las funciones.
fuente