A maioria de nós sabe ...
que todos os primos p>3
são da forma
Mas, quantos são os Primos Plus ( 6n+1
) e quantos são os Primes Menos ( 6n-1
) em um determinado intervalo?
O desafio
Dado um número inteiro k>5
, contar quantas primes<=k
são PlusPrimes e quantos são MinusPrimes .
Exemplos
pois k=100
temos
[5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89]
12 MinusPrimes
e
[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97]
11 PlusPrimes
pois k=149
temos
[5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89, 101, 107, 113, 131, 137, 149]
18 MinusPrimes
e
[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97, 103, 109, 127, 139]
15 PlusPrimes
Regras
Seu código deve gerar 2 números inteiros : um para o MinusPrimes e outro para o PlusPrimes em qualquer ordem que você desejar (especifique qual é qual).
Este é o código-golfe : a resposta mais curta em bytes vence!
Casos de teste
Entrada -> Saída [ MinusPrimes , PlusPrimes ]
6->[1,0]
7->[1,1]
86->[11,10]
986->[86,78]
5252->[351,344]
100000->[4806,4784]
4000000->[141696, 141448]
0%6
é múltiplo de 6,1%6
não pode ser determinado,2%6
é múltiplo de 2,3%6
é múltiplo de 3,4%6
é múltiplo de 2, é múltiplo de 2 e5%6
não pode ser determinado.Respostas:
05AB1E ,
109 bytesGuardado 1 byte graças a Erik the Outgolfer
Saídas como
[PlusPrimes, MinusPrimes]
Experimente online! ou como um conjunto de testes
Explicação
fonte
MATL , 10 bytes
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Python 2 , 77 bytes
-2 bytes graças a Neil
Experimente online!
Solução anterior,
838179 bytes-1 byte graças ao Sr. Xcoder
-2 bytes graças a Halvard Hummel
Experimente online!
Tanto a saída como [MinusPrimes, PlusPrimes]
fonte
[]
s.Geléia , 7 bytes
Além disso, então menos.
Experimente online!
Como funciona
fonte
Mathematica, 51 bytes
Experimente online!
@ngenisis jogou o jogo para baixo, economizando 4 bytes
Mathematica, 47 bytes
fonte
Mod
também pode ser infix, e se você estiver indo para nomear o primeiro argumentos
, basta usar um argumento nomeado:sPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}
Japonês ,
151311 bytesA ordem de saída é
[+,-]
.Teste-o
ë
à minha atenção o método anteriormente desconhecido para mim .Explicação
Entrada implícita de número inteiro
U
.Gere uma matriz de números inteiros (
õ
) de 1 aU
e verifique se cada uma é uma prime (j
), fornecendo uma matriz de booleanos.Particione a matriz em sub-matrizes de comprimento 6.
Transponha (
y
) e some as colunas.Obtenha cada quarto elemento da matriz e envie-os implicitamente.
Original,
19171615 bytesTeste-o
fonte
J , 23 bytes
Experimente online!
fonte
Retina ,
5351 bytesExperimente online! Explicação:
Converta para unário.
Conte de 1 até
n
.Exclua números menores que 4.
Excluir números compostos.
Pegue o restante do módulo 6.
Imprima o número de números com um restante entre 3 e 5.
Imprima o número de números com o restante 1.
fonte
Ruby,
6160 bytes(52 bytes + 8 para o
-rprimes
sinalizador)Retorna uma matriz do formulário [mais primos, menos primos].
Economizou 1 byte graças ao GB!
Experimente online.
fonte
count
no intervalo sem o operador splat (economize 1 byte).Perl 6 , 42 bytes
Economizou 1 byte removendo um espaço inútil ...
Economizou 2 bytes reorganizando a
map
chamada - graças a @Joshua.Salva 3 bytes porque
.round
é igual.round: 1
.Na verdade, o exponencial complexo é legal, mas muito caro em termos de caráter. Economizou 10 bytes apenas descartando-o ...
Experimente online!
Esta foi a versão com o exponencial complexo. (Gosto muito de excluí-lo.) A nova versão funciona exatamente da mesma maneira, apenas o exponencial complexo é substituído pelo operador ternário muito mais curto.
Experimente online!
A saída é um número complexo
(PlusPrimes) + (MinusPrimes)i
. Espero que não seja muito contra as regras.Explicação: É uma função que recebe um argumento inteiro. Nós iteramos sobre todos os números inteiros, de 5 ao argumento (
(5..$_)
). Para cada uma delas, avaliamos.is-prime
(isso é chamado$_
, o argumento do bloco mapeado), multiplicamos (se numeradoTrue == 1, False == 0
) por um exponencial complexo feito para serexp(0) = 1
(para$_%6 = 1
) ouexp(iπ/2) = i
(para$_%6 = 5
) e, finalmente, arredondamos para o número inteiro mais próximo. Resumindo-os,[+]
obtemos o resultado.Finalmente: é realmente eficiente, por isso não tenho certeza se o TIO não atingirá o tempo limite antes de você obter sua saída para números mais altos (para 1e5, leva 26 segundos na minha máquina e o TIO tende a ser um pouco mais lento).
fonte
map
ougrep
às vezes pode custar alguns caracteres. Isso economiza 2 caracteres:{[+] map {.is-prime*exp(π*($_%6-1)i/8).round: 1},5..$_}
Na verdade , 21 bytes
Experimente online!
Produz primeiro o PlusPrimes, seguido pelo MinusPrimes
Explicação:
fonte
Empilhados , 37 bytes
Experimente online!
Bastante lento, testes de primalidade para cada K < N . Funciona de forma semelhante à minha resposta J.
fonte
MATLAB 2017a, 29 bytes
Explicação:
primes(k)
obtém todos os números primos até e incluindo k.mod(primes(k),6)'
pega o módulo 6 de todos os números primos e o transpõe para que a soma percorra a dimensão correta.==[5,1]
define todos os cinco (minusPrimes) como 1 na primeira coluna e todos os cinco (plusPrimes) como 1 na segunda coluna.sum()
soma cada coluna.Isso gera
[minusPrime, plusPrime]
fonte
Japonês ,
1816 bytes-2 bytes graças a @Oliver
Experimente online!
Saídas no formato
[PlusPrimes, MinusPrimes]
.fonte
[5,1]
para obter as contagens e você chegou primeiro.f
ilter e uma corda; Eu usei a função de mapeamento deõ
e uma matriz. Além disso, recebi a[5,1]
ideia de outra resposta.5â
para obter[1,5]
C #,
202179174 bytes-23 Bytes graças ao Sr. Xcoder
-5 Bytes graças a Cyoce
Função que retorna uma matriz de comprimento 2,
[MinusPrimes, PlusPrimes]
Executar chamandoa(n)
.Código formatado corretamente no Try It Online: Aqui
fonte
public int[]a(int n){int[]r=new int[2];for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}public int b(int n){for(int i=3;i<=Math.Sqrt(n)+1;i+=2)if(n%i<1)return 0;return 1;}
public int[]a(int n){int[]r=new int[2];for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}public int b(int n){for(int i=3;i-2<Math.Sqrt(n);i+=2)if(n%i<1)return 0;return 1;}
Haskell ,
8169 bytesExperimente online!
A primeira solução foi:
Mas eu li a resposta do w0lf em Ruby ...
fonte
Pitão , 15 bytes
Suíte de teste.
Pitão , 16 bytes
Suíte de teste.
Quão?
Explicação nº 1
Explicação nº 2
Alternativas:
fonte
Geléia ,
12 1110 bytesObrigado a @cairdcoinheringaahing por algumas dicas no chat. Agradecemos a @Dennis por salvar um byte no chat.
Experimente online!
Gelatina , 11 bytes
Experimente online!
Gelatina , 11 bytes
Experimente online!
Como é que isso funciona?
Explicação nº 1
Explicação nº 2
Explicação nº 3
fonte
Java 8,
141140138106101100969481 bytesRetorna um inteiro-matriz com dois valores, em ordem inversa em relação à descrição do desafio:
[plusPrime, minusPrime]
.Porta da resposta C # do @Xynos , depois de jogar
394042 bytes.Ajuda enorme do @Nevay para outros impressionantes -55 bytes.
Explicação:
Experimente aqui. (O caso final de teste
4000000
excede um pouco o prazo de 60 segundos.)fonte
n->{int r[]={0,0},i=4,j,c;for(;i++<n;){for(j=c=1;j*j<i;)c=i%(j+=2)<1?0:c;if(i%2*c>0)r[i%6%5]++;}return r;}
n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6%5%2]-=-i%2*c>>-1)for(j=c=1;j*j<i;)c|=i%(j+=2)-1;return r;}
n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6%5%2]+=i&c)for(j=c=1;j*j++<i;)c&=-i%++j>>-1;return r;}
(-1 graças ao seuj++,++j
)n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6/4]+=i&c)for(j=c=1;j*j++<i;)c&=-i%++j>>-1;return r;}
([plusPrime, minusPrime]
).n->{int r[]={0,0},c;for(;n-->4;r[n%6/4]+=c)for(c=n;c>1;)c=c-1&~n%c>>-1;return r;}
JavaScript (ES6),
8382806866 bytesAcabou que uma solução totalmente recursiva era muito mais curta do que mapear uma matriz!
A ordem de saída é
[-,+]
. Craps com um erro de estouro em torno de 3490.Tente
fonte
CJam , 19 bytes
Programa que pega a entrada de STDIN e gera os dois números separados por nova linha por meio de STDOUT.
Experimente online!
Explicação
fonte
Números R + ,
66605840 bytes-16 bytes graças a Jarko Dubbeldam! Posteriormente, joguei mais dois bytes fora.
Imprime
PlusPrimes MinusPrimes
em stdout; lê de stdin.table
tabula a contagem de cada ocorrência dos valores em seu vetor de entrada, em ordem crescente de valor. Portanto, como existem apenas dois valores, a saber1
e5
(mod 6), essa é exatamente a função que precisamos, juntamente comnumbers::Primes
, que retorna todos os números primos entre4
e a entrada.Experimente online!
Base R ,
9791898665 bytesum monte de bytes salvos por Jarko aqui também
Isso é quase idêntico ao anterior, exceto que calcula todos os números primos na base R em vez de usar um pacote e retorna pela saída da função em vez de imprimi-lo. Você pode ver na saída que ele retorna uma tabela com nomes
1
e5
, com as contagens abaixo.Experimente online!
fonte
all(x%%2:x^.5>0)
, Qualquer coisa diferente de zero é já truthy, por issoall(x%%2:x^.5)
funciona muito4
que podemos nos livrar,>4
já que não teremos2
mais lá como primos, portanto, isso atinge 40 bytes.Pari / GP , 41 bytes
Experimente online!
fonte
JavaScript (SpiderMonkey) ,
151,140, 131 bytesExperimente online!
Obrigado a shaggy por ajudar com uma correção de bugs e jogar golfe.
Explicação:
fonte
17,15
para 149 (deve ser18,15
). Você precisa aumentar o tamanho da sua matriz em 1: TIO . Aliás, isso é apenas ES6 "baunilha", nada específico para o SpiderMonkey. Além disso, você pode usar Snippets de pilha para JS, em vez de TIO. E você tem muitos espaços que você pode remover.