A tarefa
Escreva um programa ou função que, quando recebida uma entrada numérica x
, imprima ou retorne os números primos abaixo da raiz quadrada de x
1 que não são fatores de x
.
Exemplos
Let f(x)
Ser a função chamada:
>>> f(4)
[]
>>> f(5)
[2]
>>> f(20)
[3]
>>> f(60)
[7]
>>> f(100)
[3, 7]
>>> f(10000)
[3, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
Regras do bônus
- Você pode usar quaisquer recursos internos fornecidos pelo seu idioma.
- Seu programa deve suportar uma
x
entrada tão alta quanto o limite superior definido pelo seu idioma.
1 Usar a raiz quadrada como apenas números primos abaixo da raiz quadrada pode realmente estar envolvido nos fatores de x
. Sem fazer essa restrição, números maiores teriam muito excesso de números impressos.
x
" não é verdade: um número pode ter um fator primo maior que sua raiz quadrada. Na verdade, seus dois primeiros exemplos (5 e 20) têm esta propriedade, como fazem todos os números primos, duas vezes todos os números primos ímpares, ....Respostas:
Jelly, 6 bytes na página de código de Jelly
Experimente online!
Explicação:
fonte
MATL ,
109 bytesExperimente online!
Explicação
fonte
Python 3 ,
6762 bytesExperimente online!
fonte
MATLAB,
5754 bytesBem simples, obtém uma matriz de números primos de até sqrt (p) e remove todos os que também são fatores de p. Imprime a saída da última linha por padrão porque o ponto e vírgula é deixado de fora.
fonte
Pitão, 10 bytes
Um programa que recebe a entrada de um número e imprime uma lista.
Suíte de teste
Como funciona
fonte
05AB1E , 8 bytes
Experimente online!
Explicação
fonte
PHP, 76 bytes
usa minha solução is_prime em golfe por $ n> 1
recebe entrada do argumento da linha de comando. Corra com
-r
.fonte
Mathematica, 46 bytes
Função anônima. Pega um número como entrada e retorna uma lista de números como saída. O caractere Unicode é U + 2223 DIVIDES para
\[Divides]
.fonte
Ruby, 55 bytes
Uma resposta bastante preguiçosa usando o enumerador principal incorporado.
fonte
Maravilha , 14 bytes
Uso:
Obtém itens de uma lista infinita de números primos, enquanto o item é menor que a raiz quadrada do argumento.
fonte
Pyke, 10 bytes
Experimente aqui!
fonte
PowerShell v2 +, 71 bytes
Solução iterativa. Recebe entrada
$n
e cria um intervalo de1
até aSqrt($n)
(observe que o operador de intervalo implicitamente converterá a extremidade superior para uma[int]
que executará o arredondamento do banqueiro por padrão). Em seguida, os usos|?{...}
(oWhere-Object
operador, que actua como um filtro) para retirar esses números onde$n%$_
é diferente de zero (ou seja, qualquer restante para os meios de módulo que não é um factor, e qualquer não-zero é truthy)-and
o teste privilegiada regex habitual é$true
. Esses são deixados no pipeline e a produção está implícita.Exemplos
(com alguma formatação extra para melhorar a saída)
NB - Isso falhará nas versões anteriores se a entrada for maior do que a existente
2500000000
, porque o..
operador do intervalo pode suportar apenas até 50.000 itens. Mas, como esse é maior que o[int]
valor máximo do tipo de dados padrão2147483647
, presumo que esteja OK. Na minha máquina, o PSv4 Win8.1, no entanto, posso subir mais, mas não consigo encontrar documentação explicando a diferença.fonte
JavaScript (ES6),
7976 bytesCom base no meu função de teste de primalidade recursiva . Sinto que deve haver algumas maneiras de simplificar isso, mas não consigo descobrir como ...
Snippet de teste
fonte
Oitava, 44 bytes
Esta resposta é inspirada na resposta MATLAB de MattWH , mas eu a joguei usando alguns recursos específicos do Octave.
Esta é uma função anônima que recebe a entrada
x
. O Octave possui atribuição e indexação de variáveis em linha, permitindoy
primeiro ser criado na função (não é possível no MATLAB), depois usado como parte da máscara lógica criada porismember
(novamente, não é possível fazê-lo dessa maneira no MATLAB).fonte
Perl 6 , 37 bytes
Expandido:
fonte
TSQL, 130 bytes
Isso será executado apenas uma vez, e você precisará soltar a tabela temporária para executar novamente no mesmo editor
Eu fiz uma versão para testá-lo, é um pouco mais longo, porque as permissões online para criar tabelas estão indisponíveis. Pelo mesmo motivo, ele não precisa da tabela suspensa.
Experimente online
fonte
R,
5863 bytesFaz um loop sobre todos os valores de 2 a
sqrt(x)
e verifica se eles são primos nonumbers
pacote.x%%i
calculax mod i
qual é0 -> False
sei
é um divisor dex
e>0 -> True
sei
não é.+5 bytes, porque a
numbers::Primes(n)
função não permite decimais, enquanto2:sqrt(x)
funciona, adicionou a verificação principal àif
instrução.fonte
Haskell,
5554 bytesCompreensões de lista aninhadas principalmente diretas. O GCD executa duas funções, testando se os números abaixo de y são fatores de y e também testando se y é um fator de x.
Espaçado um pouco:
fonte
gcd(z*x)y>1
.Retina ,
6966 bytesImprime os números primos em linhas separadas, do maior para o menor.
Experimente online! (Demora cerca de 10 segundos devido aos dois últimos casos de teste. O cabeçalho e o rodapé permitem um conjunto de testes separado por avanço de linha e convertem a saída em separação por vírgula para facilitar a leitura.)
Explicação
Converta a entrada para unário.
Anexa a raiz quadrada da entrada, separada por
:
. A raiz quadrada é calculada com base no fato de que o quadrado den
também é a soma dos primeirosn
números inteiros ímpares. Podemos combinar inteiros ímpares consecutivos com a referência direta(11\1|^1)
. No processo, o grupo será usado exatamenten
vezes, onden
é o maior número cujo quadrado se encaixa na entrada.Nós inserimos uma representação unária desse número com
$#1$*1
, seguida por dois pontos e a própria correspondência.Isso corresponde a todos os números primos ausentes que se encaixam na raiz quadrada. A detecção de prime é baseada no regex padrão de verificação de prime e, em seguida, simplesmente garantimos que o prime que capturamos não divida a entrada com o segundo lookahead. Ao usar a
&
opção, obtemos correspondências sobrepostas para garantir que obtemos todos os números primos.Isso converte cada linha (ou seja, cada primo ausente) de volta em decimal, correspondendo ao número de
1
s. O único problema é que isso insere um zero se nenhum número primo ausente for encontrado.Portanto, esse estágio remove esse zero se ele foi adicionado.
fonte