Objetivo
Gere a lista codificada original, a partir dos movimentos que uma Classificação de inserção faria para classificá-la. A lista original terá todos os números de 0
até N-1
(inclusive) onde N
está o tamanho da entrada.
Entrada
Uma lista contendo as movimentações necessárias para classificar a lista. Cada valor representa a quantidade de slots deslocados pelo número original (codificado) para estar na posição correta, lembre-se de que esse processo é da esquerda para a direita.
O valor na posição (indexada 0) i
na lista de entrada estará entre 0
e i
inclusive.
Você não precisa lidar com entradas inválidas; nesse caso, qualquer comportamento é aceitável (falha, loop infinito, etc.).
Resultado
A lista embaralhada
Passo a passo para gerar os movimentos
Scrambled List | Moves to sort
[4,0,2,1,3,5] | [0, , , , , ] #4 stay in place
[4,0,2,1,3,5] | [0,1, , , , ] #0 is moved 1 slot to the left
[0,4,2,1,3,5] | [0,1,1, , , ] #2 is moved 1 slot
[0,2,4,1,3,5] | [0,1,1,2, , ] #1 is moved 2 slot
[0,1,2,4,3,5] | [0,1,1,2,1, ] #3 is moved 1 slot
[0,1,2,3,4,5] | [0,1,1,2,1,0] #5 is in the right place already
[0,1,2,3,4,5]
Portanto, para a entrada que [0,1,1,2,1,0]
seu programa precisa produzir [4,0,2,1,3,5]
.
Lembre-se de que os movimentos não estão na posição na lista classificada (final), mas no segmento classificado (a seção em negrito)
Casos de teste
[0,0,0] -> [0,1,2]
[0,1,0,1] -> [1,0,3,2]
[0,0,0,0,0,5] -> [1,2,3,4,5,0]
[0,1,2,3] -> [3,2,1,0]
[0,1,1,1] -> [3,0,1,2]
[0,1,1,2,1,0] -> [4,0,2,1,3,5]
Ganhando
Isso é código-golfe , então a resposta mais curta vence.
fonte
Respostas:
Gelatina , 12 bytes
Experimente online!
Explicação
Podemos basicamente ver as duas listas (a entrada e a saída) como codificando um número inteiro; a entrada codifica um número inteiro na base fatorial e a saída codifica um número inteiro como uma permutação. Felizmente, o Jelly tem embutidos que já estão muito próximos dessas duas codificações, portanto, basta escrever pequenos pedaços de código para converter em um número inteiro e depois voltar para a outra codificação.
No caso do fatorial de base, podemos observar que o primeiro elemento da lista deve ser 0, o segundo pode ser 0 ou 1, o terceiro deve ser 0/1/2 e assim por diante. Portanto, temos que reverter a entrada para obter seus elementos na ordem de escrita normal para conversão de base.
Além disso, para que as ordens relativas da conversão fatorial e da conversão de permutação correspondam à operação usada pela classificação por inserção, precisamos fazer dois ajustes: reverter a sequência das permutações e reverter a ordem da lista de saída. Inverter a lista de saída é bastante fácil, necessitando apenas de um
U
no final do programa. Para reverter a sequência de permutações, subtraímos o fatorial do comprimento de entrada (isso funciona porque o fatorial base produz um número no intervalo de 0 a (comprimento! -1), enquanto as permutações são numeradas pela geléia de 1 a comprimento! , produzindo um off-by-one implícito que cancela o off-one que você normalmente obtém ao subtrair um índice de permutação de um fatorial).Jelly , 9 bytes, em colaboração com @JonathanAllan
Esta versão do programa é muito semelhante, mas usa um método diferente de reverter a sequência de permutações; simplesmente negar a entrada com
N
é suficiente paraœ?
tratar a ordem ao contrário. Além disso, funciona de forma idêntica ao programa anterior.Experimente online!
fonte
Æ¡
eœ?
trabalhariam para isso (eu já havia começado a tentar usá-los para esse desafio mais cedo - eu estava tão perto, só precisava doL!
lá).UÆ¡Nœ?L’U
porque eu implementeiœ?
(e similares) para agir de forma modular (como se eles estivessem usando listas de geléia). ON
justo indexa com o valor negativo. Nota: Eu mudeiJ
paraL
- isso ocorre porque, dado um número, ele faz um intervalo oculto).Mathematica, 92 bytes
Função pura, recebendo uma lista de números inteiros não negativos como entrada e retornando uma lista de números inteiros não negativos. O código acima contém a
©
, que está incorreto: é um espaço reservado para o símbolo de 3 bytes U + F3DE, que o Mathematica representa por um círculo com um ponto e representa a composição das permutações.c=Cycles@{#}&
define uma função que converte uma lista de números inteiros em umCycles
objeto que representa uma permutação; por exemplo,c[{3,4}]
são os elementos de troca de transposição 3 e 4 de uma lista.c[i-0~Range~#[[i]]]~Table~{i,l,1,-1}]
pega a lista de entrada e gera as permutações necessárias para desfazer a classificação de inserção. Em seguida,c@{}©##&@@
compõe todas essas permutações juntas, começando pela permutação de identidadec@{}
. Por fim,Permute[Range[l=Length@#]-1,...]
aplica essa permutação à lista indexada em 0 de comprimento apropriado.fonte
@{#}&)@{}©##&@@
Parece assustador.Python 2,
7968 bytesAgradecimentos a Krazor por salvar 10 bytes
Obrigado a TuukkaX por economizar 1 byte
Funciona gerando os movimentos em sentido inverso
fonte
a=input();b=range(len(a));print[b.pop(j-a[j]) for j in b[::-1]][::-1]
. Lista compreensões ftw!for
, por isso verifique que 65 eu acho: DJavaScript (ES6),
696563 bytesIrritantemente, tanto a entrada quanto a saída estão na ordem errada. Editar: salvou 4 bytes graças a @Arnauld. Economizou 2 bytes graças a @ETHproductions.
fonte
i
, não é?i
...o=>+b.splice(~o,1)
JavaScript (ES6),
7371 bytesEconomizou 2 bytes graças a ETHproductions
Casos de teste
Mostrar snippet de código
fonte
a=m.map(_=>j++,j=0)
, mas esse é o mesmo comprimento e tenho certeza que você já tentou.j
aa.length
vez dea.length-1
e exigiriaa.splice(--j,0,a.splice(j-m[j],1)[0])
)+a.splice(j-m[j--],1)
Haskell , 85 bytes
Experimente online! Exemplo de uso:
f [0,1,1,2,1,0]
rendimentos[4,0,2,1,3,5]
.f x
chama a função#
com a listax
invertida e uma lista[length x - 1, length x - 2, ... , 0]
.(n:r)#l
executa a classificação de inserção reversa retirando recursivamente on
th elementol
, em quel!!n
produz on
th elemento etake n l++drop(n+1)l
a listal
com on
th elemento removido.fonte
perl, 61 bytes
A saída termina na matriz @o. Exemplo com matriz de entrada como argumentos de linha de comando:
fonte
Ruby, 49 bytes
Executa a "inserção reversa" no lugar dentro da lista, começando com o maior número.
fonte