Plus Primes vs Minus Primes


35

A maioria de nós sabe ...

que todos os primos p>3são da forma insira a descrição da imagem aqui

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<=ksão PlusPrimes e quantos são MinusPrimes .

Exemplos

pois k=100temos
[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=149temos
[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 : 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]

45
Eu não sabia! :(
Stewie Griffin

13
@StewieGriffin, é fácil intuir se você observar a sequência do módulo: 0%6é múltiplo de 6, 1%6nã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 e 5%6não pode ser determinado.
precisa saber é o seguinte

3
@zzzzBov que seria muito útil se eu sabia por módulo teve uma sequência, e o que significava para primos ... Desejo colegial ensinou teoria dos números ...
socrático Phoenix

@SocraticPhoenix, módulo significa "restante após divisão". 0, 6, 12, etc, todos produzem 0 após a divisão por 6; 1, 7, 13 produzem 1. Como procuramos números que não podem ser divididos em fatores, saber que um número é divisível por um número inteiro maior que 1 nos diz que o número não é primo.
precisa saber é o seguinte

Respostas:


10

05AB1E , 10 9 bytes

Guardado 1 byte graças a Erik the Outgolfer

Saídas como [PlusPrimes, MinusPrimes]

LDpÏ6%5Ñ¢

Experimente online! ou como um conjunto de testes

Explicação

L             # push range [1 ... input]
 DpÏ          # keep only primes
    6%        # mod each by 6
      5Ñ      # divisors of 5 [1, 5]
        ¢     # count


6

Python 2 , 77 bytes

-2 bytes graças a Neil

lambda x:[sum(all(n%j for j in range(2,n))for n in range(i,x,6))for i in 7,5]

Experimente online!

Solução anterior, 83 81 79 bytes

-1 byte graças ao Sr. Xcoder
-2 bytes graças a Halvard Hummel

lambda x:map([all(n%i for i in range(2,n))*n%6for n in range(4,x)].count,[5,1])

Experimente online!
Tanto a saída como [MinusPrimes, PlusPrimes]





Eu fiz muitas compreensões de array em JavaScript - eu tinha esquecido que as listas Python geralmente não precisam de []s.
Neil

Portanto, você divide n por todos os números de i a n-1 para ver se é primo, gera todos os números inteiros (5,11, ...) e (7,13, ...) e testa se número em questão está lá e conte-os. Parece eficiente. ;)
Yakk 29/08/19

5

Geléia , 7 bytes

s6ÆPSm4

Além disso, então menos.

Experimente online!

Como funciona

s6ÆPSm4  Main link. Argument: n

s6       Split [1, ..., n] into chunks of length 6.
  ÆP     Test all integers for primality.
    S    Sum across columns.
         This counts the primes of the form 6k + c for c = 1, ..., 6.
     m4  Take every 4th element, leaving the counts for 6k + 1 and 6k + 5.

5

Mathematica, 51 bytes

(s=#;Mod[Prime~Array~PrimePi@s,6]~Count~#&/@{5,1})&

Experimente online!

@ngenisis jogou o jogo para baixo, economizando 4 bytes

Mathematica, 47 bytes

sPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}

Modtambém pode ser infix, e se você estiver indo para nomear o primeiro argumento s, basta usar um argumento nomeado:sPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}
ngenisis

5

Japonês , 15 13 11 bytes

A ordem de saída é [+,-].

õj ò6 yx ë4

Teste-o

  • Inspirou-se na solução Dennis 'Jelly, mas, depois do golfe, está mais perto de ser um porto.
  • 2 bytes salvos graças a Oliver, trazendo ëà minha atenção o método anteriormente desconhecido para mim .

Explicação

Entrada implícita de número inteiro U.

õj

Gere uma matriz de números inteiros ( õ) de 1 a Ue verifique se cada uma é uma prime ( j), fornecendo uma matriz de booleanos.

ò6

Particione a matriz em sub-matrizes de comprimento 6.

yx

Transponha ( y) e some as colunas.

ë4

Obtenha cada quarto elemento da matriz e envie-os implicitamente.


Original, 19 17 16 15 bytes

õ fj
5â £è_%6¥X

Teste-o

  • 1 byte, graças a uma sugestão inspirada de Oliver de usar os divisores de 5 depois que eu descansei em meus louros dividindo 15 em uma matriz.

3

J , 23 bytes

1#.5 1=/6|_1 p:@i.@p:>:

Experimente online!

1#.5 1=/6|_1 p:@i.@p:>:   input: y
          _1       p:     number of primes
                     >:   less than y + 1
             p:@i.        prime range from 0 to that number
        6|                get residues modulo 6
   5 1=/                  table of values equal to 5 or 1
1#.                       sum of each (antibase 1)

3

Retina , 53 51 bytes

.+
$*
1
$`1¶
G`1111
A`^(11+)\1+$
1{6}

*M`111
\b1\b

Experimente online! Explicação:

.+
$*

Converta para unário.

1
$`1¶

Conte de 1 até n.

G`1111

Exclua números menores que 4.

A`^(11+)\1+$

Excluir números compostos.

1{6}

Pegue o restante do módulo 6.

*M`111

Imprima o número de números com um restante entre 3 e 5.

\b1\b

Imprima o número de números com o restante 1.


3

Ruby, 61 60 bytes

(52 bytes + 8 para o -rprimessinalizador)

->n{[1,5].map{|x|(4..n).count{|i|i.prime?&&i%6==x}}}

Retorna uma matriz do formulário [mais primos, menos primos].

Economizou 1 byte graças ao GB!

Experimente online.


Fui inspirado por sua resposta e atualizei a minha (em Haskell)!
Jferard

@ferferard Estou muito feliz em ouvir isso! :)
Cristian Lupascu

Você pode usar countno intervalo sem o operador splat (economize 1 byte).
GB

3

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 ...

{[+] map {.is-prime*($_%6-1??i!!1)},5..$_}

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.

{[+] map {.is-prime*exp(π*($_%6-1)i/8).round},5..$_}

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 numerado True == 1, False == 0) por um exponencial complexo feito para ser exp(0) = 1(para $_%6 = 1) ou exp(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).


isso é bom. bom trabalho!

Eu acho que você quer dizer em eficiente? Bom método embora!
Jonathan Allan

Essa foi uma tentativa grosseira de ironia: --).
Ramillies

Ao jogar golfe, usar o método forma mapou grepàs vezes pode custar alguns caracteres. Isso economiza 2 caracteres:{[+] map {.is-prime*exp(π*($_%6-1)i/8).round: 1},5..$_}
Joshua

Esqueci de fazer isso aqui, obrigado por chamar minha atenção!
Ramillies

2

Na verdade , 21 bytes

u5x`p░⌠6@%1=;`╖*ƒ⌡Ml╜

Experimente online!

Produz primeiro o PlusPrimes, seguido pelo MinusPrimes

Explicação:

u5x`p░⌠6@%1=;`╖*ƒ⌡Ml╜
u5x                    range(5, n+1)
   `p░                 primes in range
      ⌠6@%1=;`╖*ƒ⌡M    for each prime:
       6@%               mod 6
          1=             equal to 1
            ;`╖*ƒ        execute ╖ if p%6==1 (add 1 to register 0, consuming p)
                   l   length of resulting list (MinusPrimes)
                    ╜  push value in register 0 (PlusPrimes)


2

MATLAB 2017a, 29 bytes

sum(mod(primes(k),6)'==[5,1])

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]


2

Japonês , 18 16 bytes

-2 bytes graças a @Oliver

õ_j ©Z%6
5â £è¥X

Experimente online!

Saídas no formato [PlusPrimes, MinusPrimes].


Hmm ... acabei de voltar para minha mesa, joguei o meu até 17 bytes e depois vi que você havia postado isso ... não sei se devo publicá-lo ou não, pois o cerne de ambas as nossas soluções está mapeando [5,1]para obter as contagens e você chegou primeiro.
Shaggy

@Shaggy IMO, sua solução tem diferenças suficientes para permanecer em um post separado. Você usou filter 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.
23817 Justin Mariner

Vou pensar um pouco; soluções em idiomas diferentes usando métodos semelhantes (mesmo se um "emprestado" do outro) está OK, mas duas soluções no mesmo idioma não são muito boas para mim. Editei no meu post como alternativa por enquanto.
Shaggy

Decidi correr com ele e depois retirei outro byte.
Shaggy

Você pode usar para obter[1,5]
Oliver

2

C #, 202 179 174 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 chamando a(n).

int[]a(int n){int[]r={0,0};for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}int b(int n){for(int i=3;i-2<Math.Sqrt(n);i+=2)if(n%i<1)return 0;return 1;}

Código formatado corretamente no Try It Online: Aqui


Você pode adicionar um link de tio?
Mr. Xcoder

Desculpe pelo golfe byte a byte, 194 bytes: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;}
Sr. Xcoder

193 bytes: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;}
Sr. Xcoder

lmao você está amando esse arent você;)
MysticVagabond

11
obrigado por toda a ajuda, desde youve postados uma resposta separada e declarou a sua golf a minha, im só vou deixar o meu como é e tirar as lições para o próximo desafio: P
MysticVagabond

2

Haskell , 81 69 bytes

f n=(\r->sum[1|i<-[2..n],all((>0).rem i)[2..i-1],rem i 6==r])<$>[5,1]

Experimente online!

A primeira solução foi:

r!l=sum[1|i<-l,rem i 6==r]
f n|l<-[i|i<-[2..n],all((>0).rem i)[2..i-1]]=(5!l,1!l)

Mas eu li a resposta do w0lf em Ruby ...


1

Pitão , 15 bytes

/K%R6fP_TSQ5/K1

Suíte de teste.

Pitão , 16 bytes

m/%R6fP_TSQd,1 5

Suíte de teste.


Quão?

Explicação nº 1

/ K% R6fP_TSQ5 / K1 - Programa completo.

     fP_TSQ - Filtre os primos no intervalo [1 ... entrada].
  % R6 - Mod 6 em cada um.
 K - Atribua-os a uma variável K.
/ 5 - Conte as ocorrências de 5 em K.
            / K1 - Conte as ocorrências de 1 em K.
                - Saída implícita do resultado.

Explicação nº 2

m /% R6fP_TSQd, 1 5 - Programa completo.

     fP_TSQ - Filtra os números primos no intervalo [1 ... entrada]
  % R6 - Mod 6 em cada um.
            , 1 5 - Pressione a lista [1, 5]
m / d - conte quantos de cada um existe.  
                 - Saída implícita do resultado. 

Alternativas:

/ K% R6fP_TSQ5 / KhZ (16 bytes)
K% R6fP_TSQ / K5 / K1 (16 bytes)
m /% R6fP_TSQdj15T (16 bytes)
m /% R6fP_TSQd [1 5 (16 bytes)   
m /% R6fP_TSQdsM`15 (17 bytes)
m /% R6.MP_ZSQd, 1 5 (17 bytes)
m /% R6.MP_ZSQdj15T (17 bytes)
m /% R6.MP_ZSQd [1 5 (17 bytes)

2
Parabéns por 10k !!
Luis Mendo

@LuisMendo Muito obrigado :-)
Sr. Xcoder

1

Geléia ,  12 11  10 bytes

Obrigado a @cairdcoinheringaahing por algumas dicas no chat. Agradecemos a @Dennis por salvar um byte no chat.

ÆR%6ċЀ1,5

Experimente online!

Gelatina , 11 bytes

ÆR%6µ1,5=þS

Experimente online!

Gelatina , 11 bytes

ÆR%6µċ5,ċ1$

Experimente online!


Como é que isso funciona?

Explicação nº 1

ÆR%6ċЀ1,5   As usual, full program.

ÆR           Get all the primes in the range [2...input].
  %6         Modulo each by 6.
       1,5   The two-element list [1, 5].
    ċЀ      Count the occurrences of each of ^ in the prime range.

Explicação nº 2

ÆR%6µ1,5=þS   As usual, full program.

ÆR            Get all the primes in the range [2...input].
  %6          Modulo each by 6.
    µ         Chain separator.
     1,5      The two-element list [1, 5].
        =     Equals?   
         þ    Outer product.     
          S   Sum.

Explicação nº 3

ÆR%6µċ5,ċ1$   As usual, full program.

ÆR            All the primes in the range [2...input].
  %6          Modulo each by 6.
    µ     $   Some helpers for the chains.
       ,      Two element list.
     ċ5       The number of 5s.
        ċ1    The number of 1s.

1

Java 8, 141 140 138 106 101 100 96 94 81 bytes

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;}

Retorna 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 39 40 42 bytes.
Ajuda enorme do @Nevay para outros impressionantes -55 bytes.

Explicação:

Experimente aqui. (O caso final de teste 4000000excede um pouco o prazo de 60 segundos.)

n->{                   // Method with integer parameter and integer-array return-type
  int r[]={0,0},       //  Return integer-array, starting at [0,0]
      c;               //  Temp integer
  for(;n-->4;          //  Loop (1) as long as the input is larger than 4
                       //  and decrease `n` by 1 before every iteration
      r[n%6/4]+=c)     //    After every iteration, increase the plus or minus prime by `c`
                       //    (where `c` is either 0 or 1)
    for(c=n;           //   Reset `c` to `n`
        c>1;           //   And inner loop (2) as long as `c` is larger than 1
      c=               //    Change `c` to:
        c-1&~n%c>>-1;  //     inverting the bits of `n`,                    [~n]
                       //     modulo-`c` that result,                       [%c]
                       //     then bit-shift right that by -1,              [>>-1]
                       //     and then bitwise-AND that result with `c-1`   [c-1&]
    );                 //   End of inner loop (2)
                       //  End of loop (1) (implicit / single-line body)
  return r;            //  Return result integer-array
}                      // End of method

11
106 bytes: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;}
Nevay

11
101 bytes: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;}
Nevay

11
96 bytes: 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 seu j++,++j)
Nevay

11
94 bytes: 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]).
Nevay 30/08/19

11
81 bytes: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;}
Nevay

1

JavaScript (ES6), 83 82 80 68 66 bytes

Acabou 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.

f=(n,a=[0,0])=>n>4?f(n-1,a,(g=y=>n%--y?g(y):y<2)(n)&&++a[n%6%5]):a

Tente

o.innerText=(

f=(n,a=[0,0])=>n>4?f(n-1,a,(g=y=>n%--y?g(y):y<2)(n)&&++a[n%6%5]):a

)(i.value=6);oninput=_=>o.innerText=i.value>5?f(+i.value):[0,0]
<input id=i min=6 type=number><pre id=o>


0

CJam , 19 bytes

ri){mp},6f%_5e=p1e=

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

ri){mp},6f%_5e=p1e=

ri                        Read integer k
  )                       Add 1
       ,                  Filter the (implicit) array [0 1 ... k] ...
   {mp}                   ... on the function "is prime"
         f                Map over the resulting array...
          %               ... the function "modulus" ...
        6                 ... with extra parameter 6
           _              Duplicate the resulting array
             e=           Count occurrences ...
            5             ... of number 5
               p          Print with newline
                 e=       Count occurrences ...
                1         ... of number 1. Implicitly display

0

Números R + , 66 60 58 40 bytes

-16 bytes graças a Jarko Dubbeldam! Posteriormente, joguei mais dois bytes fora.

cat(table(numbers::Primes(4,scan())%%6))

Imprime PlusPrimes MinusPrimesem stdout; lê de stdin.

tabletabula 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 saber 1e 5(mod 6), essa é exatamente a função que precisamos, juntamente com numbers::Primes, que retorna todos os números primos entre 4e a entrada.

Experimente online!

Base R , 97 91 89 86 65 bytes

um monte de bytes salvos por Jarko aqui também

function(n)table((5:n)[sapply(5:n,function(x)all(x%%2:x^.5))]%%6)

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 1e 5, com as contagens abaixo.

Experimente online!



(Dennis adicionado números para TIO, de modo que as obras agora :))
JAD


all(x%%2:x^.5>0), Qualquer coisa diferente de zero é já truthy, por isso all(x%%2:x^.5)funciona muito
JAD

@JarkoDubbeldam very nice! Acontece que todos os valores são maiores do 4que podemos nos livrar, >4já que não teremos 2mais lá como primos, portanto, isso atinge 40 bytes.
Giuseppe


0

JavaScript (SpiderMonkey) , 151 , 140 , 131 bytes

n=>[...Array(n+1).keys()].splice(5).filter(a=>!/^1?$|^(11+?)\1+$/.test("1".repeat(a))).reduce((r,a)=>(a%6<2?r[1]++:r[0]++,r),[0,0])

Experimente online!

Obrigado a shaggy por ajudar com uma correção de bugs e jogar golfe.

Explicação:

n=>                                                   // Create a lambda, taking n
    [...Array(n+1).keys()]                            // Create a list from 0 to n+1
        .splice(5)                                    // remove first five elements
        .filter(a=>                                   // filter the list to get primes
             !/^1?$|^(11+?)\1+$/.test("1".repeat(a))) // using the famous regex here: https://stackoverflow.com/questions/2795065/how-to-determine-if-a-number-is-a-prime-with-regex 
        .reduce((r,a)=>                               // reduce the list
           (a%6<2?r[1]++:r[0]++,r),                   // by counting plus primes
           [0,0])                                     // and minus primes

11
Retornos 17,15para 149 (deve ser 18,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.
Shaggy

11
Mais algumas economias rápidas para você, reduzindo-o para 131 bytes .
Shaggy

@ Shaggy Eu não sabia que você poderia usar reduzir assim.
Pureferret 31/08/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.