Interpretar volátil
Volátil es un esolang basado en pila hecho por A_ / a '_' / A que solo tiene 8 instrucciones y se está completando. Sin embargo, también es no determinista ... lo que significa que los programas no siempre dan el mismo resultado. Tu tarea es interpretar este lenguaje.
Especificaciones de idioma
Tomado de la página de esolangs:
~: Push a random integer in any range of integers. Minimum range of 0 through 32768
+: Pop 2 values and push the sum of the 2 values
-: Like +, but subtracts
*: Multiply
/: Divide. 0-division will result in an error.
:: Duplicate the top of the stack
.: Output the top of the stack without popping it
(...): Execute ... inside a while loop when the top of the stack is not 0
Todo lo demás no se tiene en cuenta.
Entrada
Tenga en cuenta que estos programas pueden fallar aleatoriamente
~:/::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/::::::::::::::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++++++++++++++.~:/::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++.~:/:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/:::::::::::::::::::::::::::::::::+++++++++++++++++++++++++++++++++.~:/::::::::::++++++++++.
~:-.~:/+.(~:/+.)
~:-:/
Salida
73 102 109 109 112 45 33 120 112 115 109 101 34 11
0 1 2 3 4 5 6 7 8 9 ...
<Any Error Message>
Se pueden encontrar más ejemplos, así como una implementación de referencia (use el segundo, que se encuentra en (Otro) intérprete de python 3 ) en https://esolangs.org/wiki/Volatile
Puntuación
Este es el código de golf, por lo que la respuesta más corta en bytes gana
Tablas de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
# Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
fuente
~
Empuja un número entero o cualquier número?1
, que podría dividirse por cero.~
debe ser capaz de presionar cero, de lo contrario es determinista. Además, el RNG siempre debe poder devolver cero después de cualquier número de ceros en una fila.~:-.~:/+.(~:/+.)
comenzar esa segunda entrada en0 1 2 ...
lugar de1 2 3 ...
? El~:-.
resultado sería 0, que sale. Esos intérpretes en la página de Esolang parecen confirmar esto ( aquí el segundo ).~:-.(~:/+.)
Respuestas:
05AB1E , 35 bytes
Pruébalo en línea!
Transpila el código volátil a 05AB1E, luego lo evalúa.
*
,+
y-
se puede dejar como está.:
,.
y)
tienen un equivalente directo de un byte. Los otros comandos toman unos pocos bytes cada uno. Desafortunadamente, 05AB1E no se bloquea en la división por 0, por lo que en su lugar se implementa mediante un "salir condicional si la parte superior de la pila == 0".fuente
0
y1
correctamente antes del ciclo, pero luego comienza a emitir el programa Volátil (la entrada implícita) en sí. Me gusta esaD Doingõq
cadena de diccionario para la declaración if, por cierto! :)while peek
, pero en el intérprete de referencia es awhile pop
. El ejemplo se puede solucionar agregando algunos:
( TIO ). Alternativamente, mi código se puede cambiar a awhile peek
mediante la adición de aD
.0 1 2 3 ...
, ambos intérpretes de referencia de Esolang todavía salen . No he mirado su código fuente, pero solo he probado los dos.D
en mi código.replace
vs de JavareplaceAll
(que reemplazan todas las ocurrencias, pero lasreplaceAll
expresiones regulares de uso y la otra no). xDJulia 1.0 , 334 bytes
Mi primer "intérprete" de cualquier tipo, fue más fácil de lo que esperaba. Practiqué un poco de golf básico, pero probablemente haya espacio para más. Lo hice imprimir un espacio después de la salida para. a mach a salida de ejemplo. La versión sin golf está en el encabezado en el enlace TIO. Ejemplo de uso
v("~:-:/")
.+41 bytes para corregir el error que Night2 señaló al agregar un contador de bucle. Ahora veo por qué transpilar es una buena opción. Un buen caso de prueba es
~:-.(~:/+.)(~:/+.())~:-.
con la salida esperada0 0
Pruébalo en línea!
fuente
Encantamientos rúnicos ,
266264 bytesPruébalo en línea!
Debido a las limitaciones integradas en Runic, solo puede admitir longitudes de programa (y tamaño de pila) de ~ 50 1 . Los programas que son demasiado grandes simplemente fallarán. Si la pila crece demasiado, se producirá un error con
SO!
(no era necesario, pero era mejor que la terminación silenciosa; costo 24 bytes). Si el programa intenta dividir por 0, se imprimirá/0!
.Los errores se agregan al final de la salida estándar ya que Runic no tiene forma de escribir en STDERR.
Esta versión admitirá programas arbitrariamente largos, pero aún se limita a una pila de ~ 90 (y, por lo tanto, errores en el segundo resultado del primer programa de prueba) y no se ha jugado muy bien (el aumento en la longitud del comando entre
S͗}:
yS͗}͍:0%:
requirió algo de espacio adicional para que las secciones se alineen, pero ese espacio adicional también permitió más<
para un tamaño de pila máximo más grande).Alternativamente, este programa evitará
~
generar un cero y el programa terminará después de 1 millón de pasos de ejecución (una protección contra bucles infinitos integrados en el intérprete rúnico). También incluye algunos bytes para omitir el exceso de espacio NOP y ejecutar un poco más.sizeof(stack) < mana
y hay 5 IP que se combinan y combinan su maná (50 iniciales). Aumentar ese valor al límite verdadero (el +10) costaría otros 2 bytes y dejé la lógica golfy en lugar de precisa.Explicación
<<<<<
y las cinco IP se fusionan en ely
~
o:
comandos de error en el desbordamiento de la pila, la sección amarilla se omite si la pila no está demasiado llena y regresa a través del envolvente al azul oscuro.)
se encuentra el programa, se ramifica a la sección roja y se mueve a la derecha.(
se encuentra un (continúe en verde).)
se encuentre (proceda en naranja), la pila de profundidad de pila se golpea y cuando(
se encuentra a, la pila de profundidad de pila se abre una vez (proceder al reingreso verde oscuro y naranja)B
y regrese al cian al bucle de análisis principal; de lo contrario, envuelva a través de naranja-> amarillo-> rojo (reingresando al bucle de reinicio del bucle).fuente
PHP , 196 bytes
Entrada 1: ¡ Pruébelo en línea!
Entrada 2 (0, 1, 2, ...): ¡ Pruébelo en línea!
Entrada 3 (división por error cero): ¡ Pruébelo en línea!
¡Simplemente traduce el código a PHP y lo evalúa!
fuente
JavaScript (V8) ,
178172171bytesTranspiles a JS. Puede arrojar cualquiera
Z is not defined
ox is not defined
si el código intenta hacer algo malo.¡Prueba el primer programa en línea!
¡Prueba el segundo programa en línea!
¡Prueba el 3er programa en línea!
¿Cómo?
Cada instrucción se transpira a
S.push(
, seguida de un patrón específico, seguido de);
.Tenemos que probar la división por cero explícitamente porque a JS no le importa en lo más mínimo una operación tan inofensiva. :-pags
fuente
Java 8,
420418402373359357341 bytes-2 bytes gracias a @Grimy .
-16 bytes gracias a @ceilingcat .
Pruébalo en línea.
Explicación:
fuente
new Random().nextInt()
es 2 más corto que(int)(Math.random()*1e5)
.java.util.*
importación para elStack
. ¡Gracias! :)new Random().nextInt()
con5
todos los casos de prueba, todavía pasará.5
no es exactamente al azar ;) Relevante xkcdC (gcc) para Linux x86_64,
675 643 621 613 597 432 404399 bytesPruébalo en línea!
Este es un JIT que traduce directamente las instrucciones volátiles al lenguaje de máquina x86_64 y ejecuta el código. Si su máquina no tiene la
rdrand
instrucción, se puede reemplazarL"\xf0c70f50"
con"Pj*X"
un " PRNG menos uniforme ". Al puerto de algo que no sea Linux, reemplace las llamadas al sistema en losprintf()
yexit()
las gotas y ajustar los parámetros ammap()
.EDITAR: esta versión llama en
printf()
lugar de implementar un subconjunto desde cero.EDIT2: Los enteros compatibles ahora son de 32 bits en lugar de 64.
Un poco menos golfizado ...
fuente
Kotlin , 412 bytes
Desafortunadamente, perdí con Java, pero no quería hacerlo
import java.util.Stack
(y no estoy seguro de que cerraría la brecha de todos modos).Sin golf
Pruébalo en línea!
fuente