È un super-prime?


22

sfondo

Un superprime è un numero primo il cui indice nell'elenco di tutti i numeri primi è anche un numero primo. La sequenza è simile alla seguente:

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

Questa è la sequenza A006450 nell'OEIS .

Sfida

Dato un numero intero positivo, determinare se si tratta di un superprime.

Casi test

2: falso
3: vero
4: falso
5: vero
7: falso
11: vero
13: falso
17: vero
709: vero
851: falso
991: vero

punteggio

Questo è , quindi vince la risposta più breve in ogni lingua.


6
Qual è l'indice di 2 ? È 1 o 0 ?
Dennis,

1
@Dennis la sequenza è 1-indicizzata; l'indice 2 è 1.
musicman523

2
Il primo pensiero dopo aver letto cos'è un superprime: come chiameresti superprimi primi? O super ^ 3-primi? Cosa c'è di più grande, il numero di atomi nell'universo o l'undicesimo super ^ 11-primo? Tu, cara persona di Internet, stai rubando altre poche ore delle mie prime ore!
J_F_B_M

@J_F_B_M Fai una sfida basata su di essa! : D
musicman523

1
@J_F_B_M 11 è un superprime che nella lista dei superprime è anche un superprime (3), quindi l'undicesimo superprime è un superprime super
Skidsdev

Risposte:



14

Mathematica, 26 23 byte

Grazie a user202729 per il salvataggio di 3 byte.

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

Questo si avvale del fatto che Mathematica lascia la maggior parte delle espressioni senza senso (in questo caso, la logica Anddi due numeri) e Mappuò essere applicata a qualsiasi espressione, non solo agli elenchi. Quindi calcoliamo l' Andinput e il suo indice primo, che rimane così, e quindi eseguiamo Mapil test di primalità su questa espressione che trasforma i due operandi Andin booleani, in modo che Andpossano quindi essere valutati.


1
23 byte: PrimeQ/@(#&&PrimePi@#)&.
user202729

@ user202729 Nice, grazie. :)
Martin Ender l'

10

Gelatina , 6 byte

ÆRi³ÆP

Provalo online!

Usa la stessa tecnica della mia risposta di Japt: genera i numeri primi fino a n , ottieni l'indice di n in quell'elenco e controlla quello per primalità. Se n di per sé non è primo, l'indice è 0 , che non è anche primo, quindi viene restituito comunque 0 .


9

Japt , 13 11 byte

õ fj bU Ä j

Provalo online!

Spiegazione

Questo è in realtà molto semplice, a differenza della mia presentazione originale:

 õ 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

4

Python 3 , 104 97 93 byte

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))]))

Restituisce 0/ 1, al massimo 4 byte in più se deve essere True/ False.

Provalo online!


1
0/1 va bene. Bella risposta! Dato che non usi mai il valore di f, puoi riformattare il tuo codice in questo modo ed escluderlo dal conteggio dei byte.
musicman523

@ musicman523 Grazie per la punta!
C McAvoy,

3

Gelatina , 7 byte

ÆCÆPaÆP

Provalo online!

ÆCconta il numero di primi minore o uguale all'ingresso (quindi, se l'ingresso è il n ° primo, restituisce n ). Quindi ÆPverifica questo indice per primalità. Infine, aesegue un AND logico tra questo risultato e ÆP(test di primalità) dell'input originale.



2

05AB1E , 6 byte

ÝØ<Øså

Provalo online!

Spiegazione

ÝØ<Ø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?

2

Pyth , 12 byte

&P_QP_smP_dS

Provalo online!

Spiegazione

&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?

2

Pyke, 8 byte

sI~p>@hs

Provalo qui!

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


1

QBIC , 33 byte

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

Spiegazione

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

1

Mathematica, 35 29 byte

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

-6 byte da @MartinEnder


P@P@Range@#dovrebbe salvare un mucchio.
Martin Ender,

1

Haskell, 121 byte

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)

1
(\(_,x)->x)è snd, (\(x,_)->p x)è (p.fst). Entrambi fste sndsono in preludio, quindi non c'è bisogno di importazioni.
Laikoni,

Non utilizzare backticks troppo spesso : r x=elem x$take x s. Tuttavia, in questo caso si può andare pointfree (l'introduzione di nuovo backticks) e omettere il nome della funzione: elem<*>(`take`s).
nimi,



1

Matlab, 36 34 byte

Salvato 2 byte grazie a Tom Carpenter.

Un'implementazione molto ingenua che utilizza funzioni integrate:

isprime(x)&isprime(nzz(primes(x)))

1
Solo per Octave puoi anche salvare un ulteriore byte con(p=@isprime)(x)&p(nnz(primes(x)))
Tom Carpenter l'

1

Python 2 , 89 byte

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)

Provalo online!

Costrutti r, l'elenco dei numeri primi <= n; se n è primo, allora nè il len(r)primo. Quindi n è un superfice iff n in re len (r) in r.



0

Julia 0.6, 61 byte

ritorna 1 se x è un numero primo, 0 altrimenti.

senza usare una funzione di tipo isprime.

x->a=[0,1];for i=3:x push!(a,0i%(2:i-1))end;a[sum(a)]&a[x]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.