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.
Respostas:
MATL, 9 bytes
Esta solução aceita uma matriz de valores
T
(true) eF
(false) como a segunda entrada. Também para o primeiro caso de teste, com matrizes vazias, ele não produz saída.Experimente Online! e uma versão ligeiramente modificada para todos os casos de teste.
Explicação
fonte
Mathematica,
6662 bytesSalvo 4 bytes de @MartinEnder .
Função anônima. Pega o índice baseado em 1, a lista e os marcadores como entrada e retorna a lista reordenada como saída.
fonte
Haskell, 70 bytes
Exemplo de uso:
([1,2,3,4,5,6,7]#[True,False,False,True,True,False,False]) 3
->[2,3,6,1,4,5,7]
.Como funciona:
fonte
JavaScript (ES6), 76 bytes
fonte
Gelatina , 10 bytes
Experimente online!
Como funciona
fonte
C #, 132 bytes
ungolfed:
idéias de melhoria apreciadas.
fonte
Python 3, 91 bytes
Onde
a
está a lista de elementos / números,x
é aTrue/False
lista ei
é o índice.Versão multilinha para melhor legibilidade:
Como funciona?
A chamada para
zip(a,x)
os resultados em uma lista de tuplas em que cada um deles contém a informação:(element,0|1)
. Em seguida, uma compreensão da lista é usada para determinar os elementos que têm um0/False
valor associado e os armazena na variávelb
.Portanto,
[c for c,z in zip(a,x)if z<1]
cria uma lista que contém todos os elementos que têm um valor0
(False
) associado.Depois disso, a lista de elementos que têm um
True|1
valor associado (o qual é determinado pela verificação de que os elementos dea
não estão presentes emb
:[c for c in a if(c in b)<1]
) é inserido na lista com todos os elementos que têm um0
(False
valor) associado (listab
) no índice especificadoi
e a lista resultante é retornada.fonte
Python 3,
10693 bytesVersão antiga:
fonte