É um super-prime?

22

fundo

Um super-primo é um número primo cujo índice na lista de todos os primos também é primo. A sequência é assim:

3, 5, 11, 17, 31, 41, 59, 67, 83, 109, 127, 157, 179, 191, ...

Essa é a sequência A006450 no OEIS .

Desafio

Dado um número inteiro positivo, determine se é um super-prime.

Casos de teste

2: false
3: verdadeiro
4: false
5: verdadeiro
7: false
11: true
13: false
17: true
709: true
851: false
991: true

Pontuação

Isso é , então a resposta mais curta em cada idioma vence.

musicman523
fonte
6
Qual é o índice de 2 ? É 1 ou 0 ?
Dennis
1
@ Dennis, a sequência é indexada em 1; o índice de 2 é 1.
musicman523 07/07
2
Primeiro pensamento depois de ler o que é um super-primo: O que você chamaria de super-primos? Ou super ^ 3-primos? O que é maior, o número de átomos no universo ou a 11ª super ^ 11-prime? Você, querida pessoa da Internet, está roubando mais algumas horas do meu horário nobre!
J_F_B_M
@J_F_B_M Faça um desafio com base nisso! : D
musicman523
1
@J_F_B_M 11 é um super-primo que está na lista de super-primos também é um super-primo (3), de modo que o 11º super-primo é um super-super-super-primo
Skidsdev

Respostas:

21

Gelatina , 5 bytes

ÆRÆNċ

Experimente online!

Como funciona

ÆRÆNċ  Main link. Argument: n

ÆR     Prime range; yield the array of all primes up to n.
  ÆN   N-th prime; for each p in the result, yield the p-th prime.
    ċ  Count the occurrences of n.
Dennis
fonte
8
Puta que
pariu
3
Ele sempre faz ...
Gryphon - Restabelece Monica
@ETHproductions Bem, a solução é bastante óbvia ... é apenas o ninja aqui.
Erik the Outgolfer
14

Mathematica, 26 23 bytes

Obrigado a user202729 por salvar 3 bytes.

PrimeQ/@(#&&PrimePi@#)&

Isso faz uso do fato de que o Mathematica deixa a maioria das expressões sem sentido avaliadas (neste caso, a lógica Andde dois números) e Mappode ser aplicada a qualquer expressão, não apenas às listas. Então, calculamos o valor Andda entrada e seu índice principal, que permanece assim, e depois Mapo teste de primalidade sobre essa expressão que transforma os dois operandos do Andem booleanos, para que Andpossam ser avaliados.

Martin Ender
fonte
1
23 bytes: PrimeQ/@(#&&PrimePi@#)&.
user202729
@ user202729 Legal, obrigado. :)
Martin Ender
10

Gelatina , 6 bytes

ÆRi³ÆP

Experimente online!

Utiliza a mesma técnica da minha resposta em japonês: gere os números primos até n , obtenha o índice de n nessa lista e verifique se há primalidade. Se n em si não for primo, o índice será 0 , o que também não é primo, portanto, 0 será retornado de qualquer maneira.

ETHproductions
fonte
9

Japonês , 13 11 bytes

õ fj bU Ä j

Teste online!

Explicação

Na verdade, isso é muito direto, ao contrário do meu envio original:

 õ fj bU Ä  j    
Uõ fj bU +1 j    Ungolfed
                 Implicit: U = input integer
Uõ               Generate the range [1..U].
   fj            Take only the items that are prime.
      bU         Take the (0-indexed) index of U in this list (-1 if it doesn't exist).
         +1 j    Add 1 and check for primality.
                 This is true iff U is at a prime index in the infinite list of primes.
                 Implicit: output result of last expression
ETHproductions
fonte
4

Python 3 , 104 97 93 bytes

p=lambda m:(m>1)*all(m%x for x in range(2,m))
f=lambda n:p(n)*p(len([*filter(p,range(n+1))]))

Retorna 0/ 1, no máximo 4 bytes mais, se for necessário True/ False.

Experimente online!

C McAvoy
fonte
1
0/1 está bom. Boa resposta! Como você nunca usa o valor de f, você pode reformatar seu código assim e excluí-lo da contagem de bytes.
musicman523
@ musicman523 Obrigado pela dica!
C McAvoy
3

Geléia , 7 bytes

ÆCÆPaÆP

Experimente online!

ÆCcontagem do número de primos inferior ou igual ao da entrada (assim, se a entrada é o n th nobre, ele retorna n ). Em seguida, ÆPtesta esse índice quanto à primalidade. Finalmente, afaz um AND lógico entre esse resultado e ÆP(teste de primalidade) da entrada original.

Maçaneta da porta
fonte
2

05AB1E , 6 bytes

ÝØ<Øså

Experimente online!

Explicação

ÝØ<Øså
Ý      # Push range from 0 to input
 Ø     # Push nth prime number (vectorized over the array)
  <    # Decrement each element by one (vectorized)
   Ø   # Push nth prime number again
    s  # swap top items of stack (gets input)
     å # Is the input in the list?
Datboi
fonte
2

Pitão , 12 bytes

&P_QP_smP_dS

Experimente online!

Explicação

&P_QP_smP_dS
                Implicit input
       mP_dS    Primality of all numbers from 1 to N
      s         Sum of terms (equal to number of primes ≤ N)
    P_          Are both that number
&P_Q            and N prime?
notjagan
fonte
2

Pyke, 8 bytes

sI~p>@hs

Experimente aqui!

s        -  is_prime(input)
 I~p>@hs - if ^:
  ~p>    -    first_n_primes(input)
     @   -    ^.index(input)
      h  -   ^+1
       s -  is_prime(^)
Azul
fonte
1

QBIC , 33 bytes

~µ:||\_x0]{p=p-µq|~q=a|_xµp]q=q+1

Explicação

~   |   IF   ....  THEN (do nothing)
  :         the number 'a' (read from cmd line) 
 µ |        is Prime
\_x0        ELSE (non-primes) quit, printing 0
]           END IF
{           DO
            In this next bit, q is raised by 1 every loop, and tested for primality. 
            p keeps track of how may primes we've seen (but does so negatively)
    µq|     test q for primality (-1 if so, 0 if not)
p=p-        and subtract that result from p (at the start of QBIC: q = 1, p = 0)
~q=a|       IF q == a
_xµp        QUIT, and print the prime-test over p (note that -3 is as prime as 3 is)
]           END IF
q=q+1       Reaise q and run again.
steenbergh
fonte
1

Mathematica, 35 29 bytes

P=Prime;!P@P@Range@#~FreeQ~#&

-6 bytes de @MartinEnder

J42161217
fonte
P@P@Range@#deve salvar um monte.
Martin Ender
1

Haskell, 121 bytes

f=filter
p x=2==(length$f(\a->mod(x)a==0)[1..x])
s=map(\(_,x)->x)$f(\(x,_)->p x)$zip[1..]$f(p)[2..]
r x=x`elem`(take x s)
Sergii Martynenko Jr
fonte
1
(\(_,x)->x)é snd, (\(x,_)->p x)é (p.fst). Ambos fste sndestão no Prelude, portanto, não há necessidade de importações.
Laikoni 7/07
Não use backticks muitas vezes : r x=elem x$take x s. No entanto, neste caso, você pode ir pointfree (introduzindo backticks novamente) e omitir o nome da função: elem<*>(`take`s).
nimi
1

Positron , 148 bytes

x=#(input@@)a=function{p=1;k=$1==2;f=2;while(f<$1)do{p=p*$1%f;k=1;f=f+1};return p*k}r=1;i=2;while(i<x)do{if(a@i)then{r=r+1}i=i+1}print@((a@x*a@r)>0)

Experimente online!

HyperNeutrino
fonte
1

Matlab, 36 34 bytes

Economizou 2 bytes graças a Tom Carpenter.

Uma implementação muito ingênua usando funções internas:

isprime(x)&isprime(nzz(primes(x)))
Leander Moesinger
fonte
1
Para Octave só você também pode salvar mais um byte com(p=@isprime)(x)&p(nnz(primes(x)))
Tom Carpenter
1

Python 2 , 89 bytes

def a(n):
 r=[2];x=2
 while x<n:x+=1;r+=[x]*all(x%i for i in r)
 return{n,len(r)}<=set(r)

Experimente online!

Constrói r, a lista de números primos <= n; se n é primo, então né o len(r)'ésimo primo. Então n é um super primo se n em re len (r) em r.

Chas Brown
fonte
0

Julia 0,6, 61 bytes

retorne 1 se x for um super-prime, 0 caso contrário.

sem usar uma função do tipo isprime.

x->a=[0,1];for i=3:x push!(a,0i%(2:i-1))end;a[sum(a)]&a[x]
Tanj
fonte