Berapa banyak carry yang perlu saya tambahkan dua angka ini?

27

Tugas

Diberikan dua bilangan bulat positif, hasilkan jumlah pengangkutan yang dibutuhkan untuk menambahkannya bersama-sama dalam penambahan panjang di basis 10.

Contohnya

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

Dibutuhkan tiga membawa.

 ¹
 348
+ 91
----
 439

Dibutuhkan satu carry.

Testcases

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

Mencetak gol

Ini adalah . Jawaban terpendek dalam byte menang. Celah standar berlaku.

Biarawati Bocor
sumber
Terkait .
Leaky Nun
14
Test case yang disarankan: 190192, 90909(mengalami istirahat dalam membawa).
Jonathan Allan
5
Dari jawaban @Jenny_mathy : jumlah carry sama dengan perbedaan antara (1) jumlah dari jumlah digit dari dua input dan (2) jumlah digit dari jumlah dari dua input, dibagi dengan sembilan. Ini karena ketika ada carry, Anda mengurangi 10 dari dan menambahkan 1 ke jumlah digit. Misalnya, 9+9memberi Anda 18, tetapi jumlah digit 9+9-10+1karena ada barang bawaan.
JungHwan Min
Bisakah kita menganggap angkanya cocok dengan tipe int bahasa kita? Khususnya untuk Python 2, haruskah kita berurusan dengan reprmenambahkan Langka untuk di atas 2**63-1?
xnor

Jawaban:

21

Mathematica, 46 39 byte

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

memasukkan

[348,51]

-7 byte dari JungHwan

J42161217
sumber
Dang, saya sangat suka metode ini. Perbedaan antara (1) jumlah dari jumlah digit dari dua input dan (2) jumlah digit dari jumlah dari dua input, adalah sembilan kali jumlah carry karena ketika ada carry, Anda kurangi 10 dari jumlah digit dan tambahkan 1 ke jumlah digit.
JungHwan Min
Saya juga! terima kasih untuk tips golf
J42161217
Testcases mengatakan [348,51] harus mengembalikan 0 tapi saya mendapatkan 56/3 ketika saya menjalankan ini ...?
numbermaniac
Welp, sepertinya itu berfungsi sekarang. Tidak yakin apa yang dilakukan Mathematica sebelum ...
numbermaniac
6

JavaScript (ES6), 50 byte

Tetap Dicuri dari solusi ovs

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

Penjelasan

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

Bawa penjelasan

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'));

Khusus ASCII
sumber
1
348 , 52seharusnya2
Toto
Bagaimana cara kerjanya? Bisakah Anda menambahkan penjelasan?
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;}

Cobalah online!

Kritixi Lithos
sumber
Anda tidak perlu menginisialisasi variabel global.
user1502040
@ user1502040 Anda perlu, jika mereka digunakan di dalam fungsi tanpa diinisialisasi.
Leaky Nun
1
Hanya mendapatkan kepala saya sekitar inisialisasi sini: variabel yang nol-diinisialisasi secara otomatis, tetapi hanya sekali, jadi karena pengajuan fungsi pada PPCG harus bekerja jika fungsi ini berjalan lebih dari sekali, mereka harus memusatkan perhatian secara manual untuk kepentingan kedua dan proses selanjutnya.
5

Jelly ,  13 12 11  9 byte

-1 byte dengan mem-porting jawaban Matematika Jenny_mathy .
-2 byte lebih banyak dengan bermain golf yang lebih baik: p

;SN$DFS:9

Lihat ruang tes .

Bagaimana?

;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

Solusi 12 byte saya ...

:⁵+
DUSç\>9S

Tautan monadik mengambil sepasang bilangan bulat dan mengembalikan jumlah membawa sebagai bilangan bulat.

Mungkin ada cara yang lebih pendek! Disana ada!

Cobalah online! atau lihat test suite .

Bagaimana

:⁵+ · 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
Jonathan Allan
sumber
Banyak kegunaan Ddan S...
Erik the Outgolfer
4

Python , 48 byte

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

Cobalah online!

Untuk setiap nilai tempat m=1, 10, 100, ..., 10**99, periksa apakah ada carry di nilai tempat itu. Pemeriksaan melimpah a%m+b%m>=mdisingkat menjadi ~a%m<b%m.

Varian 45 byte yang lebih bagus di mana mengapung adan bbergeser ke bawah sebagai gantinya

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

sayangnya mengalami masalah presisi mengambang.

Tidak
sumber
Tidak bisakah Anda menggunakan a+b<msebagai kondisi terminating Anda?
Neil
@Neil Perlu <=yang lebih panjang.
xnor
1e99andjahat.
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)

Disimpan 1 byte dengan menambahkan iterasi do-nothing ekstra untuk membawa ke tempat 1. Disimpan 7 byte dengan menggunakan cek carry @ xnor. Saya juga memiliki versi 45-byte yang lebih elegan tetapi menderita ketidaktepatan floating-point; itu akan berhasil diterjemahkan ke bahasa dengan aritmatika desimal yang tepat:

f=(a,b,c=a+b)=>c<1?0:a%1+b%1-c%1+f(a/10,b/10)
Neil
sumber
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)

Cobalah online!

ovs
sumber
1
Seperti @JonathanAllan tunjukkan, jika Anda menggunakan panggilan ke fungsi Anda, Anda harus mendeklarasikannya juga. Yang sedang berkata, jawaban Anda adalah 55 byte
Mr. Xcoder
@ Mr.Xcoder memperbaikinya
ovs
2

05AB1E , 11 10 byte

|DO‚€SOÆ9÷

Cobalah online!

Okx
sumber
@ Jonathan Allan Diperbaiki.
Okx
|DO‚€SOÆ9÷selama 10 byte.
Emigna
@ Emigna Itu sangat keren.
Okx
2

Neim , 10 byte

𝔸𝐣𝐬₁₂𝔻𝐬𝕊λ𝕍

Penjelasan:

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

Cobalah!

Solusi alternatif, juga 10 byte:

𝔸D𝐣𝐬S𝐬𝐬𝕊9𝕍

Penjelasan:

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

Cobalah!

Okx
sumber
1

PHP> = 7.1, 81 Bytes

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

Menghapus -2 Bytes |0Dalam hal ini loop berjalan sampai $iadalahINF

Uji Kasus

Jörg Hülsermann
sumber
Kapan $imenjadi INF?
kucing
@cat Saya tidak yakin mengapa ini penting. Saya belum menggunakan ini. 1.0E+309adalah yang pertama INFnilai Cobalah secara online!
Jörg Hülsermann
0

Braingolf , 20 byte

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

Cobalah online!

Menggunakan metode yang sama seperti orang lain.

Bisa saja menyelamatkan satu byte atau 2 seandainya saya memiliki pandangan ke depan untuk memungkinkan duntuk menggunakan pengubah serakah, maka saya bisa diganti d<ddengan &dah juga, lain kali.

Penjelasan

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
sumber