Considere uma lista l
composta por números. Defina uma operação de bloco no índice i
da lista l
como o ato de mover 3 elementos consecutivos, começando de i
dentro l
para o final.
Exemplo:
l, i (1-indexing) -> l (after applying block operation at index i)
[1,2,3,4,5], 1 -> [4,5,1,2,3]
[1,2,3,4,5,6,7], 3 -> [1,2,6,7,3,4,5]
Dada uma lista composta por apenas 0 e 1, seu desafio é particioná-la para que os zeros fiquem na frente e os na parte de trás, usando apenas operações de bloco. A saída deve ser os índices na ordem em que são aplicados na lista.
Como isso é impossível para a lista [1,0,1,0]
, é garantido que o tamanho da lista seja pelo menos 5.
Casos de teste (indexação 1)
(existem outras saídas válidas)
[1,1,1,0,0] -> [1]
[0,1,0,1,0] -> [1,2,1,1]
[0,0,0,1,1,1,0,0,0] -> [4]
Use este script para gerar mais casos de teste. (apenas a entrada. A rplc ' ';','
parte é utilizada para R e PL um c e espaços com vírgulas na saída)
Critérios de vitória
O desafio do código é o principal critério de vencimento e o código mais rápido é o desempate. Em particular:
- A solução com o menor comprimento de saída (menor número de operações de bloco) com o caso de teste (
n_elem
= 500,random_seed
= {valor secreto}) vence. Você deve poder executar sua solução até a conclusão com o caso de teste (n_elem
= 500,random_seed
= 123456). - Em caso de empate, a solução que pode lidar com o maior valor de 2 em potência
n_elem
comrandom_seed
= {valor secreto} em 10 segundos (para mim) vence. - Em caso de empate, a solução que leva menos tempo nesse caso de teste vence.
fonte
Respostas:
Python 3 , (0,397 n + 3,58) etapas
Regressão polinomial de 1000 pontos por
numpy.polyfit
.Experimente online!
fonte
Python 3, ~ 179 etapas para n = 500 (em média)
Uma abordagem gananciosa heurística. Meio lento, mas ainda funciona. Utiliza um solucionador ideal para tamanhos pequenos.
fonte