Encontre Primos na Pi

30

Primos estão por toda parte ...

eles se escondem dentro de Pi

3.141592653 58979 3238 462643 3832 795028841 971693993751

Vamos pegar esses números primos!

O desafio

Dado como entrada um número inteiro n>0, descubra quantos números primos estão ocultos dentro dos primeiros ndígitos dePi

Exemplos

Pois n=3devemos procurar primos em [3,1,4]. Existem 2 primos (3,31), portanto, seu código deve gerar 2
Para n=10, os 10 primeiros dígitos são [3,1,4,1,5,9,2,6,5,3]e seu código deve gerar 12porque [2, 3, 5, 31, 41, 53, 59, 653, 4159, 14159, 314159, 1592653]foram ocultados (e encontrados!)

Casos de teste

entrada -> saída

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

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

Regras

Seu código deve ser capaz de encontrar todos os números primos, pelo menos paran=50
Sim, você pode codificar os 50 primeiros dígitos de Pise você gosta de
entradas codificar as respostas são inválidos

Este é o . A resposta mais curta em bytes ganha!


fonte
6
"você pode codificar os primeiros 50 dígitos do Pi, se quiser" . Primeiro problema resolvido! Agora, para o teste de primalidade golfed em até inteiros 50 dígitos ... O_o (Este é um desafio agradável, mas matemática sólida built-ins ou bibliotecas provavelmente são obrigatórios.)
Arnauld
3
@totallyhuman Essa sequência ainda nem no OEIS! Hora de sua reivindicação à fama?
Sanchises
3
A IMO, que permite a codificação codificada dos 50 primeiros valores, é prejudicial para esse desafio. Esse desafio é basicamente duas partes: 1) tente compactar os 50 primeiros valores ou 2) faça o desafio.
JAD 25/08
2
Normalmente, nesse tipo de desafio, em que o cálculo se torna mais difícil / mais lento / intensivo em memória, basta que o programa funcione teoricamente, em vez de definir um corte arbitrário e permitir a codificação.
JAD
3
@BillSteihn A atualização das regras após várias respostas é contrária ao espírito deste site. Você postou esta pergunta na Sandbox ? Você teria recebido um feedback muito cedo para que as respostas codificadas chegassem.
Olivier Grégoire

Respostas:

20

05AB1E ,  10  8 bytes

-2 bytes graças a Adnan ( pvetoriza)

<žsþŒÙpO

Experimente online! (funcionará até n = 98413, mas será muito lento, mesmo para n = 50, devido à necessidade de testar números tão grandes quanto à primalidade - o TIO atinge o tempo limite de 60 segundos para n = 50.)

Quão?

<ž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
Jonathan Allan
fonte
<žsþŒÙpOdeve funcionar para 8 bytes
Adnan
Ah sim pvectorises obrigado!
Jonathan Allan
2
Sim! Finalmente, uma resposta muito curta ao código de golfe que eu realmente entendo! : D
Fabian Röling 26/08/17
11

Mathematica, 76 bytes

Tr[1^Union@Select[FromDigits/@Subsequences@#&@@RealDigits[Pi,10,#],PrimeQ]]&
J42161217
fonte
Oh, não é justo, eu não estou familiarizado com o golfe Mathematica. : P (+1)
totallyhuman
@totallyhuman Publicamos isso ao mesmo tempo. isto é tão estranho!
precisa saber é o seguinte
Joguei minha resposta com alguns dos truques sintáticos, mas mantive as funções que usei antes. Espero que você não se importe.
totallyhuman
Tr[1^...]Essa é uma maneira inteligente de encontrar o comprimento da lista, legal!
numbermaniac
6

Mathematica, 104 97 90 bytes

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

Hahahaha, eu consegui fazer isso funcionar. Não faço ideia de como usar o Mathematica. XD

Entrada:

[50]
totalmente humano
fonte
1
você postou alguns segundos à minha frente. e nossas respostas são muito parecidas! 1
J42161217
Você tem certeza sobre os números que só postou (confira o dobro do arredondamento dos dígitos) Eu vejo resultados ligeiramente diferentes , utilizando Python e SymPy
Jonathan Allan
@ JonathanAllan 50 96O OP diz que 50 dígitos contêm 93 números primos, então a precisão do Sympy pode estar baixa ..?
totallyhuman
@JonathanAllan O Sympy está usando um teste de primalidade probabilístico ou determinístico? (Mesma pergunta para PrimeQ do Mathematica.)
Arnauld
@ Arnauld bom ponto, não tenho certeza.
Jonathan Allan
3

Python 3 , 274 237 207 194 189 bytes

-37 bytes graças ao Wheat Wizard! -14 bytes graças ao Mr.Xcoder.

Codifica os primeiros 50 dígitos do pi, mas calcula manualmente todo o 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}))

Experimente online!

totalmente humano
fonte
l=list("31415...)deve economizar ~ 40 caracteres. E essa mudança permite substituir map(str,i)por apenas i.
ASHelly
195 bytes removendo algum código estranho.
Sr. Xcoder
194 bytes declarandolen(l)
Sr. Xcoder
1

R, 156 123 bytes

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

Solução super interessante. Trabalhando em um bom.

Economizou 33 bytes graças a @Giuseppe.

R (+ números e gmp), 198 bytes

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

Solução adequada. Toman como entrada.

Usa numbers::dropletPi(50)para gerar as primeiras 50 casas decimais de pi. gsubremove o ponto decimal. substringtoma todas as substring possíveis (surpresa surpresa) de pi atén .

A lista retornada é achatada e convertida para gmpo bigzformato de. Este formato é necessário para armazenar números inteiros de comprimento 50. uniqueusa os valores exclusivos desse vetor. Este resultado é armazenado emx .

Depois, verificamos a primalidade. Isso é complicado, porque há muitos casos extremos e aborrecimentos:

  • Para alta n, existe um 0em pi. Isso leva a substrings com um zero à esquerda. as.bigzproduz NAs com isso, que deve ser removido.

  • Em uma nota semelhante, a substring "0"falhará gmp::factorize, e também precisará ser removida.

  • Para n=1, x = 3. O que por si só está ok, mas a bigzrepresentação de 3é iterável; portanto, sapplyficará confuso e relatará 16 primos. Para esse fim, tomamos o mínimo do comprimento do vetor xe a quantidade de números primos nele.

  • gmp::isprimeparece que não consegue lidar de maneira confiável com grandes números. Então, em vez disso, usamos gmp::factorizee verificamos se o comprimento da saída é 1.

Então, ao todo, removemos 0e NAde x. Nós fatoramos tudo xe verificamos o comprimento. Contamos o número de ocorrências 1e retornamos o min(occurences, length(x)).

JAD
fonte
aí está você! Agora vamos ver se alguém lá fora pode superar isso com uma solução mais interessante. poderia ser você!
usar 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)), em vez de seu vetor de 123 bytes :)
Giuseppe
@ Giuseppe Nice one. Essa 'compressão' definitivamente superará qualquer solução legítima.
JAD
Eu acho que é impossível no R sem codificação ou introdução de outro pacote, já que o R tem apenas 32 bits de ints, o que certamente não representa um número inteiro de 50 dígitos.
27517 Giuseppe
1
Sim, posso pensar um pouco mais sobre isso também. 82 bytes codificados permanentemente
Giuseppe
0

Geléia , 59 32 bytes

-27 bytes graças a Erik, o Outgolfer.

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

Experimente online!

Explicação

“...’Ṿḣ³Ẇ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
totalmente humano
fonte
Por que você enviou spam com respostas?
Zachary
Porque ninguém mais estava respondendo, e eu bati no representante de qualquer maneira. : P
totallyhuman