Bu iki sayıyı eklemek için kaç tane taşıyıcı eklemem gerekir?


27

Görev

İki pozitif tamsayı verildiğinde, 10 bazında uzun ilavelerde bir araya getirilmesi için gereken taşıyıcı sayısını verin.

Örnekler

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

Üç taşıyıcıya ihtiyaç var.

 ¹
 348
+ 91
----
 439

Bir taşıma gerekli.

testcases

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

puanlama

Bu . Bayt cinsinden en kısa cevap kazanır. Standart boşluklar uygulanır.



14
Önerilen test durumu: 190192, 90909(taşıyıcılarda bir mola var).
Jonathan Allan

5
Kaynaktan @Jenny_mathy sitesindeki yanıt : taşıyan sayısı (1) iki giriş rakamı toplamının toplamı ve (2) dokuz bölü iki giriş toplamı rakamı toplamı arasındaki farka eşittir. Bunun nedeni, bir taşıma olduğunda, 10'dan bir çıkarmanız ve rakam toplamına 1 eklemenizdir. Mesela, 9+9size verir 18, ama rakam toplamı 9+9-10+1bir taşıma olduğu için.
JungHwan Min


Rakamların dilimizin int türüne uygun olduğunu varsayabilir miyiz? Özellikle Python 2 için yukarıdaki rakamlara reprekleme yapmalı mıyız ? L2**63-1
xnor

Yanıtlar:


21

Mathematica, 46 39 bayt

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

giriş

[348,51]

JungHwan'dan -7 bayt


Dang, bu metodu gerçekten beğendim. (1) iki girişin hane toplamı ile (2) iki girdinin toplam hane toplamı arasındaki fark, taşıma sayısının dokuz katıdır, çünkü bir taşıma olduğunda, 10 hane toplamı ve hane toplamına 1 ekleyin.
JungHwan Min 11:17

Ben de! golf ipuçları için teşekkürler
J42161217

Testcases [348,51] 0 döndürmeli diyor ama bunu çalıştırdığımda 56/3 alıyorum ...?
numbermaniac

Welp, şimdi çalışıyor gibi görünüyor. Mathematica'nın daha önce ne yaptığından emin değilim ...
numbermaniac

6

JavaScript (ES6), 50 bayt

Ovs’un Çözümünden Çalınan Sabit

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

açıklama

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

Taşıma açıklaması

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 , 52olmalıdır2
Toto

Bu nasıl çalışıyor? Bir açıklama ekler misiniz?
Arjun

5

C (gcc) , 65 bayt

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

Çevrimiçi deneyin!


Genel değişkenleri başlatmanız gerekmez.
user1502040

@ user1502040, işlev içinde başlatılmadan kullanılırlarsa yapmanız gerekir.
Sızdıran Rahibe

1
Kafamı sadece başlangıç ​​durumuna getirme : değişkenler otomatik olarak sıfır olarak başlatılır, ancak yalnızca bir kez, bu nedenle, PPCG'deki işlev bildirimleri birden fazla çalışırsa çalışmak zorunda kaldıklarından, ikincisinin yararı için el ile sıfırlanmaları gerekir. ve sonraki çalıştırmalar.

5

Jelly ,  13 12 11  9 bayt

Jenny_mathy'nin Matematik cevabını yansıtarak -1 byte .
-2 daha iyi golf oynayarak daha fazla byte: p

;SN$DFS:9

Test odasına bakın .

Nasıl?

;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 baytlık çözümüm ...

:⁵+
DUSç\>9S

Bir çift tamsayı alarak ve taşıyıcı sayısını bir tamsayı olarak döndüren monadik bir bağlantı.

Muhtemelen daha kısa bir yol var! Oradaydı!

Çevrimiçi deneyin! veya test odasına bakın .

Nasıl

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

Birçok kullanım alanı Dve S...
Erik Outgolfer

4

Python , 48 bayt

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

Çevrimiçi deneyin!

Her yer değeri için m=1, 10, 100, ..., 10**99, o yer değerinde bir taşıma olup olmadığını kontrol eder. Taşma kontrolü a%m+b%m>=mkısaltıldı ~a%m<b%m.

Yüzen ve aşağı kayan daha güzel 45 baytlık bir değişkenab

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

ne yazık ki şamandıra hassas sorunları ile karşılaşıyor.


a+b<mSonlandırma şartınız olarak kullanamaz mısınız?
Neil

@Neil Daha <=uzun olması gerekiyor .
xnor 19

1e99andkötüdür.
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)

1'in yerine taşınması için ekstra hiçbir işe yaramaz yineleme ekleyerek 1 bayt kurtarıldı @ Xnor'ın taşıma denetimine göre 7 bayt kurtarıldı. Ayrıca daha zarif bir 45 baytlık versiyonum vardı ama kayar nokta yanlışlığım var; kesin bir ondalık aritmetik ile bir dile tercüme harika olurdu:

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

3

Python 2,55 bayt

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

Çevrimiçi deneyin!


1
@ JonathanAllan'ın belirttiği gibi, eğer işleve bir çağrı kullanırsanız, onu da beyan etmelisiniz. Olduğu söyleniyor, cevabınız 55 bayt
Bay Xcoder

Mr.Xcoder sabit @
ovs


2

Neim , 10 bayt

𝔸𝐣𝐬₁₂𝔻𝐬𝕊λ𝕍

Açıklama:

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

Dene!

Alternatif çözüm, ayrıca 10 bayt:

𝔸D𝐣𝐬S𝐬𝐬𝕊9𝕍

Açıklama:

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

Dene!



0

Braingolf , 20 bayt

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

Çevrimiçi deneyin!

Diğer herkesle aynı yöntemi kullanır.

dAçgözlü değiştiricinin kullanılmasına izin vermeyi öngördüğümde bir bayt kurtarmış olabilirdim , veya bir dahaki sefere ah d<dile değiştirebilirdim &d.

açıklama

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.