Encontre números dentro da constante Copeland – Erdős


17

fundo

A constante Copeland – Erdős é a concatenação de "0". com as 10 representações de base dos números primos em ordem. Seu valor é

0.23571113171923293137414...

Veja também OEIS A033308 .

Copeland e Erdős provaram que este é um número normal . Isso implica que todo número natural pode ser encontrado em algum momento da expansão decimal da constante de Copeland-Erdős.

O desafio

Dado um número inteiro positivo, expresse-o na base 10 (sem zeros à esquerda) e imprima o índice de sua primeira aparição na sequência de dígitos decimais da constante Copeland – Erdős.

Qualquer formato razoável de entrada e saída é permitido, mas a entrada e a saída devem estar na base 10. Em particular, a entrada pode ser lida como uma string; e nesse caso, pode-se supor que não contenha zeros à esquerda.

A saída pode ser baseada em 0 ou em 1, iniciando no primeiro decimal da constante.

Os resultados reais podem ser limitados por tipo de dados, memória ou poder de computação e, portanto, o programa pode falhar em alguns casos de teste. Mas:

  • Deveria funcionar em teoria (ou seja, sem levar em conta essas limitações) para qualquer entrada.
  • Na prática, deve funcionar pelo menos nos quatro primeiros casos e, para cada um deles, o resultado deve ser produzido em menos de um minuto.

Casos de teste

A saída é dada aqui como baseada em 1.

13       -->         7   # Any prime is of course easy to find
997      -->        44   # ... and seems to always appear at a position less than itself
999      -->      1013   # Of course some numbers do appear later than themselves
314      -->       219   # Approximations to pi are also present
31416    -->     67858   # ... although one may have to go deep to find them
33308    -->     16304   # Number of the referred OEIS sequence: check
36398    -->     39386   # My PPCG ID. Hey, the result is a permutation of the input!
1234567  -->  11047265   # This one may take a while to find


Ok, então qual é o critério vencedor?
user8397947

Considerando as regras detalhadas sobre E / S, vou assumir que isso é código golf e aplicar a tag. Espero que seja isso que você tinha em mente.
Dennis19 /

@ Dennis Sim, desculpe, eu esqueci. Graças para edição
Luis Mendo

Respostas:


6

05AB1E , 14 bytes

Usa saída indexada em 0 . As funções principais no osabie são muito ineficientes. Código:

[NØJD¹å#]¹.Oð¢

Explicação:

[       ]        # Infinite loop...
 N               # Get the iteration value
  Ø              # Get the nth prime
   J             # Join the stack
    D            # Duplicate this value
     ¹å#         # If the input is in this string, break out of the loop
         ¹.O     # Overlap function (due to a bug, I couldn't use the index command)
            ð¢   # Count spaces and implicitly print

Usa a codificação CP-1252 . Experimente online! .


7

Python 2, 64 bytes

f=lambda n,k=2,m=1,s='':-~s.find(`n`)or f(n,k+1,m*k*k,s+m%k*`k`)

Retorna o índice baseado em 1. Teste em Ideone .


5

Geléia , 17 bytes

ÆRDFṡL}i
Ḥçßç?
çD

Retorna o índice baseado em 1. Experimente online! ou verificar a maioria dos casos de teste .

Eu verifiquei o último caso de teste localmente; Demorou 8 minutos e 48 segundos.

Como funciona

çD        Main link. Argument: n (integer)

 D        Decimal; yield A, the array of base 10 digits of n.
ç         Call the second helper link with arguments n and A.


Ḥçßç?     Second helper link. Left argument: n. Right argument: A.

Ḥ         Unhalve; yield 2n.
    ?     If...
   ç        the first helper link called with 2n and A returns a non-zero integer:
 ç            Return that integer.
          Else:
  ß           Recursively call the second helper link with arguments 2n and A.


ÆRDFṡL}i  First helper link. Left argument: k. Right argument: A.

ÆR        Prime range; yield the array of all primes up to k.
  DF      Convert each prime to base 10 and flatten the resulting nested array.
     L}   Yield l, the length of A.
    ṡ     Split the flattened array into overlapping slices of length l.
       i  Find the 1-based index of A in the result (0 if not found).

Versão alternativa, 11 bytes (não concorrente)

ÆRVw³
ḤÇßÇ?

O wátomo não existia quando este desafio foi lançado.Experimente online!

Como funciona

ḤÇßÇ?  Main link. Argument: n (integer)

Ḥ      Unhalve; yield 2n.
    ?  If...
   Ç     the helper link called with argument 2n returns a non-zero integer:
 Ç         Return that integer.
       Else:
  ß      Recursively call the main link with argument 2n.


ÆRVw³  Helper link. Argument: k (integer)

ÆR     Prime range; yield the array of all primes up to k.
  V    Eval; concatenate all primes, forming a single integer.
    ³  Yield the first command-line argument (original value of n).
   w   Windowed index of; find the 1-based index of the digits of the result to
       the right in the digits of the result to the left (0 if not found).

4

Na verdade, 19 bytes

╗1`r♂Pεj╜@íu`;)╓i@ƒ

Pega uma string como entrada e gera o índice baseado em 1 da substring

Experimente online!

Explicação:

╗1`r♂Pεj╜@íu`;)╓i@ƒ
╗                    push input to register 0
  `r♂Pεj╜@íu`;)      push this function twice, moving one copy to the bottom of the stack:
   r♂Pεj               concatenate primes from 0 to n-1 (inclusive)
        ╜@íu           1-based index of input, 0 if not found
1              ╓     find first value of n (starting from n = 0) where the function returns a truthy value
                i@   flatten the list and move the other copy of the function on top
                  ƒ  call the function again to get the 1-based index

3

Julia, 55 bytes

\(n,s="$n",r=searchindex(n|>primes|>join,s))=r>0?r:3n\s

Retorna o índice baseado em 1. Conclui todos os casos de teste em menos de um segundo. Experimente online!


Existe uma razão para você mudar os primos para o limite superior 3e não, por exemplo, para 2? Além disso, existe uma maneira de estendê-lo para trabalhar 0com entradas menores que ...=r>0?r:3(n+9)\s?
charlie

3foi um pouco mais rápido do que 2nos meus testes e não aumentou a contagem de bytes. Para entrada 0, você poderia usar -~n, mas seria muito mais lento.
Dennis

Obrigado, -~3n\s(== (3n+1)\s) é bom o suficiente.
charlie


2

J , 37 bytes

(0{":@[I.@E.[:;<@":@p:@i.@]) ::($:+:)

A entrada é fornecida como um número inteiro de base 10 e a saída usa indexação baseada em zero.

Uso

   f =: (0{":@[I.@E.[:;<@":@p:@i.@]) ::($:+:)
   f 1
4
   f 13
6
   f 31416
67857

Explicação

Essa primeira chamada trata o verbo como uma mônada, mas as chamadas subsequentes que podem ocorrer recursivamente o tratam como uma díade.

0{":@[I.@E.[:;<@":@p:@i.@]  Input: n on LHS, k on RHS
                         ]  Get k
                      i.@   Get the range [0, 1, ..., k-1]
                   p:@      Get the kth prime of each
                ":@         Convert each to a string
              <@            Box each string
           [:;              Unbox each and concatenate to get a string of primes
     [                      Get n
  ":@                       Convert n to a string
      I.@E.                 Find the indices where the string n appears in
                            the string of primes
0{                          Take the first result and return it - This will cause an error
                            if there are no matches

(...) ::($:+:)  Input: n on RHS, k on LHS
(...)           Execute the above on n and k
      ::(    )  If there is an error, execute this instead
           +:   Double k
         $:     Call recursively on n and 2k

11
Você pode provar que isso funciona?
Freira vazando

@LeakyNun Ah, sim, é verdade, tecnicamente funciona apenas para os casos de teste, mas pode não ser encontrado nos primeiros n primos.
miles

Ele não funciona para n = 1, já que o primeiro primo é 2 e você precisa dos cinco primeiros primos para obter a primeira ocorrência de um 1.
miles

1

PowerShell v2 +, 90 bytes

for($a="0.";!($b=$a.IndexOf($args)+1)){for(;'1'*++$i-match'^(?!(..+)\1+$)..'){$a+=$i}}$b-2

Combina a lógica da minha Encontre o número na resposta constante de Champernowne , juntamente com o método de geração principal de minha Impressão do enésimo primo que contém n resposta e subtrai 2para gerar o índice adequadamente (ou seja, sem contar o0. no início).

Recebe a entrada como uma sequência. Encontra o que 999está em cerca de sete segundos na minha máquina, mas o que 33308está em um pouco mais ( editar - desisti depois de 90 minutos ). Teoricamente, deve funcionar com qualquer valor até o índice [Int32]::Maxvalueaka 2147483647, pois esse é o comprimento máximo das seqüências .NET. No entanto, provavelmente ocorrerá problemas de memória muito antes disso.

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.