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
3
o12
ser 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 +
da5
5 6 +
da11
4 U
da16
12 16 +
28
11 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 10
y 430
en la pila. La pila se muestra de abajo hacia arriba al final del programa.
Las llamadas a funciones son
20 U
da400
400 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 10
no 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 U
separados 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]]
[[28, 11], [16, 12], [4], [6, 5]]
una salida válida para el primer ejemplo?M
?M
. Lo haré en el desafío de "pegar"Respuestas:
05AB1E , 20 bytes
Pruébalo en línea!
-4 gracias a Emigna (así como -8 gracias a él actualizándome sobre las reglas).
a
b
fuente
Bash , 43 bytes
Pruébalo en línea!
Esto imprime el portapapeles en el siguiente formato, tenga en cuenta el uso de \ x0F como separador.
La idea clave es pasar esto a dc, un lenguaje basado en pila, de modo que se impriman los elementos de pila necesarios.
La entrada se canaliza a sed donde
+
se reemplaza cada unordnFPrp+
, que en dc imprime el segundo número en la pila seguido de \ x0F y luego el número superior antes de realizar la suma. sed también reemplaza cadaU
conp2^
, imprime el elemento de la pila superior y cuadrázalo.El resultado de sed se evalúa como código dc, imprimiendo todo el portapapeles.
Como las líneas están en orden inverso, se usa
tac
(reversocat
) para arreglar eso.Y finalmente, sed recoge las primeras 4 líneas de tac.
fuente
Python 2 , 126 bytes
Pruébalo en línea!
fuente
Haskell ,
113109 bytesLa primera línea define una función anónima que toma una cadena, por ejemplo
"3 2 + 6 + 12 4 U + +"
, y devuelve una lista de listas de INT:[[11,28],[12,16],[4],[5,6]]
. Pruébalo en línea!fuente
Limpio , 140 bytes
Pruébalo en línea!
En el estilo clásico limpio, es la solución de Haskell, excepto aproximadamente un 50% más.
fuente
JavaScript (ES6), 107 bytes
Toma la entrada como una lista que consta de enteros
'+'
y'U'
. Devuelve otra lista que consta de enteros, matrices de 2 enteros y'_'
para ranuras vacías.Pruébalo en línea!
Comentado
fuente
Go,
305303295 bytesSe descartaron 8 bytes gracias a @ovs
Pruébalo en línea!
fuente
Octava , 206 bytes
Pruébalo en línea!
Si tan solo Octave tuviera una
pop
sintaxis.m
es el portapapeles de memoria,t
la pila.fuente
m
y,t
a la inversa, agregar elementos al frente en lugar del final?Python 3 ,
218204bytes-14 bytes gracias a los ovs
Pruébalo en línea!
fuente
Rojo ,
335330 bytesPruébalo en línea!
Más legible:
fuente
R ,
205182 bytesPruébalo en línea!
M
es el portapapeles de memoria,P
es el programa yS
es la pila.Técnicamente
S
se inicializa como un vector que contiene un solo cero, pero como nunca obtenemos una entrada no válida, me ahorra un byteS={}
.fuente
C (gcc) , 264 bytes
Utilicé la recursión para poder usar la pila de funciones como la pila de datos: se recorre la lista de entrada y se realizan las operaciones: los resultados se muestran en orden inverso, sin mostrar los empujes de la pila.
La pila se implementa como una lista vinculada. Así es como funciona:
Originalmente usé una estructura para los nodos, pero cambié a punteros desnudos para ahorrar espacio. Una característica interesante de esta lista vinculada es que se limpia cuando se completa la recursividad.
Pruébalo en línea!
fuente