El objetivo de este desafío es recopilar elementos seleccionados en una lista y moverlos a una determinada ubicación en la lista.
Como ejemplo visual, tome los valores de entrada (representados por enteros en recuadro negro) y una lista correspondiente de valores de verdad donde verdadero denota que el elemento está seleccionado (representado por cuadros azules, donde T
es verdad y F
es falso):
El primer paso lógico es separar los elementos marcados como verdaderos y no verdaderos en sus listas correspondientes. ¡Tenga en cuenta que debe mantenerse el orden relativo en cada lista (es decir, debe ser el orden de los elementos seleccionados 1,4,5
y el orden de los elementos no seleccionados 2,3,6,7
)!
El segundo paso lógico recibe un índice en la lista restante de elementos no seleccionados, inserte todos los elementos seleccionados antes del elemento en el índice dado. Suponiendo que la indexación comienza en 0, suponga que desea insertar la selección en el índice 3. Esto corresponde al punto antes del 7
cuadro, por lo que los elementos seleccionados deben insertarse antes del 7
.
La solución final es entonces 2,3,6,1,4,5,7
.
Tenga en cuenta que este diagrama lógico muestra una forma en que esto podría hacerse; su programa no necesita seguir los mismos pasos lógicos siempre que la salida siempre produzca el mismo resultado observable.
Entrada
Su programa tiene 3 entradas:
- Una lista de enteros que representan los elementos. Esta puede ser una lista vacía. Esta lista siempre constará de enteros positivos únicos, no necesariamente en orden ordenado (es decir, 5 no estará en la lista dos veces).
- Una lista de valores de verdad / falsedad con la misma longitud que la lista de elementos, donde un valor de verdad representa que el elemento en el mismo índice ha sido seleccionado.
- Un entero que representa dónde insertar la selección. Puede elegir cuál es el índice del primer elemento de la lista siempre que sea constante en cada ejecución de su programa (por ejemplo, el primer elemento podría ser el índice 0 o el índice 1). Especifique a qué convención se adhiere su programa. Este índice debe estar en el rango
[starting_idx, ending_idx+1]
, es decir, siempre será un índice válido. Para el índice de casosending_idx+1
, la selección debe insertarse al final de la lista. Puede suponer que este entero se ajustará al tipo de entero nativo de su idioma.
La entrada puede provenir de cualquier fuente deseada (stdio, parámetro de función, etc.)
Salida
La salida es una lista que representa la secuencia final de elementos. Esto puede ser a cualquier fuente deseada (stdio, valor de retorno, parámetro de salida de función, etc.). Se le permite modificar cualquiera de las entradas en el lugar (por ejemplo, dada una lista modificable como parámetro de función, y hacer que su función opere en el lugar en esa lista).
Casos de prueba
Todos los siguientes casos de prueba suponen una indexación basada en 0. He usado 0 y 1 para indicar valores de falsedad / verdad respectivamente para la máscara de selección.
Los casos de prueba tienen listas formateadas como [a,b,c]
, pero siempre que sus listas de entrada representen una secuencia ordenada finita que esté bien.
Entrada:
[]
[]
0
Salida:
[]
Entrada:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
3
Salida:
[2,3,6,1,4,5,7]
Entrada:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
0
Salida:
[1,4,5,2,3,6,7]
Entrada:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
4
Salida:
[2,3,6,7,1,4,5]
Entrada:
[1,2,3,4,5,6,7]
[1,1,1,1,1,1,1]
0
Salida:
[1,2,3,4,5,6,7]
Entrada:
[1,2,3,4,5,6,7]
[0,0,0,0,0,0,0]
5
Salida:
[1,2,3,4,5,6,7]
Entrada:
[1,3,2,5,4,6]
[1,0,0,1,1,0]
3
Salida:
[3,2,6,1,5,4]
Puntuación
Este es el código de golf; La respuesta más corta en bytes gana. Las lagunas estándar están prohibidas. Se le permite usar los complementos deseados.
Respuestas:
MATL, 9 bytes
Esta solución acepta una matriz de
T
(verdadero) yF
valores (falso) como la segunda entrada. También para el primer caso de prueba, con matrices vacías, no produce salida.Pruébalo en línea! y una versión ligeramente modificada para todos los casos de prueba.
Explicación
fuente
Mathematica,
6662 bytesGuardado 4 bytes de @MartinEnder .
Función anónima. Toma el índice basado en 1, la lista y los marcadores como entrada y devuelve la lista reordenada como salida.
fuente
Haskell, 70 bytes
Ejemplo de uso:
([1,2,3,4,5,6,7]#[True,False,False,True,True,False,False]) 3
->[2,3,6,1,4,5,7]
.Cómo funciona:
fuente
JavaScript (ES6), 76 bytes
fuente
Jalea , 10 bytes
Pruébalo en línea!
Cómo funciona
fuente
C #, 132 bytes
sin golf:
ideas de mejora apreciadas.
fuente
Python 3, 91 bytes
donde
a
está la lista de elementos / números,x
es laTrue/False
lista yi
es el índice.Versión multilínea para mejorar la legibilidad:
¿Como funciona?
La llamada a
zip(a,x)
los resultados en una lista de tuplas, donde cada uno de ellos contiene la información:(element,0|1)
. Luego, se utiliza una lista de comprensión para determinar los elementos que tienen un0/False
valor asociado y los almacena en la variableb
.Entonces
[c for c,z in zip(a,x)if z<1]
crea una lista que contiene todos los elementos que tienen un0
(False
valor ) asociado.Después de eso, la lista de elementos que tienen un
True|1
valor asociado (que se determina mediante la comprobación de qué elementos dea
no están presentes enb
:[c for c in a if(c in b)<1]
) se inserta en la lista con todos los elementos que tienen una0
(False
valor) asociado (listab
) en el índice especificadoi
y se devuelve la lista resultante.fuente
Python 3,
10693 bytesVersión antigua:
fuente