21
1
Definition
There is infinite row of concatenated natural numbers (positive integers, starting with 1):
1234567891011121314151617181920212223...
Challenge
- Write program in any language, that accepts position number as an input, and outputs digit from that position in the row defined above.
- Position number is arbitrary size positive integer. That is first position is 1, yielding output digit '1'
- Input is either in decimal (eg. 13498573249827349823740000191), or e-notation (eg. 1.2e789) corresponding to positive integer.
- Program has to end in reasonable time (10 seconds on modern PC/Mac), given very large index as an input (eg. 1e123456 - that is 1 with 123456 zeroes). So, simple iteration loop is not acceptable.
- Program has to terminate with an error in 1 s, if given any invalid input. Eg. 1.23e (invalid), or 1.23e1 (equals to 12.3 - not an integer)
- It's ok to use public BigNum library to parse/store numbers and do simple mathematical operations on them (+-*/ exp). No byte-penalty applied.
- Shortest code wins.
TL;DR
- Input: bignum integer
- Output: digit at that position in infinite row
123456789101112131415...
Some acceptance test cases
in notation "Input: Output". All of them should pass.
- 1: 1
- 999: 9
- 10000000: 7
- 1e7: 7 (same as row above)
- 13498573249827349823740000191: 6
- 1.1e10001: 5
- 1e23456: 5
- 1.23456e123456: 4
- 1e1000000: 0
- 1.23e: error (invalid syntax)
- 0: error (out of bounds)
- 1.23e1: error (not an integer)
Bonus!
Output digit position number inside the number, and output number itself. For example:
13498573249827349823740000191: 6 24 504062383738461516105596714
- That's digit '6' at position 24 of number '504062383738461516105596714'
1e1000000: 0 61111 1000006111141666819445...933335777790000
- Digit '0' at position 61111 of 999995-digit long number I'm not going to include here.
If you fulfill the bonus task, multiply size of your code by 0.75
Credit
This task was given at one of devclub.eu gatherings in year 2012, without large number requirement. Hence, most answers submitted were trivial loops.
I really don't get what the challenge is. Are we supposed to take the input and output the number at that position? – The_Basset_Hound – 2015-08-05T14:32:36.900
Input: integer (in decimal or e-notation). Output: digit at that position in infinite row of natural numbers (concatenated). – metalim – 2015-08-05T14:47:49.683
What is the highest index our program needs to understand? How are we supposed to interpret numbers in scientific notation? – FUZxxl – 2015-08-05T14:52:50.230
Considering bonus task involves outputting the number itself, I'd set the limit at position 1e1000000 (1 followed by million zeroes), as the number at that point is megabyte long. "How to interpret scientific notation" - common sense applied. https://en.wikipedia.org/wiki/Scientific_notation#E_notation
– metalim – 2015-08-05T15:00:54.7971
This is OEIS sequence 33307.
– Tyilo – 2015-08-05T15:12:00.103Thanks for the info. Does it make outputting the number easier? – metalim – 2015-08-05T15:20:20.610
@metalim 1e1000000 seems absurdly large, most languages won't be able to calculate that high to due major precision errors. A more reasonable limit would be 2^64-1 or even 1e256. If we are required to supply this colossal numbers, can we use a BigInt library with no byte penalty? – Downgoat – 2015-08-05T15:21:18.250
2@vihan Using some public bignum library is acceptable. No penalty. Of course including the solution into library and using the library in one-liner is considering cheating. Common sense applies here. – metalim – 2015-08-05T15:22:53.990
Do we have to accept both e-notation and number-notation, or do we have the option to only support one or the other? – Claudiu – 2015-08-05T15:45:19.797
@Claudiu Both notations should be accepted. – metalim – 2015-08-05T15:51:48.773
Do the numbers in the output have to be separated by spaces or would, e.g., newlines be acceptable? – Dennis – 2015-08-05T20:04:03.960
1
Just wanted to show off a surprisingly concise F# solution, clocking in at 44 bytes. Granted, it can only handle indices up to 2^31-1 (and its still trying to compute that value as I write this). I'm not posting this though because it does indeed break the rules, but I'd say its pretty good for F#!
– Jwosty – 2015-08-05T21:31:29.4737The requirements to handle inputs like
1.23456e123456
arbitrarily punishes languages that cannot process such values natively and requires them to do string processing that is tangential to the challenge. – xnor – 2015-08-05T22:55:53.827@Dennis any readable output in decimal notation is acceptable, as long as it is clearly distinguished by a human. Outputting number as number of dots printed is not ok. – metalim – 2015-08-07T06:20:44.747
@xnor parsing is part of the challenge. Entering the input is meant to be done by a human. Hence, there's room for error or unusual input. – metalim – 2015-08-07T06:25:00.737
@metalim Would this way of presenting the output be acceptable? I think it's readable, but it contains a quote (which indicates that we're printing a character, not a number) and the order of the last two integers has been swapped.
– Dennis – 2015-08-07T14:27:44.223@Dennis sure. It is readable and clearly separated. – metalim – 2015-08-07T15:08:54.220
https://en.wikipedia.org/wiki/Champernowne_constant – Unihedron – 2018-03-05T15:01:55.950