Fondo
¡Los programadores en estos días parecen no poder mantener sus buffers rectos! Una fuente común de error es intentar usar un índice de matriz que es demasiado grande para el búfer. Su tarea es implementar un búfer donde los índices grandes se reduzcan a un tamaño que el búfer pueda manejar. Como decido exactamente qué es lo mejor para todos, implementará este búfer según mis especificaciones precisas.
Visión general
Tiene un búfer de solo inserción que crece en tamaño a medida que se le agregan elementos. El tampón es cero indexados, y también indexados modulo su tamaño actual. La regla especial para este desafío es esta:
- Para insertar un elemento en el índice i medio para calcular j ,
j = i % buffer.length()
e insertar el nuevo elemento después de que el j-ésimo elemento de la lista.
El único caso especial es si el búfer está vacío, ya que el módulo aritmético cero no funciona. Por lo tanto, si el búfer está actualmente vacío, el nuevo elemento será el índice 0 .
Si el búfer tiene solo un elemento, siempre está insertando después del elemento 0 . Esta es solo una instancia del caso general.
Si el búfer contiene 6 elementos: [4, 9, 14, 8, 5, 2]
y se le indica que inserte un nuevo ítem 10
en el índice 15 , lo encuentra 15 % 6 == 3
y luego inserta el nuevo 10
después del 8
índice 3, lo que da un búfer resultante de [4, 9, 14, 8, 10, 5, 2]
Problema
Escriba una función o programa que tome una lista ordenada de enteros positivos e índices de enteros positivos en los que insertarlos.
Comience con un búfer vacío y agregue los enteros especificados al búfer en los índices correspondientes.
Salida de la lista ordenada de enteros que están en el búfer después de que se hayan realizado todas las inserciones especificadas.
Este es un desafío de código de golf, por lo que gana el código más corto.
Pautas de entrada
Puede tomar las listas de entrada como mejor le parezca. Ejemplos:
- Lista de pares:
[ [1,1], [2,4], [3,9], [4,16], [5,25]...]
- Lista de artículos y lista de índice:
[1, 2, 3, 4, 5...], [1, 4, 9, 16, 25]
- Aplanado:
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25 ...]
- etc.
Puede suponer que la entrada siempre contiene al menos un elemento y el índice correspondiente.
Casos de prueba
Caja de cuadrados desde arriba:
[(1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64)] -> [1, 2, 8, 7, 6, 5, 4, 3]
Los generé al azar:
[(11, 9), (13, 14)] -> [11, 13]
[(1, 18), (11, 7), (3, 35), (16, 22)] -> [1, 11, 16, 3]
[(3, 16), (16, 37), (0, 28), (18, 24)] -> [3, 18, 0, 16]
[(7, 26), (8, 20), (11, 39), (1, 23), (17, 27)] -> [7, 8, 11, 1, 17]
[(15, 35), (17, 7), (16, 15), (1, 13), (2, 6), (11, 34)] -> [15, 17, 1, 2, 16, 11]
[(2, 13), (1, 20), (16, 25), (8, 21), (5, 2), (16, 37), (3, 0)] -> [2, 3, 8, 1, 16, 5, 16]
[(6, 20), (15, 15), (12, 26), (10, 27), (17, 13), (7, 18), (4, 16)] -> [6, 10, 17, 12, 7, 4, 15]
[(18, 9), (5, 34), (15, 4), (12, 29), (2, 5), (7, 0), (7, 10), (16, 38)] -> [18, 7, 15, 2, 16, 5, 7, 12]
[(0, 12), (12, 0), (4, 16), (15, 12), (6, 28), (8, 10), (11, 24), (0, 25)] -> [0, 11, 8, 6, 15, 0, 4, 12]
[(6, 12), (14, 13), (10, 33), (11, 35), (1, 3), (0, 28), (15, 27), (8, 10), (1, 2)] -> [6, 14, 10, 1, 11, 8, 15, 0, 1]
[(2, 29), (19, 30), (18, 17), (13, 3), (0, 21), (19, 19), (11, 13), (12, 31), (3, 25)] -> [2, 13, 3, 11, 0, 12, 19, 18, 19]
Implementación de referencia de Python3
def f(inputs):
# `inputs` is a list of pairs
buff = []
for item, index in inputs:
if len(buff) == 0:
buff.insert(0, item)
else:
insert_after = index % len(buff)
buff.insert(insert_after+1, item)
return buff
Respuestas:
MATL ,
2422 bytesLa entrada es una matriz (con un
;
separador de fila) que contiene los valores en la primera fila y los índices en la segunda.La salida es una matriz de columnas, que se muestra como números separados por nuevas líneas.
Pruébalo en línea! O verifique todos los casos de prueba , con cada resultado mostrado en una sola línea.
Explicación
fuente
Perl, 37 bytes
35 bytes de código + 2 bytes para
-lp
banderas.Pruébalo en línea!
La implementación es bastante sencilla, se
splice
inserta en la matriz@F
en el índice1+<>%(@F||1)
(tenga en cuenta que@F||1
maneja el caso de que la matriz esté vacía).Solo unas pocas palabras sobre las llaves (aparentemente) inigualables
}{
(porque tenía un comentario al respecto, y creo que es bastante extraño para las personas que no conocen a Perl), y es un truco bastante común en los juegos de golf de Perl: la-p
bandera rodea el código con (aproximadamente)while(<>){ CODE } continue { print }
, (elcontinue
se ejecuta después de cada iteración). Entonces, con esos incomparables}{
, cambio mi código awhile(<>) { CODE}{ } continue { print }
. Por lo tanto, crea un bloque vacío justo después de mi código (pero eso no es un problema), ycontinue
se ejecuta solo una vez, después dewhile
(es decir, cuando se ha leído toda la entrada).fuente
}{
me está volviendo loco ...}{
me recuerda a esta ilusiónES6 (Javascript),
58,57,5350 bytesGolfed
Toma una matriz de pares índice-valor, como entrada.
EDICIONES
&&
para devolver el valor, -1 byte|0
(ya que aparentemente el empalme puede manejar NaN bien), -2 bytesb=[]
un segundo "argumento" para map () , -2 bytes (Thx @ETHproductions!)Prueba
fuente
a=>a.map(e=>...,b=[])&&b
e=>
a(e,i)=>
y utilizari
en lugar deb.length
Haskell ,
7069 bytesPruébalo en línea! Uso:
foldl(!)[] [(1,5),(2,4),(3,7)]
. ¡Guardado un byte gracias a @nimi!Explicación:
Solución sin calcular el módulo: (90 bytes)
Pruébalo en línea!
fuente
j<-1+i`mod`length b
Guarda un byte.Python 2 ,
64625856 bytes¡Gracias a @xnor por jugar 2 bytes!
Pruébalo en línea!
fuente
(len(x)or 1)
lugar de inicializar la longitud?len(x or[0])
y-~len(x[1:])
corbata.Python 2 ,
6260 bytesToma la entrada como una lista de pares, imprime el resultado. Editar: Outgolfed por Dennis
Pruébalo en línea!
Esto es bastante simple: recorra la entrada, inserte los elementos en el lugar correcto y luego imprima el resultado. Decidir en qué índice insertar se realiza
1+y%(len(b)or 1)
. Esta es la forma estándar de hacer indexación modular, con elor 1
manejo del caso límite de una lista vacía.fuente
JavaScript (ES6), 60 bytes
Fragmento de prueba
Mostrar fragmento de código
fuente
V ,
384035 bytesEsta respuesta dobla la definición de lista, y normalmente no es un lenguaje que usaría para la manipulación de listas, pero quería usar el
[count]/{regex}
que agregué recientemente a V. La entrada se toma como[index] [num] [index] [num] ...
y se devuelve como[num] [num] [num]
.Pruébalo en línea!
Hexdump para 2 personajes ocultos:
Explicación
El código hasta
dG@"
formatea todos los\d+ \d+
pares para que una lista 1 2 3 4 5 6 termine comoy luego
dG@"
ejecuta todo eso como código V como el siguiente:fuente
PHP,
7292 bytestoma la entrada aplanada de los argumentos de la línea de comandos. Corre con
-nr
.fuente
Fatal error: Uncaught DivisionByZeroError: Modulo by zero
, lo arreglé, luego lo intenté1 1 1 2 1 3
y obtuve[1=>null]
como salida en lugar de[1,3,2]
j+1
lugar de insertar despuésj
, ¿no?18 1 7 11 35 3 22 16
=> en[1,11,16]
lugar de[1,11,16,3]
insert
palabra clave. Gracias; fijo.Java 7,
125124 bytesAcepta una lista plana de valores seguida de índices. Para el caso de prueba de cuadrados, la entrada sería
new int[] {1, 2, 3, 4, 5, 6, 7, 8, 1, 4, 9, 16, 25, 36, 49, 64}
Pruébalo en línea!
fuente
Mathematica, 62 bytes
La función pura con el primer argumento se
#
espera que sea una lista de pares. Comenzando con la lista vacía{}
, dejóFold
la lista de entrada#
con la siguiente función:fuente
Perl 6 , 51 bytes
Toma la entrada aplanada.
fuente
Clojure, 87 bytes
fuente