Trova Primes in Pi


30

I primi sono ovunque ...

si nascondono dentro Pi

3.141592653 58979 3238 462643 3832 795028841 971693993751

Prendiamo quei numeri primi!

La sfida

Dato come input un numero intero n>0, scopri quanti numeri primi sono nascosti all'interno delle prime ncifre diPi

Esempi

Perché n=3dovremmo cercare i numeri primi in [3,1,4]. Ci sono 2 Primes (3,31), quindi il tuo codice dovrebbe essere emesso 2
per n=10, le prime 10 cifre sono [3,1,4,1,5,9,2,6,5,3]e il tuo codice dovrebbe essere emesso 12perché [2, 3, 5, 31, 41, 53, 59, 653, 4159, 14159, 314159, 1592653]nascosto (e trovato!)

Casi test

input -> output

1->1  
3->2  
13->14  
22->28  
42->60  
50->93

150->197  
250->363  
500->895

Regole

Il codice deve essere in grado di trovare tutti i numeri primi almeno pern=50
Sì, è possibile hardcode le prime 50 cifre del Pise vi piacciono
le voci hardcoding le risposte non sono validi

Questo è Vince la risposta più breve in byte!


6
"se vuoi, puoi codificare le prime 50 cifre di Pi" . Primo problema risolto! Ora per il test della primalità golfata su numeri interi fino a 50 cifre ... O_o (Questa è una bella sfida, ma sono probabilmente necessari solidi calcoli o librerie matematiche.)
Arnauld

3
@totallyhuman Quella sequenza nemmeno in OEIS ancora! Tempo per la tua pretesa di fama?
Sanchises,

3
L'IMO che consente la codifica rigida dei primi 50 valori è dannoso per questa sfida. Questa sfida è fondamentalmente composta da due parti, 1) prova a comprimere i primi 50 valori o 2) in realtà fa la sfida.
JAD

2
Di solito in questo tipo di sfide, in cui il calcolo diventa più difficile / più lento / intensivo di memoria, è sufficiente che il programma funzioni in teoria, invece di impostare un limite arbitrario e consentire la codifica.
JAD

3
@BillSteihn L'aggiornamento delle regole dopo che ci sono diverse risposte è contrario allo spirito di questo sito Web. Hai pubblicato questa domanda nella sandbox ? Avresti avuto feedback molto presto sul fatto che sarebbero arrivate risposte codificate.
Olivier Grégoire,

Risposte:


20

05AB1E ,  10  8 byte

-2 byte grazie ad Adnan ( pvettorializza)

<žsþŒÙpO

Provalo online! (funzionerà fino a n = 98413 ma sarà molto lento anche per n = 50 a causa della necessità di testare numeri così grandi per la primalità - TIO scade a 60 secondi per n = 50.)

Come?

<žsþŒÙpO - implicitly push input, n
<        - decrement = n-1
 žs      - pi to that many decimal places (i.e. to n digits)
   þ     - only the digits (get rid of the decimal point)
    Œ    - all sublists
     Ù   - unique values
      p  - is prime? (vectorises) 1 if so, 0 otherwise
       O - sum
         - implicitly print the top of the stack

<žsþŒÙpOdovrebbe funzionare per 8 byte
Adnan il

Ah sì, pvettorializza grazie!
Jonathan Allan,

2
Sì! Finalmente una risposta molto breve al golf che ho capito davvero! : D
Fabian Röling,

11

Mathematica, 76 byte

Tr[1^Union@Select[FromDigits/@Subsequences@#&@@RealDigits[Pi,10,#],PrimeQ]]&

Oh, no giusto, non ho familiarità con il golf Mathematica. : P (+1)
totalmente umano il

@totallyhuman Abbiamo pubblicato questo contemporaneamente. questo è così strano!
J42161217

Ho giocato a golf la mia risposta usando alcuni dei trucchi sintattici ma ho mantenuto le funzioni che avevo usato prima. Spero non ti dispiaccia.
totalmente umano il

Tr[1^...]È un modo intelligente di trovare la lunghezza della lista, bello!
numbermaniac,

6

Mathematica, 104 97 90 byte

Length@DeleteDuplicates@Select[FromDigits/@Subsequences@First@RealDigits[Pi,10,#],PrimeQ]&

Hahahaha, sono riuscito a far funzionare questo. Non ho idea di come usare Mathematica. XD

Ingresso:

[50]

1
hai pubblicato qualche secondo davanti a me. e le nostre risposte sono molto simili! +1
J42161217

Sei sicuro dei numeri che hai appena pubblicato (ricontrolla l'arrotondamento delle cifre) Vedo risultati leggermente diversi usando Python e sympy
Jonathan Allan

@JonathanAllan 50 96L'OP afferma che 50 cifre contengono 93 numeri primi, quindi l'accuratezza di Sympy potrebbe essere off ..?
totalmente umano il

@JonathanAllan Sympy sta usando un test di primalità probabilistico o deterministico? (Stessa domanda per Mathematica's PrimeQ.)
Arnauld

@Arnauld buon punto, non sono sicuro.
Jonathan Allan,

3

Python 3 , 274 237 207 194 189 byte

-37 byte grazie a Wheat Wizard! -14 byte grazie a Mr.Xcoder.

Hardcodifica le prime 50 cifre di pi ma calcola manualmente tutto il resto.

x=int(input());l="31415926535897932384626433832795028841971693993751"[:x]
print(sum(all(i%m for m in range(2,i))for i in{int(i)for w in range(x)for i in[l[j:j-~w]for j in range(x-w)]}-{1}))

Provalo online!



l=list("31415...)dovrebbe salvare ~ 40 caratteri. E quella modifica ti consente di sostituirla map(str,i)con just i.
AShelly,


195 byte rimuovendo uno strano codice.
Mr. Xcoder,

194 byte dichiarandolen(l)
Mr. Xcoder il

1

R, 156 123 byte

cat(cumsum(c(1,1,0,1,1,4,1,0,0,3,0,0,2,7,3,1,0,3,0,0,0,0,0,0,4,1,0,6,0,3,2,0,0,0,0,0,0,4,3,3,6,0,4,8,2,5,3,6,0,5))[scan()])

Soluzione super interessante. Lavorando su uno proprio.

Salvato 33 byte grazie a @Giuseppe.

R (+ numeri e gmp), 198 byte

function(n,x=unique(gmp::as.bigz(unlist(sapply(1:n,function(x)substring(gsub("[.]","",numbers::dropletPi(50)),x,x:n))))))min(length(x),sum(sapply(sapply(x[x>0&!is.na(x)],gmp::factorize),length)==1))

Soluzione corretta. Accetta ncome input.

Utilizza numbers::dropletPi(50)per generare i primi 50 decimali di pi. gsubrimuove il punto decimale. substringprende ogni possibile sottostringa (sorpresa sorpresa) di pi fino a n.

La lista restituita è appiattito e convertito in gmp's bigzformato. Questo formato è necessario per memorizzare numeri interi di lunghezza 50. uniqueaccetta i valori univoci di quel vettore. Questo risultato viene memorizzato in x.

Quindi controlliamo la primalità. Questo è difficile, perché ci sono un sacco di casi limite e fastidi:

  • Per l'alto n, c'è un 0in pi. Questo porta a sottostringhe con uno zero iniziale. as.bigzproduce NAs con quello, che deve essere rimosso.

  • Su una nota simile, la sottostringa "0"si arresta in modo anomalo gmp::factorize, quindi deve essere rimossa.

  • Per n=1, x = 3. Che di per sé è ok, ma la bigzrappresentazione di 3è iterabile, quindi sapplyverrà confusa e riferirà 16 numeri primi. A tal fine prendiamo il minimo della lunghezza del vettore xe la quantità di numeri primi in esso.

  • gmp::isprimenon riesco a gestire in modo affidabile numeri grandi in modo affidabile. Quindi invece usiamo gmp::factorizee controlliamo che la lunghezza dell'output sia 1.

Quindi, in tutto, rimuoviamo 0e NAda x. Fattorizziamo tutto xe controlliamo la lunghezza. Contiamo il numero di occorrenze di 1e restituiamo il file min(occurences, length(x)).


eccoti! Ora vediamo se qualcuno là fuori può superarlo con una soluzione più interessante. potresti essere tu!

usa al cumsum(c(1,1,0,1,1,4,1,0,0,3,0,0,2,7,3,1,0,3,0,0,0,0,0,0,4,1,0,6,0,3,2,0,0,0,0,0,0,4,3,3,6,0,4,8,2,5,3,6,0,5))posto del tuo vettore per 123 byte :)
Giuseppe,

@Giuseppe Bello. Quella "compressione" batterà sicuramente qualsiasi soluzione legittima.
JAD

Penso che sia impossibile in R senza hardcoding o introducendo un altro pacchetto poiché R ha solo 32 bit, che sicuramente non rappresenteranno un numero intero di 50 cifre.
Giuseppe,

1
Sì, potrei pensarci un po 'di più. 82 byte hardcoded
Giuseppe,

0

Gelatina , 59 32 byte

-27 byte grazie a Erik the Outgolfer.

“!⁶⁷¬,6½ạEC.wʠ€Ẉ!+Ẉfṭ¡’Ṿḣ³ẆVQÆPS

Provalo online!

Spiegazione

“...’Ṿḣ³ẆVQÆPS

“...’           compressed string that evaluates to first 50 digits of pi (314159...)
     Ṿ          uneval; stringify
      ḣ³        first n characters of the string where n is the first command-line argument
        Ẇ       all sublists
         V      convert all elements to integers
          Q     deduplicate
           ÆP   convert all prime elements to 1 and others to 0
             S  sum

Perché hai inviato questo spam con le risposte?
Zacharý,

Perché nessun altro stava rispondendo, e ho comunque colpito il limite. : P
totalmente umano il
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.