Скільки носіїв мені потрібно, щоб додати ці два числа?


27

Завдання

З огляду на два натуральних числа, виведіть кількість переносів, необхідних для складання їх у довгому складенні в базі 10.

Приклади

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

Потрібно три носіння.

 ¹
 348
+ 91
----
 439

Потрібно одне носіння.

Тестові шафи

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 Min


Чи можемо ми вважати, що числа відповідають типу int нашої мови? Зокрема, для Python 2, чи варто мати справу із reprдодаванням Lчисла для номерів вище 2**63-1?
xnor

Відповіді:


21

Математика, 46 39 байт

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

вхід

[348,51]

-7 байт від JungHwan


Данг, мені дуже подобається цей метод. Різниця між (1) сумою цифрної суми двох входів і (2) розрядною сумою двох входів є дев'ятькратною кількістю переносів, тому що, коли є перенесення, ви віднімаєте 10 від розрядну суму та додайте 1 до цифрної суми.
JungHwan Min

Я також! спасибі за поради з гольфу
J42161217

Тести говорять, що [348,51] має повернути 0, але я отримую 56/3, коли запускаю це ...?
numbermaniac

Welp, схоже, це працює зараз. Не впевнений, чим займався Математика раніше ...
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'));


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;}

Спробуйте в Інтернеті!


Вам не потрібно ініціалізувати глобальні змінні.
user1502040

@ user1502040 вам потрібно, якщо вони використовуються всередині функції без ініціалізації.
Лина монашка

1
Просто отримати мою голову навколо ініціалізації тут: змінні є нульовим инициализируются автоматично, але тільки один раз, так тому , що функція уявлення про PPCG повинні працювати , якщо запустити функцію в кілька разів, вони повинні бути вручну обнулити на користь другого та наступні прогони.

5

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

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

;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

Безліч застосувань Dі S...
Erik the Outgolfer

4

Пітон , 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)

сумно стикається з проблемами точності поплавця.


Ви не можете використовувати його 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)



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)

Спробуй це!


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У цьому випадку цикл працює, поки не $iбудеINF

Випробування


Коли $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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.