Сколько переносов мне нужно, чтобы добавить эти два числа?

27

задача

Учитывая два натуральных числа, выведите количество переносов, необходимое для сложения их в длинное сложение в базе 10.

Примеры

¹¹¹   <-- carries
 999
+  1
----
1000

Требуется три переноса.

 ¹
 348
+ 91
----
 439

Необходим один перенос

Testcases

999,   1 -> 3
398,  91 -> 1
348,  51 -> 0
348,  52 -> 2
  5,  15 -> 1
999, 999 -> 3
505, 505 -> 2

счет

Это . Кратчайший ответ в байтах побеждает. Применяются стандартные лазейки .

Дрянная Монахиня
источник
Относящиеся .
Утренняя монахиня
14
Предлагаемый контрольный пример: 190192, 90909(имеет разрыв в переносках).
Джонатан Аллан
5
Из ответа @Jenny_mathy : количество переносов равно разнице между (1) суммой цифр суммы двух входов и (2) суммой цифр суммы двух входов, деленной на девять. Это потому, что когда есть перенос, вы вычитаете 10 из и добавляете 1 к сумме цифр. Например, 9+9дает вам 18, но сумма цифр, 9+9-10+1потому что есть перенос.
JungHwan Мин
Можем ли мы предположить, что числа соответствуют типу int нашего языка? В частности, для Python 2, мы должны иметь дело с reprдобавлением Lчисел выше 2**63-1?
xnor

Ответы:

21

Mathematica, 46 39 байт

x=Tr@*IntegerDigits;(x@#+x@#2-x@+##)/9&

вход

[348,51]

-7 байт из JungHwan

J42161217
источник
Черт, мне очень нравится этот метод. Разница между (1) суммой цифр суммы двух входов и (2) суммой цифр суммы двух входов в девять раз превышает число переносов, потому что когда есть перенос, вы вычитаете 10 из сумма цифр и добавьте 1 к сумме цифр.
JungHwan Мин.
Я тоже! спасибо за подсказки гольфа
J42161217
Тестовые случаи говорят, что [348,51] должен возвращать 0, но я получаю 56/3, когда я запускаю это ...?
Numbermaniac
Похоже, это работает сейчас. Не уверен, что Mathematica делал раньше ...
Numbermaniac
6

JavaScript (ES6), 50 байт

Исправлена проблема с украденным у овса решением

f=(a,b,c=0)=>a|b|c&&c+f(a/10,b/10,a%10+b%10+c>=10)

объяснение

f=(a,b,c=0)=>                                      Function taking two numbers and optional carry
             a|b|c                                 If a number or the carry are nonzero
                  &&                               Then
                    c+f(a/10,b/10,a%10+b%10+c>=10) Return carry plus all other carries

Продолжу объяснение

a%10+b%10+c     Sum of mod 10 of the numbers and c - remember these are not floordiv'ed
           >=10 Greater than or equals to 10 (we can't use greater than 9 here)

f=(a,b,c=0)=>a|b|c&&c+f(a/10,b/10,a%10+b%10+c>=10)
console.log([[999,1],[398,91],[348,51],[348,52],[5,15],[999,999],[256,64],[190192,90909]].map(test=>`${(test[0]+'').padStart(6,' ')}, ${(test[1]+'').padStart(6,' ')} -> ${f(...test)}`).join('\n'));

ASCII-только
источник
1
348 , 52должно быть2
Тото
Как это работает? Не могли бы вы добавить объяснение?
Арджун
5

C (gcc) , 65 байт

i,l;f(a,b){for(i=l=0;a+b;a/=10,b/=10)i+=a%10+b%10+l>9?l=1:0;a=i;}

Попробуйте онлайн!

Kritixi Lithos
источник
Вам не нужно инициализировать глобальные переменные.
user1502040
@ user1502040 вам нужно, если они используются внутри функции без инициализации.
Утренняя монахиня
1
Просто получить мою голову вокруг инициализации здесь: переменные являются нулевым инициализируются автоматически, но только один раз, так потому , что функция представление о PPCG должны работать , если запустить функцию в несколько раз, они должны быть вручную обнулить в пользу второго и последующие прогоны.
5

Желе ,  13 12 11  9 байт

-1 байт, портируя математический ответ Jenny_mathy .
-2 больше байтов при лучшей игре в гольф: p

;SN$DFS:9

Смотрите набор тестов .

Как?

;SN$DFS:9 - Main link: list of numbers, [a,b]     e.g.   [348,53]
   $      - last two links as a monad
 S        -   sum                                            401
  N       -   negate                                        -401
;         - concatenate                             [348,53,-401] 
    D     - convert to decimal lists     [[3,4,8],[5,3],[-4,0,-1]]
     F    - flatten                           [3,4,8,5,3,-4,0,-1]
      S   - sum                                               18
       :9 - integer divide by nine                             2

Мое 12-байтовое решение ...

:⁵+
DUSç\>9S

Монадическая ссылка, принимающая пару целых чисел и возвращающая число переносов в виде целого числа.

Хотя, возможно, есть более короткий путь! Там было!

Попробуйте онлайн! или посмотрите набор тестов .

Как

:⁵+ · Link 1: perform a carry: right-column's-digit-sum, a; left-colum's-digit-sum; b
 ⁵  · literal 10
:   · a integer-divided by 10 - the carry amount
  + · add to b

DUSç\>9S · Main link: list of summands        e.g. [348,52]
D        · convert to decimal lists                [[3,4,8],[5,2]]
 U       · upend (reverse each)                    [[8,4,3],[2,5]]
  S      · sum (add the digits up)                 [10,9,3]
    \    · cumulative reduce with:
   ç     ·   last link (1) as a dyad               [10,10,4]
      9  · literal 9
     >   · greater than?                           [ 1, 1,0]
       S · sum                                     2
Джонатан Аллан
источник
DS
Многократное
4

Python , 48 байт

f=lambda a,b,m=1:m<1e99and(~a%m<b%m)+f(a,b,m*10)

Попробуйте онлайн!

Для каждого значения места m=1, 10, 100, ..., 10**99проверяется, есть ли перенос в этом месте. Проверка переполнения a%m+b%m>=mсокращена до ~a%m<b%m.

Более хороший 45-байтовый вариант, где вместо этого плавает aи bсдвигается вниз

f=lambda a,b:a+b and(a%1+b%1>=1)+f(a/10,b/10)

к сожалению, сталкивается с проблемами точности поплавка.

XNOR
источник
Не можете ли вы использовать в a+b<mкачестве вашего условия завершения?
Нил
@Neil Это должно быть <=дольше.
xnor
1e99andпротивно
Йонас Шефер
4

JavaScript (ES6), 53 45 байт

f=(a,b,d=1)=>a+b<d?0:(a%d+b%d>=d)+f(a,b,d*10)

Сэкономил 1 байт, добавив дополнительную итерацию без изменений для переносов на 1-е место. Сохранено 7 байтов путем присвоения проверки переноса @ xnor. У меня также была более элегантная 45-байтовая версия, но она страдает от погрешности с плавающей точкой; это будет прекрасно работать в переводе на язык с точной десятичной арифметикой:

f=(a,b,c=a+b)=>c<1?0:a%1+b%1-c%1+f(a/10,b/10)
Нил
источник
3

Python 2 , 55 байт

f=lambda a,b,c=0:c+a+b and c+f(a/10,b/10,a%10+b%10+c>9)

Попробуйте онлайн!

овс
источник
1
Как указал @JonathanAllan, если вы использовали вызов своей функции, вы должны также объявить его. При этом ваш ответ составляет 55 байт
г-н Xcoder
@ Mr.Xcoder зафиксировал его
овс
2

Нейм , 10 байт

𝔸𝐣𝐬₁₂𝔻𝐬𝕊λ𝕍

Объяснение:

𝔸            𝔸ppend the two inputs into a list
 𝐣            𝐣oin them together
  𝐬           𝐬um the characters
   ₁₂         Push the first input, then the second
     𝔻        A𝔻d.
      𝐬       𝐬um the characters
       𝕊      𝕊ubtract
         𝕍    Integer di𝕍ision by
        λ     nine (variable)

Попытайся!

Альтернативное решение, также 10 байтов:

𝔸D𝐣𝐬S𝐬𝐬𝕊9𝕍

Объяснение:

𝔸             𝔸ppend the two inputs into a list
 D            Duplicate
  𝐣            𝐣oin
   𝐬           𝐬um
    S          Swap
     𝐬         𝐬um
      𝐬        𝐬um the characters
       𝕊       𝕊ubtract
         𝕍     integer di𝕍ide by
        λ       nine (variable)

Попытайся!

Okx
источник
1

PHP> = 7.1, 81 байт

for([,$x,$y]=$argv,$i=1;($x+$y)/$i|0;$i*=10)$d+=$c=$x/$i%10+$y/$i%10+$c>9;echo$d;

-2 Б удаления |0В этом случае цикл работает до $iISINF

Тестовые случаи

Йорг Хюльсерманн
источник
Когда $iстановится INF?
кошка
@ Cat Я не уверен, почему это важно. Я не использовал это. 1.0E+309это первое INFзначение Попробуйте онлайн!
Йорг Хюльсерманн
0

Braingolf , 20 байтов

VR{.M}d<d&+v+d&+c-9/

Попробуйте онлайн!

Использует тот же метод, что и все остальные.

Мог бы сохранить байт или 2, если бы у меня было предвидение, позволяющее dиспользовать жадный модификатор, тогда я мог бы заменить d<dна « &dну хорошо», в следующий раз.

объяснение

VR{.M}d<d&+v+d&+c-9/  Implicit input from commandline args
VR                    Create stack2 and return to stack1
  {..}                Foreach loop, runs on each item in stack1
   .M                 Duplicate and move duplicate to stack2
      d<d             Split both items on stack into digits
         &+           Sum entire stack
           v+         Switch to stack2 and sum last 2 items on stack
             d&+      Split result into digits and sum all digits
                c     Collapse stack2 into stack1
                 -    Subtract last item from 2nd to last
                  9/  Divide by 9
                      Implicit output of last item on stack
Skidsdev
источник