Desafio:
O objetivo deste código-golfe é baseado no número 8675309
...
Seu objetivo é imprimir todos os números primos de 2 a 8675309, começando com o número 2 e depois pulando 8 números primos, depois pulando 6 e depois 7, etc. Em essência, pule vários números primos determinados pelo próximo número em a sequência 8675309
. Passando de bicicleta para 8 quando chegar a 9.
Resultado:
2
29
(saltou 8 para chegar ao 10º prime)
59
(saltou 6 para chegar ao 17º prime)
97
(saltou 7 para chegar ao 25º prime)
Exemplo: (pseudo-código semelhante ao PHP, em que $prime
uma matriz contém todos os números primos).
$tn=1;
$c=1;
$na=array(8,6,7,5,3,0,9);
l:
output($prime[$tn]);
if ($prime[$tn]>=8675309) {exit(8675309)};
$c+=1;
if ($c>=8) {$c=1};
$tn+=$na[$c];
goto l;
Quando digo pular 8 números primos, quero passar do número 1 primo para o número 10 primo (pulando 8 no meio).
Cada número deve estar em uma nova linha.
Quando você chegar ao 0
no 8675309
, apenas apenas imprimir o próximo número primo, sem pular nenhuma.
Isso é código-golfe, e o código mais curto (em bytes) vence.
fonte
$c
para cedo e, se não atingirmos exatamente 8675309 (não é?), Ele também imprime o primeiro número que excede esse valor.Respostas:
Mathematica 67 bytes
Mas não atinge 8675309 - não tenho certeza da intenção do OP sobre isso.
fonte
Maravilha , 47 bytes
Oh nossa, isso fica cada vez mais lento com o passar do tempo ...
Explicação
Pega 582161 (quantidade de números primos <= 8675309) da lista de números primos infinitos
P
e redefine o resultado comoP
.Alterna infinitamente os dígitos de 8675309 e executa um takewhile na lista resultante.
Envie o primeiro item
P
, soltecycle item + 1
elementos de P e redecare o resultado comoP
. Esta operaçãoP
também atua como um valor de verdade por um período de tempo; se a lista estiver vazia / falsa (o que significa que alcançamos 8675309), paramos de retirar da lista ciclada.Implementação mais rápida (para teste)
Ainda muito lento, mas notavelmente mais rápido.
fonte
Geléia ,
23 2924 bytes+6 bytes para um patch temporário para atender ao requisito de imprimir 8675309.
-5 bytes movendo-se para uma abordagem mais golfista, mas mais lenta, para resolver isso.
Agora, é muito lento para executar no TryItOnline, mas é executado localmente em alguns minutos, produzindo os números mostrados abaixo com os feeds de linha no meio (número de primos ignorados mostrado abaixo entre parênteses):
* o último é apenas um salto efetivo de 4, pois é simplesmente anexado à lista.
Clique aqui para obter uma versão usando 3659 em vez de 8675309, que possui 19 conjuntos de quatro pulos (em vez de 12937 conjuntos de 7) e anexa 3659 (que é um pulo efetivo de 6).
Quão?
fonte
Ruby, 121 bytes
Trailing newline no final do arquivo desnecessário e sem pontuação.
Explicação:
P
é uma matriz de números primos.c
é um candidato a candidato;s
é o produto do módulo de resíduos a cada primo menor; se qualquer resíduo desse tipo for zero (indicando quec
é composto),s
torna-se (e permanece) zero.O gerador de números primos está lento. Levará muito tempo para executar. O teste foi realizado substituindo uma
P
matriz gerada por meios mais eficientes (especificamente, curto-circuito na divisão par, e também ajuda muito a interromper o teste na raiz quadrada).fonte
Haskell, 122 bytes
Pode ser o que é solicitado:
Eu poderia economizar alguns bytes pré-computando quantos números são necessários e substituindo
takeWhile
portake
. Isso também permitiria se adaptar a qualquer decisão sobre o último número a ser produzido. Ele já imprimiu números de até 600000 usando muito pouca memória no meu teste, então acho que pode ir até o fim.fonte
8675310
por8675
, digamos. E funciona para mim (compilado, com otimização, não tente sem) na forma original. Uma máquina mais rápida, iniciada depois do primeiro teste, já alcançou 1.600.000.Haskell, 109 bytes
Experimente online! (truncado
8675309
para8675
, caso contrário, o tempo limite será excedido ) Experimente on-line )Uso:
fonte
Perl 6 ,
65 7367 bytes(falha ao imprimir 8675137 devido a falta:partial
)Ao mudar o final do intervalo, o
:partial
pode ser removido.Experimente (5 limite de segunda adicionado) Veja-o terminar
O exemplo inicial foi cronometrado em 52 minutos e 41.464 segundos.
Expandido:
O resultado da
rotor
chamada é a seguinte sequênciafonte
:partial
.rotor
Befunge, 136 bytes
Experimente online! , mas esteja ciente de que o tempo limite expirará muito antes de chegar ao fim. Uma versão compilada na minha máquina local é concluída em menos de 10 segundos.
Explicação
Para testar a primalidade, iteramos no intervalo de 2 a sqrt ( n ) e verificamos se n é um múltiplo de algum desses valores - se não, é primo. Esse processo é complicado pelo fato de que o valor iterado precisa ser armazenado em uma "variável" temporária e, como as células de memória do Befunge são limitadas em tamanho, esse armazenamento deve ser dividido em duas células. Para lidar com os primos ignorados, usamos uma "tabela" de pesquisa (que você pode ver na linha 5) para acompanhar os diferentes intervalos que precisam ser ignorados.
Não vou fazer uma análise detalhada do código, porque há bastante código de intercalação com comandos compartilhados em diferentes caminhos de código para economizar espaço. Isso torna as coisas bastante difíceis de seguir e eu não acho que seria particularmente interessante para alguém que não estava familiarizado com o Befunge.
Saída de amostra
fonte
Bash (+ coreutils),
98, 94 bytesEDITAR% S:
Golfe
Teste
Experimente Online! (limitado a N <1000, para acelerar a execução)
A versão completa leva cerca de 15 segundos para ser concluída na minha máquina.
fonte