Substrings de Champernowne inversos

8

A constante de Champernowne é o número irracional 0,1234567891011 ... estendendo-se ad infinum.

Já fizemos uma pergunta sobre isso antes. Mas essa pergunta é sobre sua recíproca, conhecida como Inversa Inversa de Champernowne. Isso é aproximadamente 8,10000007.

Dada uma cadeia de caracteres entre um e três dígitos (cada cadeia de três dígitos aparece nas primeiras 10.000 casas decimais) inclusive, forneça o número de casas decimais na parte decimal da Inversa Champernowne Constante que precede a primeira aparição dessa cadeia.

Construções internas que realizam isso diretamente ou geram aproximações de qualquer uma dessas constantes são proibidas, mas construções internas para aritmética de precisão arbitrária ainda são permitidas.

Isso é código de golfe, então o programa mais curto, em bytes, vence.

Casos de teste:

1 0
2 52
3 13
4 29
5 36
6 7
7 8
8 27
9 23
10 0
100 0
998 187
999 67
01 321
001 689
010 418
SuperJedi224
fonte
1
Você poderia publicar um arquivo com os primeiros 10.000 dígitos constantes de Champernowne inversos?
orlp
@orlp gist.github.com/SuperJedi224/9c9adad78d872e4d568f a lugares 10.000 decimais (o seu programa só deve olhar para a parte à direita do ponto decimal)
SuperJedi224
O resultado pode ser baseado em 1?
Luis Mendo
@LuisMendo As especificações atualmente ditam o 0
SuperJedi224

Respostas:

3

MATL , 37 bytes

Obrigado a @AndrasDeak por sua ajuda com a vpafunção de Octsympy !

'1/'1e4:"@V]N$h1e4H$Y$t32>)I0h)jXf1)q

EDIT (11 de junho de 2016): devido a alterações no idioma, substitua 0por Jno código. O link abaixo inclui essa modificação

Experimente online!

Demora um pouco no compilador online (menos de 1 minuto).

'1/'        % literal string
1e4:        % array [1,2,...,1e4]
"           % for each number in that array
  @V        % push number and convert to string
]           % end loop
N$h         % concatenate all strings
1e4H$Y$     % compute 1/123456789101112... as a string with 1e4 significant digits
t32>)       % remove unwanted spaces and newlines in the output string
I0h)        % remove the first two characters ('8.')
j           % input string
Xf          % find indices of occurrences of input string within computed string
1)          % take first index
q           % subtract 1
Luis Mendo
fonte
2

Ruby, 69 67 bytes

->x{"#{1/BigDecimal.new(?.+[*1..9999]*'')}".index(x)-3}

Pontuação: 55 bytes do código fonte + 12 para o -rbigdecimalsinalizador.

Bem direto. A única parte estranha é que o to_simplicitamente chamado pela #{}construção de BigDecimalretornos

0.81000000670 [...] 3036E1

portanto, é necessário subtrair 3 para obter o índice correto.

Maçaneta da porta
fonte
1

Python 2, 69 bytes

lambda s:str(10**30000/int("".join(map(str,range(3000))))).index(s)-1
orlp
fonte
Isso não funcionará para uma entrada "8".
negativo sete