Coisas a saber:
Primeiro, números da sorte.
Os números da sorte são gerados da seguinte forma:
Pegue todos os números naturais:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20...
Em seguida, remova cada segundo número.
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39...
Agora 3
está seguro.
Remova cada terceiro número:
1, 3, 7, 9, 13, 15, 19, 21, 25, 27, 31, 33, 37, 39, 43, 45, 49, 51, 55, 59...
Agora 7
está seguro.
Remova todos os sétimos números.
Continue e remova todo n
número de th, onde n
está o primeiro número seguro após uma eliminação.
A lista final de números seguros são os números da sorte.
Os números azarados são compostos por listas separadas de números [U1, U2, U3... Un]
.
U1
é o primeiro conjunto de números removido dos "candidatos" sortudos, então eles são:
2, 4, 6, 8, 10, 12, 14, 16, 18, 20...
U2
é o segundo conjunto de números removido:
5, 11, 17, 23, 29, 35, 41, 47, 53, 59...
E assim por diante ( U3
a terceira lista, U4
a quarta etc.)
Desafio:
Sua tarefa é, ao receber duas entradas m
e n
gerar o m
número th na lista Un
.
Exemplos de entradas e saídas:
(5, 2) -> 29
(10, 1) -> 20
Especificações:
- Seu programa deve funcionar para
m
até1e6
en
até100
.- Você tem a garantia de que ambos
m
en
números inteiros positivos. - Se você está curioso,
U(1e6, 100)
=5,333,213,163
. (Obrigado @pacholik!)
- Você tem a garantia de que ambos
- Seu programa deve calcular isso dentro de 1 dia em um computador moderno razoável.
Isso é código-golfe , então o código mais curto em bytes vence!
PS: Seria bom se alguém apresentasse uma fórmula geral para gerá-las. Se você tem uma fórmula, coloque-a na sua resposta!
(1e6,1e6)
?n=1
caso? Como isso é especial - para todos os outros casos, o índice baseado em 0 do próximo número da sorte én-1
.Respostas:
CJam , 74 bytes
Experimente online! Tempo limite para casos maiores, mais restrições de tempo abaixo.
Explicação:
Nosso programa empresta vergonhosamente o código do aditsu para gerar uma lista de N números da sorte, substituindo 1 por 2 fornece o incremento em cada fase da peneira. O código restante diminui em todos os elementos até que um zero seja encontrado (fatiando e acrescentando uma cauda não decrementada) e efetivamente conta os passos em cada uma das N fases da peneira de uma só vez.
Cronometragem:
Se você precisar absolutamente executar o programa no navegador para obter números maiores, poderá usar esse intérprete e permitir que o script continue se solicitado, mas isso pode ser muito lento para se qualificar. Usar ( M , N ) = (100.100) leva ~ 247s. A iteração dos programas é relativamente linear em termos de M ; portanto, a computação (1e6.100) pode levar ~ 29 dias.
Usando o interpretador de shell em um PC, o programa calcula (100.100) em ~ 6s e calcula (1e4.100) em ~ 463s. O programa deve poder calcular (1e6.100) em ~ 13-17 horas. Nesse caso, assumirei que o programa está qualificado.
Observe que todos os horários foram arredondados nas medidas e nos cálculos.
fonte
Perl,
87858281 bytesInclui +4 para
-pX
Dê entrada no STDIN como uma linha com n primeiro (observe que isso é o inverso da ordem sugerida no desafio). Então, para calcular
U(1000000, 100)
:Algoritmo baseado nos números da sorte do aditsu respondem A complexidade do tempo é
O(n^2)
muito rápida para o intervalo necessário. O100, 1000000
caso dá5333213163
em 0,7 segundos. Devido aos problemas que o perl tem com ado$0
recursão baseada, ele usa muita memória. Reescrevê-lo como uma função faria a memória usar,O(n)
mas é um número de bytes mais longounlucky.pl
:Isso funciona como mostrado, mas use literal
^S
para obter a pontuação reivindicada.Não conheço nenhum uso anterior do
$^S
perlgolf.fonte
(1e6,100)
?do$0
ele, é basicamente inacessível em qualquer computador realista. Mas se essa memória existisse cerca de 2 anos. Eu realmente não escrevi e testei uma versão normal baseada em sub-rotinas, mas esperaria que isso terminasse em alguns meses e funcionasse mesmo em computadores com muito pouca memória. Portanto, é bom que esses valores não estejam no intervalo necessário para esse desafio.(1e6,100)
dentro de um dia? Como assim, esses valores não são necessários?n
em
são fornecidos em ordem inversa. A100 1000000
entrada calculaU(1000000, 100)
e dá5,333,213,163
em 0,7 segundos. É de longe o programa mais rápido(100,1e6)
ser muito mais rápido do que(1e6,100)
, e pensei que essa fosse a explicação para o relâmpago 0,7 segundos!Python 3, 170
A função L gera a linha de possíveis números da sorte (se k for Verdadeiro) ou Un (se Falso). Avaliada preguiçosamente (para que eu não precise gerar listas infinitas n-1 se quiser Un ).
Função de executar U .
Rapidez
U (1.000.000; 100) leva cerca de 1h 45min para executar na minha máquina com o PyPy. Eu suspeito que cerca de quatro horas com CPython. (Sim, 4h 20min para ser mais preciso.)
Se eu usasse uma lista em vez de geradores, poderia ganhar velocidade, mas precisaria de uma lista de tamanho maior do que o Python me permite. E se tivesse, precisaria de dezenas de gigabytes de RAM.
Sim e U (1.000.000; 100) = 5.333.213.163 .
fonte
Haskell
Não é possível calcular para n = 1:
175160 bytesQuando compilado, o meu computador demorou 2h 35m para calcular uma entrada do
(1000000,100)
uso deste:Tentei livrar os
where
módulos, mas eles parecem afetar a velocidade e não sei por que ... Mas acho que há mais podas a serem feitas aqui.O método a ser usado é
m?n
para consultar a resposta dada umm
en
.Ungolfed
Acho que é possível combinar as funções 'skipeverynth' e 'everynth' em uma única função que retorna um par.
Eu usei o código dessa pessoa gentil para pular cada enésimo elemento. Fiz isso algumas vezes, mas sempre foi muito mais ineficiente e não conseguia descobrir o porquê.
Capaz de calcular para todos os n: 170 bytes
Isso é basicamente o mesmo, mas algumas
max
funções tiveram que ser utilizadas para lidar com o caso especial den=1
.fonte
R 82 bytes
Uso
Isso precisa ter um vetor grande o suficiente para começar, para que haja números suficientes para retornar o valor. O vetor criado já tem cerca de 800 Mb e a função pode suportar até m = 1e4 e n = 100, ainda muito aquém do objetivo.
Para criar um vetor grande o suficiente para calcular f (1e6.100) seria necessário um vetor inicial de 1: 2e10. Devido aos procedimentos de alocação de dados de Rs, isso cria um vetor> 70Gb que não pode ser executado em nenhum computador que conheço, embora o código seja executado.
Para referência, f (1e4.100) é executado em aproximadamente 30 segundos. Com base nisso e em alguns testes menores, f (1e6.100) levaria cerca de uma hora.
fonte
Raquete 332 bytes
Versão não destruída:
Teste:
Saída:
fonte
Clojure, 221 bytes
Muito longo, mas lida com o caso
(f 1)
. Sem esse caso especial, eram 183 bytes. Foi um esforço demais para não ser publicado.Saídas de amostra:
1000000 100 caso foi calculado em cerca de 4,7 horas, pelo menos não travou.
fonte