Encuentra números dentro de la constante de Copeland-Erd


17

Antecedentes

La constante de Copeland-Erd es la concatenación de "0". con las representaciones de base 10 de los números primos en orden. Su valor es

0.23571113171923293137414...

Ver también OEIS A033308 .

Copeland y Erdős demostraron que este es un número normal . Esto implica que cada número natural se puede encontrar en algún punto de la expansión decimal de la constante de Copeland-Erd.

El reto

Dado un entero positivo, expréselo en base 10 (sin ceros a la izquierda) y genere el índice de su primera aparición dentro de la secuencia de dígitos decimales de la constante de Copeland-Erd.

Se permite cualquier formato de entrada y salida razonable, pero la entrada y la salida deben estar en la base 10. En particular, la entrada se puede leer como una cadena; y en ese caso se puede suponer que no contiene ceros a la izquierda.

La salida puede estar basada en 0 o en 1, comenzando desde el primer decimal de la constante.

Los resultados reales pueden estar limitados por el tipo de datos, la memoria o la potencia informática, y por lo tanto, el programa puede fallar en algunos casos de prueba. Pero:

  • Debería funcionar en teoría (es decir, sin tener en cuenta esas limitaciones) para cualquier entrada.
  • Debería funcionar en la práctica durante al menos los primeros cuatro casos, y para cada uno de ellos el resultado debería producirse en menos de un minuto.

Casos de prueba

La salida se da aquí como basada en 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


Bien, ¿cuál es el criterio ganador?
user8397947

Teniendo en cuenta las reglas detalladas sobre E / S, voy a suponer que se trata de código de golf y aplicar la etiqueta. Espero que esto sea lo que tenías en mente.
Dennis

@ Dennis Sí, lo siento, lo olvidé. Gracias por editar
Luis Mendo

Respuestas:


6

05AB1E , 14 bytes

Utiliza salida indexada 0 . Las funciones principales en osabie son muy ineficientes. Código:

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

Explicación:

[       ]        # 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

Utiliza la codificación CP-1252 . Pruébalo en línea! .


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

Devuelve el índice basado en 1. Pruébalo en Ideone .


5

Jalea , 17 bytes

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

Devuelve el índice basado en 1. Pruébalo en línea! o verificar la mayoría de los casos de prueba .

He verificado el último caso de prueba localmente; Tardó 8 minutos y 48 segundos.

Cómo 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).

Versión alternativa, 11 bytes (no competitiva)

ÆRVw³
ḤÇßÇ?

El wátomo no existía cuando se publicó este desafío. Pruébalo en línea!

Cómo 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

En realidad, 19 bytes

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

Toma una cadena como entrada y genera el índice basado en 1 de la subcadena

Pruébalo en línea!

Explicación:

╗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

Devuelve el índice basado en 1. Completa todos los casos de prueba en menos de un segundo. Pruébalo en línea!


¿Hay alguna razón por la que desplazas los primos con el límite superior 3y no, por ejemplo, con 2? Además, ¿hay alguna manera de extenderlo para que funcione 0en una entrada más corta que ...=r>0?r:3(n+9)\s?
charlie

3fue un poco más rápido que 2en mis pruebas y no aumentó el recuento de bytes. Para la entrada 0, podría usar -~nen su lugar, pero sería mucho más lento.
Dennis

Gracias, -~3n\s(== (3n+1)\s) es lo suficientemente bueno.
charlie


2

J , 37 bytes

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

La entrada se proporciona como un entero de base 10 y la salida usa indexación basada en cero.

Uso

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

Explicación

Esta primera llamada trata el verbo como una mónada, sin embargo, las llamadas posteriores que pueden ocurrir recursivamente lo tratan como una díada.

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

1
¿Puedes probar que esto funciona?
Leaky Nun

@LeakyNun Oh, sí, es cierto, técnicamente solo funciona para los casos de prueba, pero es posible que no se encuentre en los primeros n primos.
millas

No funciona para n = 1 ya que el primer primo es 2 y necesita los primeros cinco primos para obtener la primera aparición de un 1.
millas

1

PowerShell v2 +, 90 bytes

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

Combina la lógica de mi Encontrar el número en la respuesta constante de Champernowne , junto con el método de generación principal de mi Imprima la enésima prima que contiene n respuesta, luego se resta 2para generar el índice de manera adecuada (es decir, sin contar 0.el inicio).

Toma la entrada como una cadena. Encuentra el que 999está en aproximadamente siete segundos en mi máquina, pero el que 33308está en un poco más de tiempo ( editar, me di por vencido después de 90 minutos ). Teóricamente debería funcionar para cualquier valor hasta el índice [Int32]::Maxvalueaka 2147483647, ya que esa es la longitud máxima de las cadenas .NET. Sin embargo, es probable que tenga problemas de memoria mucho antes de que eso suceda.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.