¡Es hora de que implemente mi nuevo lenguaje basado en pila! Se llama StackyMath. Este será un lenguaje basado en la pila con 8 operaciones en la pila y formas de agregar números a la pila.
Lista de operaciones:
/
: División. Realizado en los 2 primeros números de la pila. Empuja el resultado nuevamente en la pila.*
: Multiplicación. Realizado en los 2 primeros números de la pila. Empuja el resultado nuevamente en la pila-
: Resta. Realizado en los 2 primeros números de la pila. Empuja el resultado nuevamente en la pila+
: Además. Realizado en los 2 primeros números de la pila. Empuja el resultado nuevamente en la pila^
: Exponenciación. Realizado en los 2 primeros números de la pila. Empuja el resultado nuevamente en la pila%
: Modulo. Realizado en los 2 primeros números de la pila. Empuja el resultado nuevamente en la pila!
: Factorial. Realizado en el número superior en la pila. Empuja el resultado nuevamente en la pilaD
: Duplica el número superior en la pila
Operaciones definidas en pseudocódigo:
/
:push(pop divided by pop)
*
:push(pop times pop)
-
:push(pop minus pop)
+
:push(pop plus pop)
^
:push(pop to the pop)
%
:push(pop mod pop)
!
:push(factorial pop)
D
:t = pop; push(t); push(t)
Cómo empujar números a la pila:
Agregar números a la pila es fácil, solo coloque el número sin procesar en su programa donde lo necesite. Si necesita poner varios números en la pila, puede separarlos con una coma ( ,
). Su programa no necesitará procesar -
números en la entrada. Si el usuario quiere uno, debe presionar el número que quiere negado, cero y -
. Los números en la entrada del programa también están restringidos a enteros positivos.
Entrada:
Su programa debe tomar la entrada en la línea de comando, o desde la entrada estándar. La entrada solo consistirá en números (sin notación científica o decimales) delimitados según ,
sea necesario, y las operaciones definidas anteriormente.
Salida:
Su programa debe imprimir el número en la parte superior de la pila.
Casos de error:
- Si el programa intenta sobrecargar la pila, debe imprimir
StackUnderflowException!!!
. - Si tiene división por cero, imprima
DivisionByZeroException!!!
- Si un número que excede los 64 bits, ya sea mientras ejecuta el programa o procesa un número en la entrada, imprima
NumberOverflowException!!!
- Si de alguna manera obtienes un número negativo en la parte superior de la pila y necesitas hacer un factorial, imprime
NegativeFactorialException!!!
- Si tiene un número de coma flotante en la parte superior de la pila y la siguiente operación es factorial, imprima
FloatingFactorialException!!!
- Si no hay números en la pila cuando el programa sale (es decir, el programa estaba vacío) imprimir
EmptyProgram!!!
Notas:
- Toda salida de error debe tener su error estándar o el equivalente más cercano.
- Todos los números están restringidos a coma flotante de 64 bits.
Programas de ejemplo:
50,47* -> 2350
50,47/ -> 0.94
100,8! -> 40320
100D* -> 10000
! -> StackUnderflowException!!!
5,2/! -> FloatingFactorialException!!!
4,3!2*/ -> 3
654,489,48,43/5*7D+-*% -> 77.68749999999909
-> EmptyProgram!!!
(Puedo agregar más si es necesario)
fuente
!
aF
).654,489,48,43/5*7D+-*%
Debería volver77.6875
. (43/48*5-(7+7)
debería ser(7+7)-43/48*5
)Respuestas:
Ruby,
412410404392380377 caracteresEsta es una versión de precisión regular usando
Float
. La precisión del resultado es como en el código de muestra, pero la detección numérica de desbordamiento no es exacta.Ejecución de muestra:
Ruby,
378377 caracteresEsta es una versión de alta precisión utilizando
Rational
. La precisión del resultado no siempre es la misma que en el código de muestra, pero la detección numérica de desbordamiento es exacta.Ejecución de muestra:
fuente
JavaScript (ES6), 430 bytes
422 bytes con ES7 cambiando
Math.pow(2,2)
a2**2
Explicación
Usos
eval
para reemplazar ciertas frases comunes. Sin golf y sin eleval
se ve así:fuente
Math.pow(p(),p())
conp()**p()
.Groovy, 718 bytes. ¡Delantero!
También podría publicar mi impl golf. Conoce mi gran muro de código:
Sin golf:
Edición 1: ahorre ~ 15 bytes gracias a @Doorknob
Edición 2: elimine ~ 130 bytes con algunos trucos más
fuente
for
/if
, etc.System.in.text
lugar deSystem.in.newReader().readLine()
..text
es codicioso y mientras los datos ingresen en el lector, no volverá.Caramelo ,
298348392 bytesAunque Candy está basado en la pila, no estoy seguro de que realmente haya ayudado ...
Formateado un poco revela un poco de estructura:
La matemática real ocurre en las últimas dos líneas. Lo conduce una mesa de salto en la tercera línea.
fuente