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 . Reto asociado: Portapapeles de funciones: copia .
Introducción
El portapapeles de funciones de MATL almacena ("copia") 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. El contenido del portapapeles almacenado se puede insertar en la pila ("pegar").
Este desafío tomará el contenido del portapapeles como entrada. Se supondrá que todas las funciones que han producido ese estado del portapapeles tomaron uno o más enteros positivos como entradas. Por lo tanto, el estado del portapapeles se puede representar mediante una lista de listas de números. (Para obtener más información sobre cómo se llena el portapapeles, consulte el desafío relacionado; pero eso no es necesario para el actual).
Interpretando el contenido del portapapeles
Ejemplo 1
La primera lista interna se refiere a la llamada de función más reciente , y así sucesivamente, por lo tanto, el estado del portapapeles
[[11, 28], [12, 16], [4], [5, 6]]
indica que la última llamada a la función se llevó dos entradas, es decir 11
, 28
; la penúltima llamada tomó entradas 12
, 16
; etc. (Este estado del portapapeles es producido por el código en el primer ejemplo del desafío relacionado).
Ejemplo 2
Si no ha habido suficientes llamadas a funciones , algunas listas internas finales en el portapapeles estarán vacías:
[[7, 5], [], [], []]
(Esto es producido por un programa que simplemente agrega 7
y 5
).
Ejemplo 3
Las llamadas a funciones pueden tener cualquier cantidad de entradas , pero siempre al menos 1
(las funciones que no toman entradas no cambian el estado del portapapeles). Entonces lo siguiente también es posible.
[[3], [2, 40, 34], [7, 8, 15], []]
Accediendo al contenido del portapapeles
El contenido del portapapeles de funciones se inserta en la pila utilizando la función de MATL M
(que, por cierto, no es una función normal, sino una función de portapapeles). Esta función toma un entero positivo como entrada y empuja algunos de los contenidos del portapapeles a la pila, de la siguiente manera. Con referencia al estado del portapapeles en el ejemplo 1:
[[11, 28], [12, 16], [4], [5, 6]]
1M
devuelve todas las entradas a la llamada de función más reciente. Así, para el ejemplo considerado, da11
,28
.- Del mismo modo,
2M
,3M
y4M
devolver todas las entradas a la segunda, tercera y cuarta llamadas a funciones más recientes. Así2M
da12
,16
;3M
da4
; y4M
da5
,6
. - Números más allá de las entradas individuales
4
seleccionadas para llamadas de función que tomaron más de una entrada. Por lo tanto, devuelve la última entrada a la llamada más reciente . En nuestro caso esto da . devuelve la entrada individual anterior , que es . devuelve la última entrada de la penúltima llamada, es decir , y da . Ahora da . Observe cómo se omite la entrada porque era la única entrada en su llamada a la función. Por último, da .5M
28
6M
11
7M
16
8M
12
9M
6
4
10M
5
Para el estado del portapapeles en el ejemplo 3:
[[3], [2, 40, 34], [7, 8, 15], []]
1M
da3
.2M
da2
,40
,34
.3M
da7
,8
,15
.4M
tiene un comportamiento indefinido (para los propósitos de este desafío), porque solo ha habido tres llamadas a funciones.5M
da34
.6M
da40
.7M
da2
.8M
da15
.9M
da8
,10M
da7
.11M
,12M
... también tienen un comportamiento indefinido .
El reto
Entrada :
- el estado del portapapeles, como una lista de listas, o cualquier otro formato razonable;
- un entero positivo n .
Salida : el resultado de llamar a la función M
con n como entrada. La salida será uno o varios números con un separador inequívoco, o en cualquier formato razonable, como una lista o matriz.
Aclaraciones:
- El estado del portapapeles consta de cuatro listas de números. Algunas de las listas finales pueden estar vacías, como en los ejemplos 2 y 3. Si lo prefiere, puede ingresar el portapapeles sin esas listas vacías finales. Entonces el ejemplo 3 se convertiría
[[3], [2, 40, 34], [7, 8, 15]]
. - Todos los números en el portapapeles serán enteros positivos, posiblemente con más de un dígito.
- Se garantiza que el número n es válido. Entonces, por ejemplo, 3 arriba,
n
no puede ser4
o11
.
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
Clipboard state
Number
Output(s)
[[11, 28], [12, 16], [4], []]
2
12, 16
[[11, 28], [12, 16], [4], []]
5
28
[[7, 144], [12], [4, 8], [3, 4, 6]]
1
7, 144
[[7, 144], [12], [4, 8], [3, 4, 6]]
10
4
[[30], [40], [50, 60], [70, 80, 90]]
2
40
[[30], [40], [50, 60], [80, 90]]
7
90
[[15], [30], [2, 3, 5], [4, 5, 10]]
3
2, 3, 5
[[15], [30], [2, 3, 5], [4, 5, 10]]
7
2
fuente
Respuestas:
Jalea , 8 bytes
Pruébalo en línea!
fuente
ḊƇ
selecciona todos los no singletons,U
invierte yẎ
aplana. Para la entrada[[11, 28], [12, 16], [4], []]
esto se obtiene[16, 12, 28, 11]
, los valores de5M
through8M
. Ahora anteponga la entrada original a esta lista⁸;
e indexe en la lista resultante por la otra entrada⁹ị
.U
no revierte el resultadoḊƇ
, sino cada uno de sus elementos. Solo si de alguna manera pudiera reducirḊƇUẎ⁸;
...Haskell ,
56 5147 bytes-5-9 bytes gracias a Laikoni (coincidencia de patrón para asegurarse de longitud> 1 y usandodo
-notation sobre lista por comprensión)!Pruébalo en línea!
Punto libre,
5855 bytes-3 bytes gracias a Laikoni (moviendo
([]:)
y reemplazandoid
)!Alternativamente, podríamos usar esta versión sin puntos
(!!).(([]:)<>map pure.(>>=reverse).filter((1<).length))
.fuente
APL (Dyalog Unicode) , 17 bytes
Pruébalo en línea!
fuente
JavaScript (Node.js) , 57 bytes
Pruébalo en línea!
Esta es una función anónima, curry. Ejecútalo con
( function code )(clipboard)(n)
Explicación
fuente
JavaScript (ES6), 72 bytes
Toma entrada en la sintaxis de curry
(clipboard)(n)
.Pruébalo en línea!
fuente
Python 2 ,
6056 bytesgracias a Jonathan Allan por -4 bytes.
Pruébalo en línea!
fuente
Java 8, 110 bytes
Una lambda (curry) que toma el estado del portapapeles como
int[][]
y el número comoint
y regresaint
oint[]
(puede devolverse un solo número a través de cualquier tipo).Pruébalo en línea
Sin golf
fuente
05AB1E , 12 bytes
Pruébalo en línea!
Explicación
fuente
Casco , 12 bytes
Pruébalo en línea!
Explicación
Más o menos un puerto directo de la respuesta de Haskell:
fuente
R , 58 bytes
Pruébalo en línea!
Toma
M
como unlist
de vectoresc()
; entonces, reemplazar[[
conlist(
,[
conc(
y]
con)
debería transformar los casos de prueba en casos de prueba R.Para las entradas
n<=4
con "comportamiento indefinido", devolucionesNULL
y para otras entradas no válidas, arroja un error "subíndice fuera de los límites".fuente
[n]
lugar de[[n]]
.Stax ,
121413 bytesEjecutar y depurarlo
Explicación:
Stax, 12 bytes
Desempaquetado:
Este es un bloque, así que puedo deshacerme de él
]|u
, pero no sé si esto es válido ya que está empacando un bloque.fuente
J ,
3322 bytes-11 bytes (1/3 más corto) gracias a la solución de FrownyFrog!
Pruébalo en línea!
Mi solución inicial:
J , 33 bytes
No estoy contento: estoy bastante seguro de que se puede jugar mucho más.
Explicación:
Una función diádica, tomando el estado del portapapeles como su argumento correcto, el argumento izquierdo es
n
<:@[
reste 1 del argumento izquierdo{
selecciona eli
elemento th (calculado arriba) de la lista a su derecha(...)
la lista completa#
Copiar]
de la lista de estado del portapapeles(1<#)
las sublistas con longitud mayor que 1|.&.>
rotar cada sublista copiada<"0@;
raze and box - pone cada número en una caja separada,
agregar la nueva lista a la lista del estado del portapapeles@]
hace que todo el verbo en (...) sea monádicoPruébalo en línea!
fuente
0;
más. ¡Gracias!V + coreutils ,
53 45 43 4240 bytes-9 bytes gracias a DJMcMayhem (usando
VGÇ /d
una:,$g/^[^ ]*$/d
,D@"dd
una"aDÀdd
y!!
otra vez:.!
)!Mi primer intento en V (¡consejos bienvenidos!), El siguiente código está usando caracteres dentro de un círculo (por ejemplo,
ⓞ
for\xf
) para facilitar la lectura:Pruébalo en línea!
Hexdump
Explicación
La primera línea contiene n y las líneas siguientes contienen las entradas del portapapeles, cada entrada está separada por espacios si hubiera entradas múltiples:
fuente
Rojo , 91 bytes
Pruébalo en línea!
fuente
C (gcc) , 176 bytes
Pruébalo en línea!
Toma la matriz como una lista de 4 pares de punteros de inicio / fin, luego n.
Descripción:
fuente