Задача:
Ваша задача, когда дано три входа:
- числитель
n
- знаменатель
d
- другое целое число,
x
Создайте программу / функцию, которая находит x
th-ю цифру числа после десятичного знака.
Технические характеристики:
- Диапазон
n
иd
находится между1
и2^31 - 1
включительно. - Диапазон
x
между1
и10,000,000
включительно.- Вы можете использовать индексирование на основе 1 или индексирование на основе 0 для
x
. Пожалуйста, укажите в своем ответе, какой из них вы используете.
- Вы можете использовать индексирование на основе 1 или индексирование на основе 0 для
n
может быть больше чемd
.n
,d
Иx
гарантированно будут положительными целыми числами (для 1-индекса версииx
, если вы решили использовать 0 на основе индексирования ,x
тоx
может быть0
).- Вы можете принимать входные данные любым разумным способом (то есть любым способом, который не является стандартной лазейкой).
Правила:
- Вы должны вернуть точную
x
цифру th, а не округленную - таким образом , например, не15
цифра th , но .1/6
7
6
- Ваша программа должна работать для всех
x
до 10 миллионов, если ваш язык не поддерживает десятичные числа до 10 миллионов мест.
Пример ввода / вывода:
В примере ввода используется индексирование на основе 0, что означает x
переход от 0
к 9,999,999
. Кроме того, «вход» записывается в виде строки с пробелами, разделяющими числа.
1 2 3: 0
5 6 0: 8
5 6 1: 3
1 6 15: 6 (not 7, as it's not rounded)
1 11 2: 0
1 10000 9999999: 0
11 7 1: 7
Ответы:
Python 2 , 25 байт
Порт моего ответа на Haskell, так как Python также поддерживает bignums по умолчанию. Как там,
x
1-х индексируется.Попробуйте онлайн! (одолжив обертку Кеертхана Прабхакарана.)
источник
Mathematica 33 байта
Индексирование на основе 1.
например, 10-миллионная цифра числа Пи справа от десятичной точки:
занимает около 2 секунд на моей старой машине.
Вы можете попробовать это онлайн на WolframAlpha (нажмите на знак равенства)
источник
Haskell , 26 байтов
Работает для всех тестовых случаев. Yay Bignums!
(n#d)x
беретInteger
с и возвращаетInteger
.x
1-индексирован.Попробуйте онлайн!
источник
PHP> = 7.1, 40 байт
bcdiv
Онлайн версия
источник
<br /> <b>Notice</b>: Uninitialized string offset: -1 in <b>[...][...]</b> on line <b>6</b><br />
Желе , 7 байт
Попробуйте онлайн!
Представление функции (но также работает как полная программа). Функции Jelly могут принимать только два аргумента напрямую; таким образом, я принимаю цифру для возврата в качестве левого аргумента, числитель в качестве правого аргумента и знаменатель из стандартного ввода (вместо использования третьего аргумента).
Люди, привыкшие к Jelly, могут знать, что полная программа может принимать более двух аргументов, но это приводит к тому, что вы теряете доступ к кратчайшему способу записи константного целого числа 10, что здесь довольно важно. Как таковой, этот вид смешанного ввода ощущается скорее как эксплойт, чем как реальная полезная игра в гольф; Я лично не согласен с этим, но правило о разрешении этого в настоящее время составляет +40 / -12, поэтому, пока оно в правилах, я могу также использовать это (и в значительной степени должно быть конкурентоспособным).
Левый аргумент 1 относится к цифре сразу после десятичной точки («цифра .1s»), аргумент от 2 к цифре .01с и т. Д.
объяснение
У Jelly есть арифметика произвольной точности на целых числах, поэтому, предварительно умножив на 10, мы эффективно перемещаем нужную цифру в позицию единиц, где ее гораздо легче извлечь.
источник
sed
-r
, 93131136байтовПопробуйте онлайн!
( Смотрите вывод в десятичном виде )
Принимает входные данные в унарной форме и выходные данные в одинарной форме, а программа индексируется 1. К счастью, этот вызов уже подготовил меня к этому.
Концепция похожа, оба реализуют долгое деление. Здесь я выполняю длительные
x
времена деления , гдеx
находится цифра после десятичной точки, которую я должен найти. После каждой итерации я отбрасываю предыдущие десятичные разряды, потому что они больше не нужны.Делая деление, программа в формате
dividend;divisor;x,result
.s/$/,/
добавляет эту запятую, запятая требуется, чтобы отделить результат от всего остальногоЗатем следует основной цикл программы
:d
метка ds/,.+/,/
удалить все после запятой:
пустой ярлыкs/(1+)(1*;\1;1*,)1{10}?/\21/
выполнить деление, добавляя 1 к результату каждую итерацию, одновременно удаляя блоки из 10 непрерывных 1 с в результатеt
переход на пустую метку, другими словами, цикл, пока дивиденд не будет исчерпанs/1*/&&&&&&&&&&/
умножьте дивиденд на 10, чтобы подготовиться к следующей итерацииta
ветвь для обозначения:a
обозначить a, эта строка и строка выше необходимы дляtd
работыs/1,/,/
вычесть 1 из хtd
условная ветвь к d, это срабатывает, если с момента последней условной ветки произошла успешная подстановка, посколькуs/1*/&&&&&&&&&&/
она всегда успешна,td
всегда будет срабатывать, но введя ветвь a, мы исправим это так, что она зависит только от предыдущей подстановкиs/.+,//
наконец, удалите все, кроме результатаисточник
Рубин ,
3433 байтаПопробуйте онлайн!
источник
REXX, 76 байт
(Не очень короткий, но думал, что он внесет изменения в REXX) Rexx основан на 1 по определению.
Объяснение:
Объединение 3 и 4 фактически делает его длиннее из-за изменения синтаксиса:
Для не REXX: строки и числа полностью взаимозаменяемы в REXX. Они определяются тем, как вы действуете на них. Таким образом, вы можете анализировать число, используя функции sting без преобразования. Например
возвращает 55, а не 2728!
источник
rexx main.rexx 1 2 3
. Вы должны упомянуть в своем ответе, что вход 1 индексирован.Пакетная, 70 байт
источник
Сборка Intel x86 на языке CPU, 50 байтов
грохот в носм
Для параметра 'c' диапазон начинается с 0; это будет 0..0xfffffffd. Если параметры b = 0 или c вне диапазона 0..0xfffffffd, он вернет -1
источник
Луа, 42 байта
источник
C,
4943 байтаАргумент 'i' - 0-индексирование. Тестовый код и результат
источник
Ява 7,
146139137133128122 байт-3 байта благодаря Эрику Outgolfer, я полностью забыл, что импорт не должен был быть на их собственной линии
-4 байта благодаря Qwerp-Derp за перемещение n% d в конструктор
-6 байт, спасибо Кевину Круйссену за удаление toString ()
Я надеюсь, что это, как подсчет байтов делается для функций Java с импортом
Использует класс Java BigDecimal, чтобы получить точное представление десятичного расширения. Обратите внимание, что это не самый быстрый исполняемый код, но он в конечном итоге дает правильный вывод для всех тестовых случаев. Ungolfed код:
Попробуйте онлайн!
источник
BigDecimal(n)
сBigDecimal(n%d)
, и избавиться отn=n%d
?.toString()
и использовать+""
вместо (с двумя дополнительными скобками).Clojure, 39 байт
анонимная функция с аргументами,
n,d,x
гдеx
используется одна основанная индексация.источник
F # (.NET Core) , 30 байтов
Попробуйте онлайн!
(используйте индексирование на основе 1)
источник
Groovy, 30 байт
х использует 1 на основе индексации.
Объяснение:
источник
Python 2 ,
50,44,40,36 байтПопробуйте онлайн!
источник
1,7,10000000
Рубин, 39 байт
источник
JavaScript (ES6), 34 байта
х основан на 0
источник
f(1,7,10000000)
, например.Python 2 , 32 байта
Использует 0-индексацию
Попробуйте онлайн!
Редактировать:
Откат к исходному решению, как видно из ответа Орджана Йохансена, что оно работает, но я больше не буду играть в гольф
источник
Groovy, 55 bytes
Explained using
1,11,2
:источник
Axiom,
71 6176 bytesn is 0-indexing [0..M]. Test code and result
источник
JavaScript (Node.js), 43 bytes, port
Try it online!
JavaScript (Node.js), 51 bytes
Try it online!
use Array rather than recursive to avoid stackoverflow
источник