Os números da espingarda são uma sequência com uma definição bastante simples, mas com alguma estrutura interessante. Comece com os números naturais:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
Agora pegue todos os números nos índices divisíveis por 2 , agrupe-os em pares e troque os números em cada par:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
^ ^ ^ ^ ^ ^ ^
<---> <---> <-----> <----
1, 4, 3, 2, 5, 8, 7, 6, 9, 12, 11, 10, 13, 16, ...
Agora faça o mesmo com índices divisíveis por 3 :
1, 4, 3, 2, 5, 8, 7, 6, 9, 12, 11, 10, 13, 16, ...
^ ^ ^ ^
<------> <--------->
1, 4, 8, 2, 5, 3, 7, 6, 10, 12, 11, 9, 13, 16, ...
E depois para 4 , 5 , 6 e assim por diante:
1, 4, 8, 2, 5, 3, 7, 6, 10, 12, 11, 9, 13, 16, ...
1, 4, 8, 6, 5, 3, 7, 2, 10, 12, 11, 14, 13, 16, ...
1, 4, 8, 6, 12, 3, 7, 2, 10, 5, 11, 14, 13, 16, ...
1, 4, 8, 6, 12, 14, 7, 2, 10, 5, 11, 3, 13, 16, ...
...
Após k tais etapas, os primeiros números k + 1 serão corrigidos. Assim, podemos definir a sequência infinita de números de espingarda como o limite de deixar k ir ao infinito. Os primeiros 66 números são:
1, 4, 8, 6, 12, 14, 16, 9, 18, 20, 24, 26, 28, 22, 39, 15, 36, 35, 40, 38, 57, 34, 48, 49, 51, 44,
46, 33, 60, 77, 64, 32, 75, 56, 81, 68, 76, 58, 100, 55, 84, 111, 88, 62, 125, 70, 96, 91, 98, 95,
134, 72, 108, 82, 141, 80, 140, 92, 120, 156, 124, 94, 121, 52, 152, 145, ...
Curiosidade: apesar de ter sido obtida permutando apenas os números naturais, essa sequência não contém números primos.
O desafio
Dado um número inteiro n > 0
, encontre o n
número da espingarda. Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e retornar a saída ou imprimi-la em STDOUT (ou alternativa mais próxima).
Isso é código de golfe, então a submissão mais curta (em bytes) vence.
Classificação
Isso está recebendo mais respostas do que eu pensava, além de várias pessoas competindo no mesmo idioma. Então, aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
10
, 21
, 25
e 30
não aparecem tanto, por exemplo.
k
th iteração, o k
th elemento na matriz é transposto para a 2k
th posição, e não será tocado novamente até a 2k
th iteração, momento em que é transposto para a 4k
th posição, ad infinitum. Um primo não é transposto até a sua vez, por assim dizer, para que todos os primos sejam embaralhados para a frente. Mas podemos facilmente fazer uma lista das vítimas inocentes simplesmente imprimindo o primeiro elemento a ser transposto na iteração 2 e cada iteração ímpar. A lista é: 2, 3, 5, 7, 10, 11, 13, 21, 17, 19, 30, 23, 27, 25, 29, 31, 45, 42, 37, 54, 41, 43, 65, ...