História:
Lucy perguntou a George qual era o seu número da sorte. Após alguma contemplação, George respondeu que tinha vários números da sorte. Após uma breve confusão, Lucy perguntou a George quais n
eram seus primeiros números da sorte. George então pediu a você, seu amigo, que escrevesse um programa para ele fazer o trabalho.
O desafio:
Você escreverá um programa / função que receberá do argumento de entrada / função padrão uma string ou um número inteiro n
. O programa / função retornará / produzirá os primeiros n
números da sorte . Os números da sorte são definidos através de uma peneira da seguinte forma.
Comece com os números inteiros positivos:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, ...
Agora remova cada segundo número:
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, ...
O segundo número restante é 3 , então remova todos os terceiros números:
1, 3, 7, 9, 13, 15, 19, 21, 25, ...
Agora, o próximo número restante é 7 , então remova todo sétimo número:
1, 3, 7, 9, 13, 15, 21, 25, ...
Em seguida, remova todos os nonos números e assim por diante. A sequência resultante são os números da sorte.
Ganhando:
Como de costume no codegolf, o menor número de bytes vence.
Como de costume, as submissões usando brechas padrão são desqualificadas.
fonte
Respostas:
Python 2, 79
A mágica de iterar sobre uma lista enquanto o loop a modifica!
A lista
L
começa com todos os números inteiros1
para um valor suficientemente alto. O código itera sobre cada elementor
deL
, obtendo a sub-lista de todosr
os elementos enésimo e removendo cada um desses valores. Como resultado, os valores removidos não são repetidos. No final, imprima os primeirosn
elementos.A expressão
map(A.remove,B)
é um truque que estou esperando há muito tempo para usar. Ele chamaA.remove
cada elemento deB
, o que faz com que todos os elementosB
sejam removidosA
. Efetivamente, leva a diferença da lista, embora exijaB
uma sub-lista deA
. Requer o Python 2, já que o Python 3 não avaliaria o mapa.O primeiro loop precisa ser especial para converter
r
de1
para2
, comor+=r<2
.O limite superior suficientemente alto de
2**n
torna o programa muito lento para valores grandes den
. Usarn*n+1
basta, mas custa um personagem. Observe quen*n
não funcionan=1
.fonte
n**2
números, não2**n
map
você tem lá. Eu queria saber se havia uma maneira melhor ...n**2+1
menos que o cason=1
possa ser perdoado.map(A.index,B)
para encontrar os índices dos elementos de B em A,map(A.count,B)
para encontrar o número dos elementos de B em A,map(A.extend,B)
para adicionar uma lista B achatada a A. A mente confunde.Haskell,
7169 bytesDefine uma função
f
. A expressão é1:s[3,5..]3
avaliada para a lista infinita de números da sorte ef
simplesmente pega o primeiron
delestake n
.Eu poderia raspar 5 bytes da peneira usando uma compreensão de lista paralela
mas isso exigiria passar o sinalizador do compilador
-XParallelListComp
para o GHC para ativar a extensão.Explicação da peneira
A ideia básica é que
s(n:k)p
produza o(p-1)
número da sorten
, diminua cadan
número da cauda infinitak
(compensado porp
para contabilizar os números produzidos anteriormente) e retorne a essa lista com acumulador(p+1)
. Emf
, inicializamos o processo com os números ímpares começando de3
e aderindo1
à frente, obtendo exatamente os números da sorte.fonte
Python 2,
71 6967No começo, eu pensei que isso seria um grande desafio para o fatiamento de array do Python. No entanto, encontrei um obstáculo quando descobri que fatias com uma etapa diferente de 1 só podem ter outra fatia de comprimento idêntico atribuída a elas. Mas, depois de pesquisar no "python remove slice", minha fé foi restaurada: encontrei uma
del
declaração descolada que faz o truque perfeitamente.Versão antiga
-2 bytes graças ao Sp3000.
fonte
> <> ,
121114111 bytesEu tenho apenas algumas palavras para dizer ...
... "Argh, meu cérebro dói."
Explicação
> <> é uma linguagem de programação esotérica 2D e definitivamente não é adequada para esta tarefa, devido à falta de matrizes. De fato, o único tipo de dado em> <> é uma estranha mistura de int / float / char, e tudo acontece em uma pilha de pilhas.
Aqui está o resumo:
Aqui está um exemplo simulado que demonstra aproximadamente como a
k
peneira funciona (eis o número da sorte com o qual peneiramos):fonte
nao
aparentemente pode ser interpretado como "imprima essa coisa agora".CJam - 25
Experimente online
Explicação:
Essa implementação não remove números sucessivamente de uma matriz, mas calcula cada número com base em quantos teriam sido removidos antes dela.
Para cada índice i (de 0 a n-1) e cada número da sorte anterior l, em ordem inversa, incrementamos i em i / (l-1), exceto por l = 1, usamos 1 em vez de 0 e também adicionamos 1 no final.
Por exemplo, para i = 4, temos os 4 primeiros números, [1 3 7 9] e calculamos:
4 + 4 / (9-1) = 4
4 + 4 / (7-1) = 4
4 + 4 / (3 -1) = 6
6 + 6/1 = 12
12 + 1 = 13
fonte
Pitão:
2322 bytesExperimente online: Pyth Compiler / Executor
Explicação:
A redução realmente calcula mais do que
Q
números da sorte (o comando remove é chamado Q + 1 vezes, Q-1 deve ser suficiente).fonte
R, 58 bytes
Com quebras de linha:
Versão anterior, 62 bytes
Versão anterior, 78 bytes
fonte
n=as.numeric(readline())
parafunction(n){...}
. Isso cria um objeto de função que pode ser atribuído e chamado. Solte as chaves nofor
laço.n=scan(n=1)
?CJam,
3230 bytesRecebe entrada de STDIN.
Explicação do código :
Experimente online aqui
fonte
Python 2,
105101 bytesApenas uma implementação direta.
Pitão,
39363532 bytesSemelhante à abordagem acima, mas as coisas são indexadas em 0 e não em 1. Experimente online .
Agradecemos a @Jakube por apontar uma economia de bytes.
fonte
Mathematica, 80 bytes
Implementação direta da definição. Como algumas outras respostas, começa com um intervalo de
1
até e continua a filtrar.n2
fonte
Perl,
86817886:
UPDATE: obviamente,
grep{...}
é melhor quemap{...?$_:()}
81:UPDATE: OK, na verdade é uma linha agora. Eu posso parar. (?) 78:
fonte
Oitava,
1398372Ungolfed:
fonte
J,
6052 bytesExplicação (da direita para a esquerda):
2,1+2*i.@*:@>:
parece muito longo, mas só posso reduzi-lo em 1 byte, fazendo*:
com!
que a lista cresça exponencialmente.fonte
JavaScript (ES6) 96
99Editar Contagem regressiva no primeiro loop - obrigado @DocMax
Ungolfed
Teste no console Firefox / FireBug
Saída
fonte
F=n=>{for(o=[1],i=n*n;--i;)o[i]=2*i+1;for(;++i<n;o=o.filter((x,j)=>++j%o[i]));return o.slice(0,n)}
Matlab, 104 bytes
Agradecemos a @flawr pelos comentários e sugestões muito apropriados.
Exemplo do prompt de comando do Matlab:
fonte
Bash + coreutils, 136
Eu esperava jogar mais isso, mas tudo bem. Nem todos os dias que você entra em uma função recursiva em um script de shell:
Saída:
Bash + coreutils, 104
Menor usando uma implementação mais direta:
fonte
Go, 326
Implementação direta usando goroutine e tubos para fazer peneiras.
fonte
MATLAB, 62 caracteres
No início, interpretei mal o desafio - minha versão revisada agora é realmente mais curta.
fonte
Raquete 196 bytes
Produz números da sorte até n:
Versão não destruída:
Teste:
Saída:
fonte