Определение
Существует бесконечный ряд объединенных натуральных чисел (положительные целые числа, начиная с 1):
1234567891011121314151617181920212223...
Вызов
- Напишите программу на любом языке, который принимает номер позиции в качестве ввода и выводит цифры из этой позиции в строке, определенной выше.
- Номер позиции - произвольный размер положительного целого числа. То есть первая позиция равна 1, получая выходную цифру «1»
- Входные данные либо в десятичном виде (например, 13498573249827349823740000191), либо в электронной записи (например, 1.2e789), соответствующие положительному целому числу.
- Программа должна завершиться за разумное время (10 секунд на современном ПК / Mac), учитывая очень большой индекс в качестве входа (например, 1e123456 - то есть 1 с 123456 нулями). Таким образом, простой итерационный цикл не приемлем.
- Программа должна завершиться с ошибкой в 1 с, если дан неверный ввод. Например. 1,23e (недействительно) или 1,23e1 (равно 12,3 - не целое число)
- Можно использовать публичную библиотеку BigNum для анализа / хранения чисел и выполнения простых математических операций с ними (+ - * / exp). Байт-штраф не применяется.
- Самый короткий код выигрывает.
TL; DR
- Ввод: целое число
- Вывод: цифра в этой позиции в бесконечном ряду
123456789101112131415...
Некоторые приемочные тесты
в обозначении «Вход: выход». Все они должны пройти.
- 1: 1
- 999: 9
- 10000000: 7
- 1e7: 7 (аналогично строке выше)
- 13498573249827349823740000191: 6
- 1.1e10001: 5
- 1e23456: 5
- 1.23456e123456: 4
- 1e1000000: 0
- 1.23e: ошибка (неверный синтаксис)
- 0: ошибка (за пределами)
- 1.23e1: ошибка (не целое число)
Бонус!
Выведите номер позиции цифры внутри номера и сам номер выхода. Например:
13498573249827349823740000191: 6 24 504062383738461516105596714
- Это цифра '6' в позиции 24 номера '50406238373846151610559 6 714'
1e1000000: 0 61111 1000006111141666819445...933335777790000
- Цифра «0» в позиции 61111 длинного номера 999995, который я не собираюсь здесь включать.
Если вы выполнили бонусное задание, умножьте размер кода на 0,75
кредит
Это задание было дано на одном из собраний devclub.eu в 2012 году без требования большого количества. Следовательно, большинство представленных ответов были тривиальными петлями.
Повеселись!
code-golf
number
sequence
number-theory
metalim
источник
источник
1.23456e123456
произвольно наказывают языки, которые не могут обрабатывать такие значения естественным образом, и требуют, чтобы они выполняли обработку строк, которая является касательной к задаче.Ответы:
CJam , 78 байт
Программа имеет длину 104 байта и имеет право на бонус.
Новая строка чисто косметическая. Первая строка анализирует вход, вторая генерирует выход.
Попробуйте онлайн!
идея
Для любого натурального числа k существует 9 × 10 k-1 натуральных чисел с ровно k цифрами (не считая начальных нулей). Таким образом, если мы объединяем их все, мы получаем целое число 9 × n × 10 k-1 .
Теперь, объединяя все целые числа из n или менее цифр, получим целое число
цифры.
Для заданного входного значения q мы пытаемся определить наибольшее значение n , чтобы указанное выше выражение было меньше, чем q . Мы устанавливаем n: = ⌈log 10 q⌉-1 , затем n: = ⌈log 10 q⌉-2 и т. Д., Пока требуемое выражение не станет меньше q , вычитаем полученное выражение из q (получая r ) и сохраняем последнее значение п в л .
Теперь r задает индекс в конкатенации всех натуральных чисел из l + 1 цифр, что означает, что желаемым выходным значением является r% (l + 1) -я цифра r / (l + 1) -го целого числа l + 1 цифры.
Код (входной разбор)
Код (генерация вывода)
источник
CJam, 75 * 0,75 = 56,25
Это довольно быстро, одна итерация на цифру числа, которое содержит желаемую позицию. Я уверен, что в него можно играть гораздо чаще, оно довольно грубое.
Дайте позицию в качестве входа, выход:
Попробуйте онлайн .
источник
1.23e1
. Это ошибка, однако,1.23456e123456
поскольку вход не может быть представлен двойным. Кроме того, последние тестовые случаи занимают 3 минуты.