С, 59 байт
⎕IO
{+/⍵|⍨{(⍎⍵↑R)+⍎⍵↓R}¨⍳⍴1↓R←⍕⍵}
is & Read n from stdin.
100p Initialise the current digit number to 1.
-- The main loop starts here --
::: Make several duplicates of n for later manipulation.
v+55g00< Starting top right, and ending bottom right, this
>>\1-:v routine calculates 10 to the power of the
^*+55\_$ current digit number.
% The modulo of this number gives us the initial digits.
\ Swap another copy of n to the top of the stack.
_\55+*v Starting bottom left and ending top left, this
^!:-1\< is another calculation of 10 to the power of
00g55+^ the current digit number.
/ Dividing by this number gives us the remaining digits.
+ Add the two sets of digits together.
% Calculate n modulo this sum.
\ Swap the result down the stack bringing n back to the top.
00g1+ Add 1 to the current digit number.
:9`#v_ Test if that is greater than 9.
00p If not, save it and repeat the main loop.
-- The main loop ends here --
$$ Clear the digit number and N from the stack.
++++++++ Sum all the values that were calculated.
.@ Output the result and exit.
и представляет собой разрез большого числа. &10v
`#v_00p:::v>+%\00g1+:9
*v$v+55g00</|_\55+
\<$>>\1-:v ^<^!:-1
+^+^*+55\_$%\00g55
.@>+++++++
is the right part and ->s{s.size.times.reduce{|a,i|a+s.to_i%eval(s[0,i]+?++s[i..-1])}}
левая часть. Если Implicit input n.
;╗ Save a copy of n to register 0.
$l Yield the number of digits the number has, len_digits.
r Yield the range from 0 to len_digits - 1, inclusive.
`...`M Map the following function over that range, with variable x.
╤ Yield 10**x.
╜ Push a copy of n from register 0.
d Push divmod(n, 10**x).
+ Add the div to the mod.
╜ Push a copy of n from register 0.
% Vectorized modulo n % x, where x is a member of parition_sums.
This function will yield a list of modulos.
Σ Sum the results together.
Implicit return.
is bigger than the number, it is finished.
Ungolfed и использование:
;╗$lr`╤╜d+╜%`MΣ
||answer||
Подсчет байтов предполагает кодировку ISO 8859-1.
Tr[FromDigits/@{{a},{b}}]
Не совсем эффективно...
Попробуйте онлайн! (Первая строка включает набор тестов, разделенных переводом строки.)
Объяснение
FromDigits
Между каждой парой символов мы вставляем запятую, все, что находится перед совпадением, точку с запятой, весь ввод, перевод строки и все, что после совпадения. Для ввода Map
this gives us:
{1,2} + {3,4,5} + {}
Т.е. каждое возможное разделение входных данных вместе с парой входных данных. Нам не нужна эта последняя строка, поэтому:
3,4,5
Мы отбрасываем это.
b
При этом каждое число, а также запятая заменяются его унарным представлением. Поскольку запятая не является числом, она рассматривается как ноль и просто удаляется. Это добавляет две части в каждое разделение.
1,2
При этом модуль вычисляется путем удаления всех копий первого числа из второго числа.
a
Вот и все, просто посчитаем, сколько Mod[#,FromDigits/@({a}+{b}+{})]
s are left in the string and print that as the result.