Aquí hay una definición de lenguaje muy simple:
A Variable is any string that does not contain ^, <, >, !, or ?
The empty string is a valid variable identifier
The value of every variable starts at 0.
A Statement is one of (var is a Variable, P is a Program):
var^ -> changes var to be equal to 1 more than itself
var<P> -> while var > 0, changes var to be equal to 1 less than itself, then runs P
var! -> output value of var
var? -> ask for non-negative integer as input, increase var by that value
A Program is a concatenation of Statements, running a Program means running each Statement in order
Programas de ejemplo (tenga en cuenta que la cadena vacía es una variable, pero la usaré con moderación en aras de la claridad, y algunas variables se ponen a cero en el programa cuando generalmente son 0 por defecto):
<>: sets the value of the empty string variable to 0
b<>b?b<a^>: asks for b, then adds the value stored in b to a, zeroing b in the process
b<>b?a<>b<a^>: asks for b, then sets a to the value of b, zeroing b in the process
a<>c<>b<a^c^>c<b^> : copies the value in b into a without zeroing it
b<>c<>a<c^c^c<b^>>b! : outputs a multiplied by 2
b^b<a<>a?a!b^> : outputs what you input, forever
Su objetivo es escribir el intérprete más pequeño para este idioma.
El valor de una variable puede ser arbitrariamente grande y solo debe estar limitado por la memoria total a la que tiene acceso su idioma, en teoría, pero solo debe manejar valores de hasta 2 ^ 256.
Su programa debería ser capaz de manejar programas arbitrariamente largos, en teoría, pero solo se le pedirá que trabaje en programas de menos de 2 ^ 32 caracteres de longitud. También debe manejar bucles anidados de profundidad de hasta 2 ^ 32.
Puede suponer que el programa es válido y que solo obtendrá enteros no negativos cuando solicite información. También puede suponer que solo los caracteres imprimibles ASCII se incluyen en la cadena de entrada.
La velocidad del programa que interpreta no importa, ya será muy lenta para cosas tan simples como la multiplicación de 5 dígitos, sin optimización.
Si desea utilizar un idioma que no puede aceptar razonablemente la entrada o producir la salida de la manera descrita por el idioma, utilice cualquier interpretación que desee para que sea posible. Esto se aplica a cualquier razón por la cual su idioma no pueda implementar algún comportamiento requerido. Quiero que todos los idiomas puedan competir.
El programa más corto gana. Se aplican lagunas estándar.
fuente
Respuestas:
Ruby, 182 bytes
Pruébalo así:
Cómo funciona
La
r
función tokeniza una cadena de entrada y ejecuta cada token:Buscamos alguna
$2
coincidencia de nombre de variable[^!?^<>]*
, seguida de<...>
donde...
coincide con cero o más programas (\g
es recursividad), en cuyo caso$4
no esnil
!
,?
o^
carácter, capturado por$3
, en cuyo caso$4
esnil
.Entonces, la lógica para ejecutar un token es bastante simple cuando se sangra un poco:
fuente
JavaScript (ES6) 184
194 209Edición simplificada (usar parámetros de función para entrada y salida parecía una buena idea, pero no lo fue), 1 byte más guardado thx @ ӍѲꝆΛҐӍΛПҒЦꝆ
Editar 2 Análisis modificado. La lógica para el incremento / entrada se toma prestada de la respuesta de @ Lynn
Menos golf
PRUEBA El fragmento comienza a evaluar 2016 utilizando el programa publicado por @Neil. Se paciente...
fuente
eval
para evitarreturn
no es una opción?Perl, 251 bytes
Versión más fácil de leer:
Esto desperdicia un montón de bytes arreglando bucles para ser saltos directos, pero escanear hacia atrás para el inicio del bucle ofendió mi sentido de la estética.
fuente
C ++ estándar, 400 bytes
Esto compila con
g++ -g test.cpp -Wall -Wextra -pedantic -std=gnu++11
Podría acortarlo un poco más. Si tiene alguna sugerencia por favor comente.
fuente