He pensado en el lenguaje esotérico Jumper. Más tarde verás por qué.
- Funciona con memoria de acceso aleatorio con bytes como celdas. La RAM está indexada a cero y se llena inicialmente con ceros.
- Al intentar acceder a celdas con índices negativos, se debe mostrar el error y finalizar el programa.
- Al intentar leer en un índice mayor que el anterior, se debe devolver cero.
- Al intentar escribir en un índice mayor que el anterior, la RAM debe aumentarse a múltiplos de 1024 y las celdas nuevas deben llenarse con ceros (técnicamente puede aumentar la RAM no a múltiplos de 1024, por lo que si aumenta el rendimiento, si le cuesta muchos caracteres, puede hacerlo no a múltiplo de 1024).
- El programa también tiene un puntero a la celda en la RAM que inicialmente es cero
- Cuando el programa comienza a ejecutar, se debe mostrar una solicitud de cadena de entrada (o tomar la entrada de los argumentos de la línea de comando, depende de usted). La cadena de entrada no debe contener caracteres nulos (byte cero). Luego, la cadena de entrada se escribe en la RAM comenzando en el índice cero.
- Cuando el programa finaliza, se muestra un cuadro con la salida del programa: se excluye el contenido de la RAM desde el índice cero hasta el primer byte cero.
Ahora, la parte más interesante, la sintaxis.
El programa consta de comandos (operadores unarios-prefijos) y sus argumentos. Los comandos y argumentos pueden delimitarse con espacios o nuevas líneas, pero no son necesarios. Sin embargo, los espacios dentro de los argumentos no son válidos, por ejemplo, # 2 = 4
es válido, pero # 2 = 4 4
no lo es.
El programa puede tener comentarios entre ()
. Los comentarios no se pueden anidar, por ejemplo, en el (abc(def)ghi)
comentario es (abc(def)
. Los comentarios se pueden colocar en cualquier lugar.
#123
establece el puntero RAM en 123 (cualquier entero decimal positivo o cero).>123
incrementa el puntero RAM en 123 (cualquier entero decimal positivo).<123
disminuye el puntero RAM en 123 (cualquier entero decimal positivo).=123
escribe 123 (cualquier entero decimal de 8 bits sin signo) en la celda actual.+123
agrega 123 (cualquier entero decimal de 8 bits sin signo) a la celda actual (módulo 256).-123
resta 123 (cualquier entero decimal de 8 bits sin signo) de la celda actual (módulo 256).:123
- "goto" - va al comando número 123 (el primero es 0). Puede controlar el flujo de su programa solo con goto's, tiene que saltar, por eso decidí llamar a este lenguaje Jumper.
Si falta un argumento, piense que es 1 para ><+-
comandos o 0 para #=:
comandos.
Además, hay un modificador de comando: ?
(prefijo al comando), ejecuta el siguiente comando solo si la celda actual no es cero; de lo contrario, omite ese comando. Se puede aplicar a cualquier comando.
Por ejemplo, ?:17
- va al comando 17 si la celda actual no es cero.
Si el programa no es válido o se produce un error durante el tiempo de ejecución, se puede mostrar el mensaje "Error". Debido a esto es CodeGolf, un mensaje tan corto estará bien.
Tu tarea
Escriba el intérprete más corto para este idioma.
Algunos programas de prueba
(prints "Hello world!" regardless of input)
=72>=101>=108>=108>=111>=32>=119>=111>=114>=108>=100>=33>=
(appends "!" to the end of input string)
?:2 :4 >1 :0 =33 >1 =0
fuente
Respuestas:
Rubí, 447 bytes
Toma tanto el programa como la entrada a través de argumentos de línea de comando.
EDITAR: se corrigieron algunos errores y se agregó compatibilidad con la sintaxis no válida a un costo de 40 bytes (al tiempo que se agregaron algunas otras optimizaciones).
fuente
Pitón (729)
En cuanto a ejecutar el programa:
Ejemplo:
Probablemente hay algunas cosas que pasé por alto, así que por favor deje un comentario si intenta hacer algo que debería funcionar pero no funciona. Tenga en cuenta que esto está escrito en código Python 2.x.
fuente
Ruby 2 -
540447420 caracteresEjecutar como "ruby2.0 jumper.rb 'instrucciones' 'datos de inicialización'". 1.x Ruby no funcionará (sin método String.bytes).
Se agregaron comandos y comentarios de varias líneas y mejoré mi colocación.
Aquí hay un conjunto de pruebas con algunas pruebas de dispersión. La forma más fácil de usarlo es introducir el código en t / jumper.t y ejecutar "perl t / jumper.t".
Versión sin golf.
Un proto-ensamblador rápido.
fuente
Clojure -
585577 bytesNo se utilizan trucos especiales de golf, porque no conozco ninguno para Clojure. El intérprete es puramente funcional. Viene empaquetado con un buen mensaje de error en caso de una dirección RAM negativa (se genera un error, pero no se producen excepciones ni errores).
Ejemplos:
Códigooriginalungolfing:fuente
-
al final de la clase de personaje de tu expresión regular, no necesitas escapar de ella. -1 personaje.CoffeeScript (465)
El primer cuadro de aviso es para el programa y el segundo cuadro de aviso es de entrada. Pruébelo en http://coffeescript.org .
Original :
Esto todavía se juega al golf, pero comentó:
Editar : Agregar espacios tomó más bytes de lo que pensaba. Este intérprete arrojará un error en la sintaxis no válida, el otro tiene un comportamiento no especificado en la sintaxis no válida.
fuente
?:2 :4 >1 :0 = 33 <10 =0
(el programa append-! Con un espacio extra)<1
no<10
.Javascript, 519
Esto obtiene el programa y la entrada a través de cuadros de diálogo. Pegar esto en la consola Javascript de su navegador funcionará, así como incluirlo en un archivo, pegarlo antes del código
<!DOCTYPE html>
, nueva línea<html><head><script>
y después del código</script></head><body></body></html>
, y guardar el archivo resultante como "swagger.html".Este es mi primer intento en esto, y ya me gusta el idioma. Un poco Sin embargo, realmente necesita etiquetas de texto, en lugar de este etiquetado de índice de instrucciones de estilo BÁSICO.
Versión sin golf (un poco):
fuente
clojure.string/replace
?:2 :4 >1 :0 = 33 <10 =0
(el apéndice-! Con un espacio extra) Sin embargo, no se ha probado.C 687 GCC 4.9.0 y Visual C ++ 2013 (si los finales de línea cuentan como 1)
Editar: Gracias a Dennis ahora es mucho más corto (y funciona en GCC para arrancar)
La versión de golf
Una versión un poco menos golfizada:
fuente
R[z]=x
enP(x)
con(R[z]=x)
. 2. GCC no requiere ninguna de las declaraciones de inclusión. 3.char C
->U C
.Groovy 582
versión sin golf:
Creo que hay un error con los comentarios, que no se reconoce correctamente, que podría ser causado por la expresión estúpida que utilicé, pero los 2 programas se ejecutan como deberían:
fuente
Haskell: una cantidad impía de personajes
Muy bien, en este momento esto es algo que podría o no jugarse golf en breve. Es increíblemente enorme por lo que es, con un montón de código descuidadamente escrito (hacía bastante tiempo desde la última vez que toqué a Haskell). Pero fue divertido escribir.
fuente
Haskell, 584
El programa de entrada y puente se proporcionan como las dos primeras líneas de entrada de stdin.
Publicaré una versión no golfizada más tarde, pero mientras tanto quería dejar esto como un rompecabezas para el lector:
¡Que te diviertas!
fuente