Definição
Há uma linha infinita de números naturais concatenados (números inteiros positivos, começando com 1):
1234567891011121314151617181920212223...
Desafio
- Escreva um programa em qualquer idioma, que aceite o número da posição como uma entrada e emita um dígito dessa posição na linha definida acima.
- O número da posição é um número inteiro positivo de tamanho arbitrário. Essa é a primeira posição é 1, produzindo o dígito de saída '1'
- A entrada é decimal (por exemplo: 13498573249827349823740000191) ou a notação eletrônica (por exemplo: 1.2e789) corresponde ao número inteiro positivo.
- O programa precisa terminar em um tempo razoável (10 segundos no PC / Mac moderno), dado um índice muito grande como entrada (por exemplo, 1e123456 - ou seja, 1 com 123456 zeros). Portanto, um loop de iteração simples não é aceitável.
- O programa deve terminar com um erro em 1 s, se receber alguma entrada inválida. Por exemplo. 1.23e (inválido) ou 1.23e1 (igual a 12.3 - não um número inteiro)
- Não há problema em usar a biblioteca pública do BigNum para analisar / armazenar números e executar operações matemáticas simples neles (+ - * / exp). Nenhuma penalidade de byte aplicada.
- O menor código vence.
TL; DR
- Entrada: número inteiro bignum
- Saída: dígito nessa posição em linha infinita
123456789101112131415...
Alguns casos de teste de aceitação
na notação "Input: Output". Todos eles devem passar.
- 1: 1
- 999: 9
- 10000000: 7
- 1e7: 7 (igual à linha acima)
- 13498573249827349823740000191: 6
- 1.1e10001: 5
- 1e23456: 5
- 1.23456e123456: 4
- 1e1000000: 0
- 1.23e: erro (sintaxe inválida)
- 0: erro (fora dos limites)
- 1.23e1: erro (não um número inteiro)
Bônus!
Digite o número da posição do dígito dentro do número e o próprio número de saída. Por exemplo:
13498573249827349823740000191: 6 24 504062383738461516105596714
- Esse é o dígito '6' na posição 24 do número '50406238373846151610559 6 714'
1e1000000: 0 61111 1000006111141666819445...933335777790000
- O dígito '0' na posição 61111 do número longo de 999995 dígitos que não vou incluir aqui.
Se você cumprir a tarefa de bônus, multiplique o tamanho do seu código por 0,75
Crédito
Essa tarefa foi realizada em uma das reuniões do devclub.eu no ano de 2012, sem a necessidade de um grande número. Portanto, a maioria das respostas enviadas foram loops triviais.
Diverta-se!
1.23456e123456
punem arbitrariamente linguagens que não podem processar esses valores de forma nativa e exigem que eles façam o processamento de strings que é tangencial ao desafio.