Входные данные:
Положительное целое число n, которое есть 1 <= n <= 25000
.
Выход:
- В этой последовательности мы начинаем с десятичного числа 1 / n .
- Затем мы берем сумму цифр до n -й цифры после запятой (1-индексированная); с последующей суммой цифр до ( n -1) ', затем ( n -2)' и т. д. Продолжайте, пока n не станет 1.
- Выход - сумма всех этих вместе взятых.
Например:
n = 7
1/7 = 0.1428571428...
7th digit-sum = 1+4+2+8+5+7+1 = 28
6th digit-sum = 1+4+2+8+5+7 = 27
5th digit-sum = 1+4+2+8+5 = 20
4th digit-sum = 1+4+2+8 = 15
3rd digit-sum = 1+4+2 = 7
2nd digit-sum = 1+4 = 5
1st digit = 1
Output = 28+27+20+15+7+5+1 = 103
Правила соревнований:
- Если десятичная дробь 1 / n не имеет n цифр после запятой, пропущенные будут считаться 0 (т
1/2 = 0.50 => (5+0) + (5) = 10
. Е. ). - Вы берете цифры без округления (то есть цифры
1/6
,166666
а не166667
)
Основные правила:
- К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Также, пожалуйста, добавьте объяснение, если это необходимо.
Первые 1 - 50 в последовательности:
0, 10, 18, 23, 10, 96, 103, 52, 45, 10, 270, 253, 402, 403, 630, 183, 660, 765, 819, 95, 975, 1034, 1221, 1500, 96, 1479, 1197, 1658, 1953, 1305, 1674, 321, 816, 2490, 2704, 4235, 2022, 3242, 2295, 268, 2944, 3787, 3874, 4097, 1980, 4380, 4968, 3424, 4854, 98
Последние 24990 - 25000 в последовательности:
1405098782, 1417995426, 1364392256, 1404501980, 1408005544, 1377273489, 1395684561, 1405849947, 1406216741, 1142066735, 99984
code-golf
sequence
number-theory
Кевин Круйссен
источник
источник
Ответы:
Желе , 9 байт
Довольно медленно, но коротко. Попробуйте онлайн! или проверьте первые 50 тестовых случаев .
Как это устроено
источник
Mathematica, 42 байта
или
или
объяснение
Возьмите пример из спецификации задачи. Мы хотим вычислить:
Переставляя, это:
где
.
скалярное произведение двух векторов.Это почти все решение.
Это дает нам первые
N
десятичные цифры1/N
(#&@@
извлекает первый элементRealDigits
результата, потому что это также возвращает смещение первой цифры, которое нас не волнует).Затем мы получаем список
N
сверху вниз,1
используя(#-Range@#+1)
либоRange[#,1,-1]
, или , оба из которых корочеReverse@Range@#
, и берём скалярное произведение.Вместо этого альтернативное решение использует
Accumulate
для вычисления списка всех сумм префиксов, а затем суммирует эти суммы префиксов сTr
.Так как это действительно быстро даже для больших входных данных, ниже приведен график разброса последовательности до
N = 100,000
(выполнение всех из них и их построение заняло некоторое время):Нажмите для увеличения версии.
Синяя линия - наивная верхняя граница
9 N (N+1) / 2
(если все десятичные цифры были9
), а оранжевая линия - ровно половина от этого. Неудивительно, что это прямо внутри основной ветви графика, поскольку статистически мы ожидаем, что средняя цифра будет 4,5.Тонкая линия точек графика, которые вы видите под основной ветвью, - это дроби, которые заканчиваются
...3333...
, поскольку все они расположены очень близко3 N (N+1) / 2
.источник
05AB1E ,
1211 байтПопробуйте онлайн! или набор тестов для первых 50 номеров.
объяснение
Более эффективная версия для опробования больших чисел на TIO
Разница с более короткой версией заключается в том, что здесь мы суммируем произведение цифр и обращение их основанного на 1 индекса вместо суммирования цифр в префиксах.
Попробуйте онлайн!
источник
Java 8,
181169166153142 байтаОбъяснение:
Попробуй это здесь.
источник
PHP,
6665 байтАдаптировано из этого ответа (также мной): Подразделение не очень маленьких чисел и предложенное им редактирование Йоргом Хюльсерманом. Используйте как:
edit: исправил ошибку для +1 байта и сложил присвоение $ a в $ argv [1] для -2 байтов для чистого 1 байта меньше.
источник
Scala, 84 байта
Ungolfed:
Объяснение:
Я мог бы сэкономить несколько байтов, используя способ, которым токенизируется компилятор: вызывая аргумент
&
, вы можете писать1 to&map
вместо1 to n map
. То же правило относится кdef?
.источник
Желе , 11 байт
TryItOnline
Первые 50
Слишком медленно для больших тестовых случаев.
Как?
источник
R⁵*
эквивалент слева направо, но потом увидел красивую прямую линию :)PHP, 76 байт
(Изменить -1 байт - Спасибо пользователю 59178 - ваше решение еще лучше)
источник
$c=blah
в первую частьfor(;;)
MATL, 19 байт
Попробуйте онлайн!
объяснение
источник
Groovy, 87 байт
Это было менее болезненно, чем я ожидал, и основано на моем ответе здесь :
объяснение
1.0g
- Используйте BigDecimal обозначения для одного..divide(n, n, 1)+""
- Разделить на n с точностью до n (только функция BigDecimal) и преобразовать в str.(...)[2..x+1].getChars()
- Получить подстроку текущей итерации в виде массива char..sum()-48*(x)
- Суммируйте значения ASCII символов и уменьшите на 48 для каждого элемента. Это превращает значение из цифры ASCII в целое число, существенно экономя байты*.toInteger()
.(1..n).collect{...}.sum()
- Выполните эту функцию, перебирая каждую из цифр в делении, получая их все в одном массиве и суммируя.Сохранено 2 байта и потерянная эффективность ...
Это более эффективная версия, которая не пересчитывает BigDecimal при каждой итерации.
источник
J, 27 байт
использование
Входные данные являются расширенным целым числом.
Производительность хорошая, и для больших тестовых случаев требуется всего около 3 секунд.
объяснение
источник
Желе , 10 байт
Не самый короткий подход , но довольно эффективный. Попробуйте онлайн! или проверьте все тесты .
Как это устроено
источник
Python 2, 90 байт
Не красиво, но сделано через деление с плавающей точкой, затем преобразование в строку и затем итеративный выбор индекса строки, чтобы получить треугольник чисел, затем выполнить понимание списка и преобразовать каждый символ в целое и, наконец, суммировать их все.
источник
JavaScript (ES6), 47 байт
Как это устроено
Этот ответ демонстрирует методику вычисления c десятичных цифр a / b :
Это станет отличной отправной точкой для этого испытания. Сначала мы можем немного изменить его, чтобы он вычислял b десятичных цифр 1 / b , переупорядочивая параметры и устанавливая значения по умолчанию:
Затем мы можем изменить это так, чтобы он вычислял сумму первых b десятичных цифр, а не объединял их (это устраняет
d
параметр):Мы почти на пути к решению; теперь нам нужно просто умножить каждую цифру на c + 1 :
Хм, это кажется немного длинным. Что если мы увеличим c на 1 для начала?
Это экономит один байт. И вот способ сохранить еще один:
И теперь у нас есть наш ответ.
f(7)
это 103,f(11)
это 270,f(1)
это ... 2? О, мы забыли учесть случай, когда a / b равен 1 на первой итерации (т.е. b равно 1). Давайте сделаем что-нибудь с этим:1 mod b всегда равно 1 , если только b не равно 1 , в этом случае это будет 0 . Наша программа теперь корректна для всех входных данных, на 47 байтов .
источник
Python 2, 49 байт
Проверьте это на Ideone .
источник
C, 53 байта
Ниже основной для сделать некоторый тест ...
источник
f(n,i,x,s){while(i)x=10*(x%n),s+=i--*(x/n);return s;}
длиной всего 53 байта.