Desafío:
Se supone que Pi es infinito. Eso significa que cada número está contenido dentro de la parte decimal de pi. Su tarea será tomar un número entero positivo en la entrada y devolver la posición de este número en dígitos pi en la salida.
Por ejemplo, si la entrada es 59
, volveremos4
He aquí por qué: buscaremos el número 59
en los dígitos de pi
3.14159265...
^^
El valor comienza en el cuarto dígito, por lo que la salida será 4
.
Algunos otros ejemplos:
input : 1 output : 1
input : 65 output : 7
input : 93993 output : 42
input : 3 output : 9
Reglas :
- No tiene que manejar dígitos que no existen dentro de los primeros 200 dígitos
- Las lagunas estándar están, como siempre, prohibidas.
- Esto es codegolf , por lo que gana menos bytes.
n
'índice indexado 0 '? Entonces los casos de texto regresarían en0, 6, 41, 8
lugar de1, 7, 42, 9
.Respuestas:
Python 2,
69757167 bytesGuardado 4 bytes debido a caird coinheringaahing .
No encontrar
3
en la posición cero cuesta62 bytes. La entrada se da como una cadena.Pruébalo en línea!
Versión sin límites
Python 2, 224 bytes
Usando una espita sin límites basada en la misma fórmula utilizada anteriormente.
Pruébalo en línea!
Versión más rápida
Una espita ilimitada mucho más rápida, basada en Ramanujan # 39 .
Pruébalo en línea!
fuente
Casco , 5 bytes
Pruébalo en línea!
Explicación
fuente
€
) con el primer elemento (los 3 primeros) eliminado (t
) de los dígitos de PI (İπ
), conviértalo a base-10 (d
) y envíe a STDOUT (implícitamente).İπ
es una lista infinita de dígitos, creada con una fuente deExcel, 212 bytes
Excel solo maneja 15 decimales, por lo que pi solo está codificado. Este debería ser un límite superior bastante débil para este desafío.
fuente
CONCAT
una fórmula BBP para calcular los primeros 200 dígitos de π-base16 y buscar en hexadecimal? (No tengo 365, así que no puedo probar)CONCAT
,CODE
yMID
reduje la cadena de PI de 202 caracteres (comillas inc) a 143:CONCAT(CODE(MID(".ÜÁ£ÙÏ ¦®š«¦ ϲœÔ“ÇŧÝËŠº”ᱬ»—‡ÑÀ†œ¾ˆãÖœƒ°™¢•‘†ÏÒŽÐÖ³ Ҟ¯‰¦¬¼ß²º–ŸÈµ»¨Ñœ°‹‘‚ÔŠ›ÝÕ•Š·»À®–Þٶ݃Ñà",2*ROW(A1:A100)-1,2))-32)
Java 8,
615217202184182166165 bytes (calculado999200 dígitos)1 indexado
Pruébalo en línea.
El código incorporado de Java
Math.PI
tiene una precisión de 15 valores decimales, como muchos otros idiomas. Para tener más dígitos, deberá calcularlos usted mismo conBigIntegers
oBigDecimals
. Esto es una forma de hacerlo.Tal vez alguien pueda jugar golf por debajo de 211 bytes, jajaja.EDITAR: creó un puerto de la respuesta de Python 2 de @primo ( ¡ asegúrate de votarlo !), Así que calcular ser más corto que difícil -coded ya no es tan descabellado.
Solo 7 bytes más para jugar golf para que sea más corto.-15 bytes gracias a @Neil , lo que lo hace más corto que la respuesta codificada a continuación.
-36 bytes gracias a @primo .
-1 byte cambiando
java.math.BigInteger t=null,T=t.TEN.pow(200),r=T;
avar T=java.math.BigInteger.TEN.pow(200);var r=T;
, porquevar
es 1 byte más corto quenull
(tengo que amar el nuevo Java 10).Explicación:
Java 8, 211 bytes (200 dígitos codificados)
0 indexado
Pruébalo en línea.
fuente
!p.equals(t.ONE)
¿quizás? Además,indexOf(n,1)-1
creo que funciona. O guarde 2 bytes y hágalo 1 indexado.indexOf
método que omite los primerosm
caracteres. TIL, gracias!p
por uno cada vez (for(int p=667;p-->1;)
), y luego multiplicar porp
y dividir porp-~p
.r
literalmente puede ser cualquier cosa, aunque los valores extremos requerirán más iteraciones. La mejor semilla (menos iteraciones) es en realidad4e200
.05AB1E , 6 bytes
Pruébalo en línea!
¿Cómo?
fuente
3
todos modosMATL ,
1615 bytesPruébalo en línea!
Explicación
fuente
Paquete de números R +, 52 bytes
Pruébalo en línea!
dropletPi
calcula los primeros 200 dígitos decimales depi
pero incluye un3.
al principio, por lo que eliminamos esosubstring
y luego lo combinamosregexec
, lo que devuelve el índice de la coincidencia junto con algunos metadatos sobre la coincidencia.fuente
regexpr(scan(),numbers::dropletPi(200))-2
?"if"
?3.
(supongo que tratamos con enteros, no reales en la entrada). Los ejemplos de prueba funcionan con esto.regexpr(3,numbers::dropletPi(200))-2
regresa-1
cuando debería regresar9
, pruébaloJalea , 23 bytes
Un enlace monádico que acepta una lista de caracteres (el entero para buscar) y devuelve el índice. Funciona para entradas contenidas dentro de los primeros 252 dígitos de la parte decimal de π.
Pruébalo en línea!
¿Cómo?
Utiliza la fórmula de Leibniz para π para calcular los primeros 253 dígitos, incluidos los primeros
3
(más cuatro dígitos incorrectos finales). El líder3
se deja caer a continuación, y se encuentra el índice de la entrada:Si prefiere una lista de dígitos como uso de entrada
⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊw
(también 23), mientras que si realmente desea darle un uso entero⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊwD
(para 24).fuente
BASH (GNU / Linux),
756766 bytesGuardado 1 byte gracias a Sophia Lechner, y 7 bytes gracias a Cows quack.
Este es un script de shell que toma un solo argumento, que es el número. Prueba con
Este script primero ejecuta una tubería de tres comandos:
El resultado de esta tubería se asigna a la variable de shell
a
, que luego se repite con cualquier cosa que no sea el primer número eliminado:Desafortunadamente,
bc
tiene la tendencia a romper las líneas de salida cuando se vuelven demasiado largas. Esto puede conducir a resultados incorrectos si el número que se encuentra no está en la primera línea. Puede evitar eso configurando la variable de entornoBC_LINE_LENGTH
:Esto desactiva la función de salto de línea por completo.
Obviamente, los dos últimos comandos pueden omitirse si se tolera otra salida.
Esto da un recuento de 48 bytes :
Con la salida resultante:
fuente
-l
y<<<
sin embargo.sed
omitirla (consulte la segunda parte de mi respuesta). Sin embargo, transformarme en un programa me dio 7 bytes, ¡así que gracias por eso! También he reemplazado eltr
/head
combo con magia variable de shell ahora para guardar otro byte.JavaScript,
197187-10: ¡Gracias Neil !
Toma una serie de enteros de base 36 de nueve dígitos, los convierte en base 10 y los concatena para crear los primeros 200 dígitos de pi.
fuente
x=>'50...'.replace(/.{9}/g,a=>parseInt(a,36)).search(x)+1
para guardar 10 bytes.Primera vez haciendo código golf. Use delegados y expresiones lambda para reducir las llamadas a funciones. V2 acorta el nombre de la clase en un solo byte.
[C #],
361355 bytesVersión formateada:
Ideone!
Nota: desconté la primera versión. Tenía 361 bytes, no 363 bytes.
[C #], tio versión 218 bytes
Pruébalo en línea!
fuente
using System;f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;
como una edición.Haskell ,
208120 bytesPruébalo en línea!
¡Muchas gracias a Jonathan Allan por sus sugerencias!
Versión anterior (208 bytes)
En realidad no sé cómo funciona el código anterior; Lo tomé de este documento y todo lo que implementé fue la parte de búsqueda.
g(1,0,1,1,3,3)
devuelve los dígitos de pi y es sorprendentemente eficiente (calcula 10 000 dígitos en tio.run en menos de 4s).La entrada es una lista que consta de los dígitos del número que se encuentra.
Pruébalo en línea!
fuente
l=4*sum[((-1)**x/(2*x+1))|x<-[0..1e6]]
, pero eso tarda 5 segundos en ejecutarse y el séptimo dígito ya está mal. Por lo tanto, podría no ser factible calcular 200 dígitos. Fue un ejercicio interesante de todos modos, ¡así que gracias!g1_ref
en la sección Generadores ilimitados más rápidos . El código es python.Haskell, 230 bytes
Usando la pereza para encontrar el número en cualquier parte de los dígitos infinitos de pi, no solo en los primeros 200 dígitos. Ah, sí, y te devuelve cada (¿infinidad de?) Instancia (s) del número, no solo la primera.
Ejemplos del desafío
Créditos
'p' es la secuencia infinita de dígitos pi, tomada de https://rosettacode.org/wiki/Pi#Haskell
fuente
SmileBASIC,
179164 bytesLos dígitos de pi están codificados y empaquetados en los valores ascii de los caracteres. 14 ->
CHR$(14)
, 15 ->CHR$(15)
, 92 ->\
, 65 ->A
, 35 ->#
.La cadena contiene caracteres no imprimibles, así que aquí están los bytes escritos en hexadecimal:
0E 0F 5C 41 23 59 4F 20 26 2E 1A 2B 26 20 4F 32 1C 54 13 47 45 27 5D 4B 69 52 00 61 31 2C 3B 17 00 4E 10 28 3E 56 14 59 62 3E 50 03 30 19 03 2A 75 00 43 62 15 30 00 56 33 20 52 1E 42 2F 00 5D 54 2E 00 5F 32 3A 16 1F 48 35 3B 28 51 1C 30 6F 4A 32 1C 29 00 1B 00 13 26 34 6E 37 3B 40 2E 16 5E 59 36 5D 00 26 13 06
En decimal, puedes ver los dígitos de pi:
14 15 92 65 35 89 79 32 38 46 26 43 38 32 79 50 28 84 19 71 69 39 93 75 105 82 0 97 49 44 59 23 0 78 16 40 62 86 20 89 98 62 80 3 48 25 3 42 117 0 67 98 21 48 0 86 51 32 82 30 66 47 0 93 84 46 0 95 50 58 22 31 72 53 59 40 81 28 48 111 74 50 28 41 0 27 0 19 38 52 110 55 59 64 46 22 94 89 54 93 0 38 19 6
fuente
Ruby ,
3735 bytesPruébalo en línea!
Nada especial, solo muestra la biblioteca incorporada. La salida está indexada en 0. La cadena Pi está formateada como
0.31415...e1
, por lo que necesitamos quitar los primeros 3 caracteres. Lae1
parte al final realmente no hace ningún daño, pero también se elimina, ya que de todos modos debemos proporcionar un valor de final de rango (o longitud de corte).fuente
Carbón ,
2715 bytesPruébalo en línea! El enlace es a la versión detallada del código. Funciona hasta casi 1000 dígitos. Explicación:
fuente
Japt ,
186177 bytesDado que Japt comparte la restricción Pi de 15 dígitos de JavaScript y shoco , la codificación utilizada por Japt no codifica números, se requieren algunas travesuras para la compresión.
Brevemente explicado, el comienzo es la siguiente cadena en forma codificada:
Que es una cadena donde cada letra es
'm' + corresponding digit of pi
. Probé todo el alfabeto y esa letra da la mejor compresión en unos pocos bytes.Los backticks le dicen a Japt que decodifique la cadena. El resto es bastante sencillo:
Emite un índice basado en 0 del fragmento coincidente.
Afeitó otros dos bytes gracias a Oliver .
Pruébalo en línea!
fuente
£X
con®
y}
conÃ
AWK -M,
131 119117 bytesUtiliza la
-M
bandera para cálculos de precisión arbitrarios. Agregadop=k=0
(5 bytes) al enlace TIO para permitir la entrada multilíneaPruébalo en línea!
Explicación:
fuente
sprintf
obtener los decimales. UsarCONVFMT
es definitivamente más limpio.-M
bandera"Jalea , 24 bytes
Pruébalo en línea!
Use una fórmula similar a Machin , específicamente 1/4 pi == tan -1 (1/2) + tan -1 (1/3).Use la fórmula pi / 2 == 1 + 1/3 × (1 + 2/5 × (1 + 3/7 × (1 + 4/9 × (...))))
fuente
ØP
en M?floor
. ¿Te importa si uso eso para publicar como respuesta en M?Python 2
239238229214 bytes-9 bytes debido a @primo
Utiliza el algoritmo Chudnovsky-Ramanujan para encontrar los primeros
1 millón de dígitos50000 dígitos de π (cambiar10**10**5
a10**10**6
más, pero lleva años ejecutarlos) y luego busca la cadena deseada.fuente
n=10**10**5
tarda unos 10 segundos).10**10**6
toma alrededor de 7 minutos en mi máquina ... Para ser justos,10**10**5
da los primeros 50000 dígitos, así que supongo que tampoco es tan malo :)gmpy2
, perobigfloat
ahorra una docena de bytes. La asignación dek
se puede combinark=b=0
si se muevek+=1
al inicio de la iteración.-(6*k-5)*(2*k-1)*(6*k-1)
se puede escribir de manera más sucinta comok*(k*(108-72*k)-46)+5
. Si declara Python 2, las//
divisiones de enteros se pueden reemplazar por/
, y tampoco se necesitan paréntesisprint
. El espacio también se puede eliminar enimport*
. Solo valida a 50000 dígitos, por cierto.n
ensqrt(10005*n)
parece ser el problema; mueve el punto decimal al lugar 50000. En caso de que esté interesado, aquí está mi propia implementación de Chudnovsky: ¡ Pruébelo en línea!Visual Basic - 114 bytes
Bien, primera presentación. ¡Se paciente conmigo!
Comentarios bienvenidos!
No me he limitado a las primeras 256 partes de PI ya que la pregunta dice "No tienes que hacerlo", no "No deberías" Espero que esté haciendo esto correctamente :)
fuente
Javascript 217 bytes (200 codificados)
fuente
PHP, 27 bytes
No es una respuesta muy seria, requiere un cambio en la configuración de php.ini ya que pi () está predeterminado a 14 dígitos, no a 200, pero por una vez la solución PHP es bastante elegante:
fuente
precision
etiqueta en php.ini solo altera la precisión de visualización, y en realidad no aumenta la precisión de las constantes definidas. testigoJulia 0.6 , 53 bytes
Establezca la precisión para BigFloats lo suficientemente alta, luego conviértala
pi
en una cadena y busque. Precisión de9^6
asas 159980 dígitos.Pruébalo en línea!
fuente
J, 25 bytes
Pruébalo en línea!
0-indexado
Toma la entrada como una cadena, +2 Bytes (
":
) si eso no está permitido.Explicación eventualmente.
fuente
Perl 5 con
-MMath::BigFloat+bpi
y-n
, 20 bytesPruébalo en línea!
No estoy seguro de donde el uso de
$>
soportes, ya que es laEFFECTIVE_USER_ID
que no es portátil, pero en esta TIO es de 1000 y satisface nuestras necesidades, por -1 bytes vs200
.fuente
Casco , 5 bytes
Pruébalo en línea!
fuente