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.