O objetivo desse desafio é coletar itens selecionados em uma lista e movê-los para um determinado local na lista.
Como um exemplo visual, pegue os valores de entrada (representados por números inteiros em caixa preta) e uma lista correspondente de valores de verdade onde true indica que o item está selecionado (representado por caixas azuis, onde T
é verdade e F
é falso):
O primeiro passo lógico é separar os itens marcados em verdade e não em suas listas correspondentes. Observe que a ordem relativa em cada lista deve ser mantida (ou seja, a ordem dos itens selecionados deve ser 1,4,5
e a ordem dos itens não selecionados 2,3,6,7
)!
A segunda etapa lógica recebe um índice na lista restante de itens não selecionados, insira todos os itens selecionados antes do item no índice especificado. Supondo que a indexação comece em 0, suponha que você queira inserir a seleção no índice 3. Isso corresponde ao local antes da 7
caixa, portanto, os itens selecionados devem ser inseridos antes do 7
.
A solução final é então 2,3,6,1,4,5,7
.
Observe que este diagrama lógico mostra uma maneira de fazer isso; seu programa não precisa executar as mesmas etapas lógicas, desde que a saída sempre produz o mesmo resultado observável.
Entrada
Seu programa recebe três entradas:
- Uma lista de números inteiros representando os itens. Esta pode ser uma lista vazia. Essa lista sempre será composta por números inteiros positivos únicos, não necessariamente na ordem de classificação (ou seja, 5 não estarão na lista duas vezes).
- Uma lista de valores de verdade / falsidade com o mesmo comprimento da lista de itens, em que um valor de verdade representa que o item no mesmo índice foi selecionado.
- Um número inteiro que representa onde inserir a seleção. Você pode escolher qual é o índice do primeiro item da lista, desde que seja constante em todas as execuções do seu programa (por exemplo, o primeiro item pode ser o índice 0 ou o índice 1). Especifique a que convenção seu programa adere. Este índice deve estar no intervalo
[starting_idx, ending_idx+1]
, ou seja, sempre será um índice válido. Para o índice de casoending_idx+1
, a seleção deve ser inserida no final da lista. Você pode supor que esse número inteiro caiba no tipo inteiro nativo do seu idioma.
A entrada pode vir de qualquer fonte desejada (stdio, parâmetro de função, etc.)
Resultado
A saída é uma lista que representa a sequência final de itens. Pode ser para qualquer fonte desejada (stdio, valor de retorno, parâmetro de saída da função, etc.). Você tem permissão para modificar qualquer uma das entradas no local (por exemplo, dada uma lista modificável como um parâmetro de função e ter sua função operando no local nessa lista).
Casos de teste
Todos os seguintes casos de teste assumem indexação baseada em 0. Eu usei 0 e 1 para indicar valores de falsidade / verdade respectivamente para a máscara de seleção.
Os casos de teste têm listas formatadas como [a,b,c]
, mas desde que suas listas de entrada representem uma sequência ordenada finita, tudo bem.
Entrada:
[]
[]
0
Resultado:
[]
Entrada:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
3
Resultado:
[2,3,6,1,4,5,7]
Entrada:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
0
Resultado:
[1,4,5,2,3,6,7]
Entrada:
[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
4
Resultado:
[2,3,6,7,1,4,5]
Entrada:
[1,2,3,4,5,6,7]
[1,1,1,1,1,1,1]
0
Resultado:
[1,2,3,4,5,6,7]
Entrada:
[1,2,3,4,5,6,7]
[0,0,0,0,0,0,0]
5
Resultado:
[1,2,3,4,5,6,7]
Entrada:
[1,3,2,5,4,6]
[1,0,0,1,1,0]
3
Resultado:
[3,2,6,1,5,4]
Pontuação
Isso é código de golfe; a resposta mais curta em bytes vence. As brechas padrão são proibidas. Você tem permissão para usar quaisquer embutidos desejados.