Desafio
Dado um número inteiro n ≥ 4 , imprima uma permutação dos números inteiros [0, n-1] com a propriedade de que não há dois números inteiros consecutivos próximos um do outro. O valor de uma permutação pi
é a soma de abs(pi[i] - i)
todos os índices i
.
Exemplos
(1, 3, 0, 2)
tem valor6
(0, 2, 4, 1, 3)
tem valor6
(0, 2, 4, 1, 3, 5)
tem valor6
(0, 2, 4, 1, 5, 3, 6)
tem valor8
Pontuação da sua resposta
A pontuação da sua resposta é a soma dos valores de suas permutações para n = 4 .. 14
mais o número de bytes que seu código leva. Quanto menor a pontuação, melhor. Seu código deve fornecer uma saída válida para todos esses valores de n
.
Você deve poder executar seu envio até a conclusão em sua máquina.
Em caso de empate, o tempo da última edição que resultou na pontuação relevante será a decisão.
Não é a mesma pergunta que esta ?
As respostas à pergunta vinculada não serão competitivas para essa questão, pois não fazem nenhum esforço para otimizar o valor de uma permutação. Por exemplo n=10
, para a permutação [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
dada pela maioria das respostas, dá um valor de 30
. Você pode fazer muito melhor que isso.
Para a parte de permutação da pergunta, o valor ótimo geral é no máximo 120
. (Obrigado a @Laikoni.) Enquanto a resposta de Dennis para a pergunta anterior tem 222 pontos . (Obrigado a @ user202729.)
fonte
[6,6,6,8,10,12,12,12,14,16,18]
para uma pontuação de 120. Curiosamente, esse padrão pode ser encontrado em A078706 .A078706
comn=17
, que pode ter uma pontuação de20
.Respostas:
Geléia ,
363433323130 bytes, resultado: 120Agradecimentos a Dennis por -1 byte! (implicitamente, corrigindo um bug do Jelly, embora o recurso seja posterior ao desafio)
Novo recurso: soma acumulada (
Ä
).Experimente online!
Use a indexação 1.
Também leva tempo linear.
Esse programa C ++ gera a menor permutação lexicograficamente, assumindo que | i - p i | ≤ largura (onde largura é uma constante codificada) para todos os 0 ≤ i <n , com complexidade de tempo de cerca de O (largura 2 × 2 2 × largura × n) (que é apenas O (n) para largura fixa ): Experimente on-line !
Quão?
Observe o padrão. Observamos que a sequência de todos os elementos, exceto os 4 últimos, é um prefixo de
Calcula a diferença incremental da sequência.
Observe o período 5.
A implementação do Jelly:
Para os 4 últimos elementos,
basta força bruta em todas as 24 possibilidades. O (1) .(nota: não uso mais força bruta em todas as 24 possibilidades da versão de 32 bytes)
fonte
0 2 4 1 3 5 8 6
e tem um fator de ramificação maior, mas não possui um padrão tão simples.CJam (60 bytes + 120 = 180 pontos)
Conjunto de testes on-line com pontuação integrada
Extensão até n = 24
Dissecação
fonte
Haskell , 146 + 89 pontos + bytes
Repete o padrão [1,3,0,2], os últimos
mod i 4
elementos são ajustados manualmente.Algoritmo anterior (132 + 116):
Bruteforça o número correto de saltos de comprimento ± 2 ou ± 3. Seleciona o último que possui os números corretos, parece funcionar muito bem e é muito mais barato que implementar a pontuação. Tio acaba o tempo antes da última pontuação, que é 18.
Experimente online!
fonte
Matemática5 pontos
(Copiar uma das minhas soluções do outro desafio teria me marcado 227)
Experimente ou use esta versão para verificar as pontuações. Ambas as versões podem começar a cagar em torno de 9.
Explicação
fonte
Ruby , 120 score +
112 106 9182 bytesExperimente online!
A sequência é basicamente
(a-2)+(a+2)%5
.Se n mod 5 não for 0 ou 1, os últimos 3 ou 4 elementos serão diferentes.
Isso ainda é meio codificado, sempre encontra a melhor solução, talvez possa ser um pouco mais jogado, mas fiquei sem ideias.
fonte
JavaScript (Node.js) , 148 pontuação +
10973 bytesExperimente online! Explicação:
l
acompanha o último número gerado em
acompanha o próximo número da paridade oposta al
; uma vezl
excedido,m+2
as variáveis são trocadas. Um ajuste é feito no início da sequência para que as seqüências cujos comprimentos não sejam múltiplos de 5 não percam nenhum número e outro ajuste é feiton=4
.fonte