Este desafío está relacionado con algunas de las características del lenguaje MATL, como parte del evento Idioma del mes de mayo de 2018 . Desafío asociado : Portapapeles de funciones: pegar .
Introducción
MATL tiene varios portapapeles , donde puede almacenar valores (copiar) para recuperarlos más tarde (pegar). Algunos portapapeles son automáticos , lo que significa que la copia se activa automáticamente por ciertos eventos. Este desafío se centra en uno de los portapapeles automáticos, llamado portapapeles de entrada de funciones , o simplemente portapapeles de funciones .
Este portapapeles almacena las entradas a las cuatro llamadas más recientes a las funciones normales de toma de entrada. Las funciones normales son el tipo más común de funciones en MATL. La toma de entrada significa que la función toma al menos una entrada (las funciones que no toman ninguna entrada no son consideradas por el portapapeles de la función).
Esto se explica mejor con los siguientes ejemplos, que utilizan dos funciones normales:
+, que saca dos números de la pila y empuja su suma.U, que muestra un número y empuja su cuadrado.
Ejemplo 1 :
3 2 + 6 + 12 4 U + +
produce el resultado 39. El código se interpreta de la siguiente manera:
- Números literales como
3o12ser empujado a la pila - Funciones como hacer
+estallar sus entradas y empujar sus salidas a la pila.
Las llamadas a funciones, en orden cronológico, son:
3 2 +da55 6 +da114 Uda1612 16 +2811 28 +da39.
El portapapeles se puede ver como una lista de cuatro listas. Cada lista interna contiene las entradas a una llamada de función, con las llamadas más recientes primero . Dentro de cada lista interna, las entradas están en su orden original .
Entonces, después de ejecutar el código, el contenido del portapapeles es (en notación Python):
[[11, 28], [12, 16], [4], [5, 6]]
Ejemplo 2 :
10 20 U 30 +
deja números 10y 430en la pila. La pila se muestra de abajo hacia arriba al final del programa.
Las llamadas a funciones son
20 Uda400400 30 +da430
Como solo ha habido dos llamadas a funciones, algunas de las listas internas que definen el portapapeles estarán vacías . Tenga en cuenta también cómo 10no se utiliza como entrada para ninguna función.
Por lo tanto, el contenido del portapapeles después de ejecutar el código es:
[[400, 30], [20], [], []]
Ejemplo 3 (inválido):
10 20 + +
se considera inválido, porque +falta una entrada para el segundo (en MATL esto provocaría implícitamente la entrada del usuario).
El reto
Entrada : una cadena S con literales numéricos +y Useparados por espacios.
Salida : el contenido del portapapeles función después de la evaluación de la cadena S .
Aclaraciones:
- Puede usar dos símbolos consistentes para representar esas funciones, que no sean dígitos. Además, puede usar cualquier símbolo consistente como separador, en lugar de espacio.
- Solo se considerarán las dos funciones indicadas.
- La cadena de entrada contendrá al menos un número literal y al menos una función.
- Todos los números serán enteros positivos, posiblemente con más de un dígito.
- Es posible que algunas funciones no utilicen algunos literales numéricos, como en el ejemplo 2.
- Se garantiza que la entrada será un código válido, sin requerir números adicionales. Entonces, una cadena como en el ejemplo 3 nunca ocurrirá.
- Se pueden omitir las listas internas vacías en la salida. Entonces el resultado en el ejemplo 2 puede ser
[[400, 30], [20]] - Cualquier formato de salida razonable e inequívoco es aceptable. Por ejemplo, una cadena con una coma como separador interior y punto y coma como separador exterior:
400,30;20;;.
Reglas adicionales:
La entrada y la salida se pueden tomar por cualquier medio razonable .
Se permiten programas o funciones, en cualquier lenguaje de programación . Las lagunas estándar están prohibidas .
El código más corto en bytes gana.
Casos de prueba
Input
Output
3 2 + 6 + 12 4 U + +
[[11, 28], [12, 16], [4], [5, 6]]
15 3 4 + 2 U 8 + U +
[[7, 144], [12], [4, 8], [2]]
3 6 9 12 + + 10 8 U 6
[[8], [6, 21], [9, 12], []]
8 41 12 25 4 5 33 7 9 10 + + + + + + + +
[[41, 105], [12, 93], [25, 68], [4, 64]]
10 1 1 + U U U U U
[[65536], [256], [16], [4]]
M?
M. Lo haré en el desafío de "pegar"
[[28, 11], [16, 12], [4], [6, 5]]una salida válida para el primer ejemplo?