Desafio:
Pi deveria ser infinito. Isso significa que todo número está contido na parte decimal de pi. Sua tarefa será pegar um número inteiro positivo na entrada e retornar a posição desse número em dígitos pi na saída.
Por exemplo, se a entrada for 59
, retornaremos4
Eis o porquê: procuraremos o número 59
nos dígitos de pi
3.14159265...
^^
O valor começa no quarto dígito, então a saída será 4
.
Alguns outros exemplos:
input : 1 output : 1
input : 65 output : 7
input : 93993 output : 42
input : 3 output : 9
Regras :
- Você não precisa manipular dígitos que não existem nos primeiros 200 dígitos
- As brechas padrão são, como sempre, proibidas.
- Este é um codegolf , portanto, menos bytes vencem.
n
índice indexado em 0 ? Portanto, os casos de texto retornariam em0, 6, 41, 8
vez de1, 7, 42, 9
.Respostas:
Python 2,
69757167 bytesGuardado 4 bytes devido a caird coinheringaahing .
Não encontrar
3
na posição zero custa62 bytes. A entrada é fornecida como uma sequência.Experimente online!
Versão não vinculada
Python 2, 224 bytes
Usando uma torneira ilimitada com base na mesma fórmula usada acima.
Experimente online!
Versão mais rápida
Uma torneira ilimitada muito mais rápida, com base no Ramanujan # 39 .
Experimente online!
fonte
Casca , 5 bytes
Experimente online!
Explicação
fonte
€
) com o primeiro item (os 3 principais) removido (t
) dos dígitos do PI (İπ
), converta-o para base-10 (d
) e faça a saída para STDOUT (implicitamente).İπ
é uma lista infinita de dígitos, criado com uma torneira ilimitada fonteExcel, 212 bytes
O Excel lida apenas com 15 casas decimais, portanto, pi é apenas codificado. Esse deve ser um limite superior bastante fraco para esse desafio.
fonte
CONCAT
e uma fórmula BBP para calcular os 200 primeiros dígitos do π-base16 e pesquisa em hexadecimal em vez disso? (Não tem 365, então não pode testar)CONCAT
,CODE
eMID
eu reduzi a corda PI de 202 caracteres (citações Inc) para 143:CONCAT(CODE(MID(".ÜÁ£ÙÏ ¦®š«¦ ϲœÔ“ÇŧÝËŠº”ᱬ»—‡ÑÀ†œ¾ˆãÖœƒ°™¢•‘†ÏÒŽÐÖ³ Ҟ¯‰¦¬¼ß²º–ŸÈµ»¨Ñœ°‹‘‚ÔŠ›ÝÕ•Š·»À®–Þٶ݃Ñà",2*ROW(A1:A100)-1,2))-32)
Java 8,
615217202184182166165 bytes (calculados999200 dígitos)Indexado 1
Experimente online.
O builtin do Java
Math.PI
tem uma precisão de 15 valores decimais, como muitas outras linguagens. Para ter mais dígitos, você precisará calculá-los comBigIntegers
ouBigDecimals
. Isso acima é uma maneira de fazê-lo ..Talvez alguém possa jogar golfe abaixo de 211 bytes, lol ..EDIT: Criou uma porta da resposta Python 2 do @primo (certifique-se de vomitá-lo!), Portanto, calcule ser mais curto do que difícil -coded não é mais tão rebuscado.
Apenas mais 7 bytes de golfe para que ele seja mais curto.-15 bytes graças a @Neil , tornando-o mais curto do que a resposta codificada abaixo!
-36 bytes graças a @primo .
-1 byte mudando
java.math.BigInteger t=null,T=t.TEN.pow(200),r=T;
paravar T=java.math.BigInteger.TEN.pow(200);var r=T;
, porquevar
é 1 byte menor quenull
(precisa amar o novo Java 10).Explicação:
Java 8, 211 bytes (200 dígitos codificados)
Indexado a 0
Experimente online.
fonte
!p.equals(t.ONE)
possivelmente? Além disso,indexOf(n,1)-1
funciona , eu acho. Ou salve 2 bytes e torne-o indexado em 1.indexOf
método que pula os primeirosm
caracteres. Até, obrigado!p
um por vez (for(int p=667;p-->1;)
) e depois multiplicarp
e dividir porp-~p
.r
pode literalmente ser qualquer coisa, embora valores extremos exijam mais iterações. A melhor semente (menos iterações) é realmente4e200
.05AB1E , 6 bytes
Experimente online!
Quão?
fonte
3
qualquer maneiraMATL ,
1615 bytesExperimente online!
Explicação
fonte
Pacote de números R +, 52 bytes
Experimente online!
dropletPi
calcula os primeiros 200 dígitos decimais de,pi
mas inclui um3.
no início, portanto, removemos issosubstring
e depois combinamos comregexec
, que retorna o índice da correspondência junto com alguns metadados sobre a correspondência.fonte
regexpr(scan(),numbers::dropletPi(200))-2
?"if"
?3.
(presumo que lidemos com números inteiros e não reais na entrada). Os exemplos de teste trabalham com isso.regexpr(3,numbers::dropletPi(200))-2
retorna-1
quando ele deve retornar9
, experimentá-loGelatina , 23 bytes
Um link monádico que aceita uma lista de caracteres (o número inteiro a ser encontrado) e retorna o índice. Funciona para entradas contidas nos primeiros 252 dígitos da parte decimal de π.
Experimente online!
Quão?
Isso usa a fórmula de Leibniz para π para calcular os primeiros 253 dígitos, incluindo os iniciais
3
(mais quatro dígitos incorretos à direita). O líder3
é descartado e o índice da entrada é encontrado:Se você preferir uma lista de dígitos como uso de entrada
⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊw
(também 23), e se você realmente quiser usar um número inteiro⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊwD
(para 24).fonte
BASH (GNU / Linux),
756766 bytesEconomizei 1 byte graças a Sophia Lechner e 7 bytes graças ao charlatão de vacas.
Este é um script de shell que usa um único argumento, que é o número. Teste com
Este script primeiro executa um pipeline de três comandos:
O resultado desse pipeline é atribuído à variável do shell
a
, que é repetida com qualquer coisa, exceto o primeiro número removido:Infelizmente,
bc
tem a tendência de interromper as linhas de saída quando elas se tornam muito longas. Isso pode levar a resultados incorretos se o número a ser encontrado não estiver na primeira linha. Você pode evitar isso definindo a variável de ambienteBC_LINE_LENGTH
:Isso desativa completamente o recurso de quebra de linha.
Obviamente, os dois últimos comandos podem ser omitidos se outra saída for tolerada.
Isso fornece uma contagem de 48 bytes :
Com a saída resultante:
fonte
-l
e no<<<
entanto.sed
também (consulte a segunda parte da minha resposta). No entanto, transformar em um programa me deu 7 bytes, então, obrigado por isso! Também substituí otr
/head
combo pela variável mágica do shell agora para salvar outro byte.JavaScript,
197187-10: Obrigado, Neil !
Pega uma série de números inteiros base 36 de nove dígitos, converte-os na base 10 e concatena-os para criar os primeiros 200 dígitos de pi.
fonte
x=>'50...'.replace(/.{9}/g,a=>parseInt(a,36)).search(x)+1
para salvar 10 bytes.Primeira vez fazendo código de golfe. Use expressões delegadas e expressões lambda para reduzir as chamadas de função. V2 encurta o nome da classe em um único byte.
[C #],
361355 bytesVersão formatada:
Ideone!
NB: eu contei mal a primeira versão. Tinha 361 bytes, não 363 bytes.
[C #], versão tio 218 bytes
Experimente online!
fonte
using System;f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;
como uma edição.Haskell ,
208120 bytesExperimente online!
Muito obrigado a Jonathan Allan por suas sugestões!
Versão antiga (208 bytes)
Na verdade, eu não sei como o código acima funciona; Eu tirei isso de deste artigo e tudo o que implementei foi a parte de pesquisa.
g(1,0,1,1,3,3)
retorna os dígitos de pi e é surpreendentemente eficiente (calcula 10.000 dígitos em tio.run em menos de 4s).A entrada é uma lista que consiste nos dígitos do número a ser encontrado.
Experimente online!
fonte
l=4*sum[((-1)**x/(2*x+1))|x<-[0..1e6]]
, mas isso leva 5s para ser executado e o 7º dígito já está errado. Portanto, pode não ser viável calcular 200 dígitos. Foi um exercício interessante de qualquer maneira, então obrigado!g1_ref
na seção Geradores mais rápidos e ilimitados . O código é python.Haskell, 230 bytes
Usando a preguiça para encontrar o número em qualquer lugar nos infinitos dígitos de pi, não apenas nos primeiros 200 dígitos. Ah, sim, e ele retorna todas as instâncias (infinitas?) Do número, não apenas o primeiro.
Exemplos do desafio
Créditos
'p' é o fluxo infinito de dígitos pi, obtido em https://rosettacode.org/wiki/Pi#Haskell
fonte
SmileBASIC,
179164 bytesOs dígitos de pi são codificados e compactados nos valores ascii dos caracteres. 14 ->
CHR$(14)
, 15 ->CHR$(15)
, 92 ->\
, 65 ->A
, 35 ->#
.A string contém caracteres não imprimíveis, então aqui estão os bytes escritos em 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
Em decimal, você pode ver os 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
fonte
Ruby ,
3735 bytesExperimente online!
Nada de especial, apenas mostrando a biblioteca embutida. A saída é indexada em 0. A string Pi é formatada como
0.31415...e1
, portanto, precisamos remover os 3 primeiros caracteres. Ae1
peça no final não causa nenhum dano, mas também é retirada, pois precisamos fornecer um valor de final de intervalo (ou comprimento da fatia) de qualquer maneira.fonte
Carvão ,
2715 bytesExperimente online! Link é a versão detalhada do código. Funciona até quase 1000 dígitos. Explicação:
fonte
Japt ,
186177 bytesComo o Japt compartilha a restrição Pi e shoco de 15 dígitos do Javascript , a codificação usada pelo Japt não codifica números, algumas travessuras são necessárias para a compactação.
Resumidamente explicado, o início é a sequência abaixo na forma codificada:
Qual é uma string em que cada letra está
'm' + corresponding digit of pi
. Testei o alfabeto inteiro e essa letra fornece a melhor compactação em alguns bytes.Os backticks dizem ao Japt para decodificar a string. O resto é bem direto:
Gera um índice baseado em 0 do fragmento correspondente.
Raspou mais dois bytes graças a Oliver .
Experimente online!
fonte
£X
por®
e}
comÃ
AWK -M,
131 119117 bytesUsa
-M
sinalizador para cálculos de precisão arbitrários. Adicionadop=k=0
(5 bytes) ao link TIO para permitir a entrada de várias linhasExperimente online!
Explicação:
fonte
sprintf
obter decimais. O usoCONVFMT
é definitivamente mais limpo.-M
bandeira"Gelatina , 24 bytes
Experimente online!
Use uma fórmula semelhante a Machin , especificamente 1/4 pi == tan -1 (1/2) + tan -1 (1/3).Use a fórmula pi / 2 == 1 + 1/3 × (1 + 2/5 × (1 + 3/7 × (1 + 4/9 × (...))))
fonte
ØP
em M?floor
. Se importa se eu usar isso para postar como resposta em M?Python 2
239238229214 bytes-9 bytes devido a @primo
Usa o algoritmo Chudnovsky-Ramanujan para encontrar os primeiros
1 milhão de dígitos50000 dígitos do π (mudança10**10**5
a10**10**6
mais, mas demora muito tempo para ser executado) e em seguida, procura-los para a cadeia desejada.fonte
n=10**10**5
leva cerca de 10s).10**10**6
leva cerca de 7 minutos na minha máquina .. Para ser justo,10**10**5
dá os primeiros 50000 dígitos, então acho que também não é tão ruim :)gmpy2
, masbigfloat
economiza uma dúzia de bytes. A atribuição dek
pode ser mescladak=b=0
se você passark+=1
para o início da iteração.-(6*k-5)*(2*k-1)*(6*k-1)
pode ser escrito de forma mais sucinta comok*(k*(108-72*k)-46)+5
. Se você declarar Python 2, as//
divisões inteiras poderão ser substituídas por/
e também não serão necessários parêntesesprint
. O espaço também pode ser removido dentroimport*
. Valida apenas para 50000 dígitos, btw.n
nosqrt(10005*n)
parece ser o problema; está movendo o ponto decimal para 50000º lugar. Caso você esteja interessado, aqui está minha própria implementação do Chudnovsky: Experimente online!Visual Basic - 114 bytes
Ok, primeira submissão. Vai com calma comigo!
Feedback bem-vindo!
Eu não restringi as primeiras 256 partes do PI, pois a pergunta diz "Você não precisa", não "Você não deveria" Espero que eu esteja fazendo isso corretamente :)
fonte
Javascript 217 bytes (200 codificado)
fonte
PHP, 27 bytes
Não é uma resposta muito seriada, requer uma alteração nas configurações do php.ini, pois o pi () tem como padrão 14 dígitos, não 200, mas desta vez a solução PHP é bastante elegante:
fonte
precision
tag no php.ini altera apenas a precisão da exibição e, na verdade, não aumenta a precisão das constantes definidas. testemunhaJulia 0.6 , 53 bytes
Defina a precisão do BigFloats alta o suficiente e depois converta
pi
em uma sequência e pesquise. Precisão de9^6
alças 159980 dígitos.Experimente online!
fonte
J, 25 bytes
Experimente online!
0-Indexado
Recebe entrada como uma sequência, +2 bytes (
":
), se isso não for permitido.Explicação eventualmente.
fonte
Perl 5 com
-MMath::BigFloat+bpi
e-n
, 20 bytesExperimente online!
Eu não tenho certeza onde o uso de
$>
arquibancadas, já que é oEFFECTIVE_USER_ID
que não é portátil, mas em TIO este é de 1000 e satisfaz a nossa exigência, para -1 byte vs.200
.fonte
Casca , 5 bytes
Experimente online!
fonte