Tôi cần bao nhiêu số mang để thêm hai số này?


27

Bài tập

Cho hai số nguyên dương, xuất ra số lượng vật mang cần thiết để cộng chúng lại với nhau trong cơ sở 10.

Ví dụ

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

Ba mang là cần thiết.

 ¹
 348
+ 91
----
 439

Một mang là cần thiết.

Tủ thử

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

Chấm điểm

Đây là . Câu trả lời ngắn nhất trong byte thắng. Tiêu chuẩn áp dụng.



14
Trường hợp thử nghiệm đề xuất: 190192, 90909(có một nghỉ trong mang).
Jonathan Allan

5
Từ câu trả lời của @Jenny_mathy : số lượng mang bằng với chênh lệch giữa (1) tổng của chữ số của hai đầu vào và (2) tổng chữ số của tổng của hai đầu vào, chia cho chín. Điều này là do khi có một carry, bạn trừ 10 từ và thêm 1 vào tổng chữ số. Ví dụ, 9+9cung cấp cho bạn 18, nhưng tổng số là 9+9-10+1bởi vì có một mang.
JungHwan Min


Chúng ta có thể giả sử các số phù hợp với kiểu int của ngôn ngữ của chúng ta không? Cụ thể cho Python 2, chúng ta có nên xử lý reprviệc nối thêm một Lsố ở trên 2**63-1không?
xnor

Câu trả lời:


21

Toán học, 46 39 byte

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

đầu vào

[348,51]

-7 byte từ JungHwan


Dang, tôi thực sự thích phương pháp này. Chênh lệch giữa (1) tổng của chữ số của hai đầu vào và (2) tổng chữ số của tổng của hai đầu vào, gấp chín lần số mang vì khi có một số mang, bạn trừ 10 từ chữ số tổng và thêm 1 vào tổng chữ số.
JungHwan Min

Tôi cũng vậy! cảm ơn về các mẹo chơi gôn
J42161217

Testcase cho biết [348,51] sẽ trả về 0 nhưng tôi sẽ nhận được 56/3 khi tôi chạy cái này ...?
numbermaniac

Welp, có vẻ như nó đang hoạt động. Không chắc chắn những gì
Mathicala

6

JavaScript (ES6), 50 byte

Đã sửa lỗi đánh cắp từ dung dịch của lò nướng

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

Giải trình

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

Mang theo lời giải thích

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 , 52nên là2
Toto

Cái này hoạt động ra sao? Bạn có thể thêm một lời giải thích?
Arjun

5

C (gcc) , 65 byte

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

Hãy thử trực tuyến!


Bạn không cần phải khởi tạo các biến toàn cục.
user1502040

@ user1502040 bạn cần, nếu chúng được sử dụng bên trong chức năng mà không được khởi tạo.
Rò rỉ Nun

1
Chỉ cần tôi hiểu về việc khởi tạo ở đây: các biến được tự động khởi tạo bằng 0, nhưng chỉ một lần, vì vậy, việc gửi hàm trên PPCG phải hoạt động nếu chức năng chạy nhiều hơn một lần, chúng cần được xóa bằng tay vì lợi ích của lần thứ hai và các lần chạy tiếp theo.

5

Thạch ,  13 12 11  9 byte

-1 byte bằng cách chuyển câu trả lời Toán học của Jenny_mathy .
Thêm 2 byte bằng cách chơi golf tốt hơn: p

;SN$DFS:9

Xem bộ thử nghiệm .

Làm sao?

;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

Giải pháp 12 byte của tôi ...

:⁵+
DUSç\>9S

Một liên kết đơn âm lấy một cặp số nguyên và trả về số lượng mang như một số nguyên.

Có lẽ có một cách ngắn hơn mặc dù! Có!

Hãy thử trực tuyến! hoặc xem bộ thử nghiệm .

Làm sao

:⁵+ · 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

Nhiều công dụng của DS...
Erik the Outgolfer

4

Python , 48 byte

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

Hãy thử trực tuyến!

Đối với mỗi giá trị địa điểm m=1, 10, 100, ..., 10**99, kiểm tra xem có giá trị thực hiện tại địa điểm đó không. Kiểm tra tràn a%m+b%m>=mđược rút ngắn thành ~a%m<b%m.

Một biến thể 45 byte đẹp hơn trong đó nổi abchuyển xuống

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

đáng buồn chạy vào vấn đề chính xác nổi.


Bạn không thể sử dụng a+b<mnhư điều kiện chấm dứt của bạn?
Neil

@Neil Nó cần phải <=dài hơn.
xnor

1e99andlà khó chịu.
Jonas Schäfer

4

JavaScript (ES6), 53 45 byte

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

Đã lưu 1 byte bằng cách thêm một lần lặp không làm gì thêm để mang vào vị trí của 1. Đã lưu 7 byte bằng cách chiếm dụng kiểm tra mang theo của @ xnor. Tôi cũng đã có một phiên bản 45 byte thanh lịch hơn nhưng nó bị thiếu chính xác dấu phẩy động; nó sẽ hoạt động tốt được dịch sang một ngôn ngữ với số học thập phân chính xác:

f=(a,b,c=a+b)=>c<1?0:a%1+b%1-c%1+f(a/10,b/10)

3

Python 2 , 55 byte

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

Hãy thử trực tuyến!


1
Như @JonathanAllan đã chỉ ra, nếu bạn đã sử dụng một cuộc gọi đến chức năng của mình, bạn cũng phải khai báo nó. Điều đó đang được nói, câu trả lời của bạn là 55 byte
Ông Xcoder

@ Mr.Xcoder đã sửa nó
ovs


2

Neim , 10 byte

𝔸𝐣𝐬₁₂𝔻𝐬𝕊λ𝕍

Giải trình:

𝔸            𝔸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)

Thử nó!

Giải pháp thay thế, cũng 10 byte:

𝔸D𝐣𝐬S𝐬𝐬𝕊9𝕍

Giải trình:

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

Thử nó!



0

Braingolf , 20 byte

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

Hãy thử trực tuyến!

Sử dụng phương pháp tương tự như mọi người khác.

Có thể tôi đã lưu một byte hoặc 2 nếu tôi có tầm nhìn xa để cho phép dsử dụng công cụ sửa đổi tham lam, sau đó tôi có thể thay thế d<dbằng &dah, lần sau.

Giải trình

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.