Ile linii muszę dodać te dwie liczby?

27

Zadanie

Biorąc pod uwagę dwie dodatnie liczby całkowite, wyprowadza liczbę przeniesień potrzebną do dodania ich razem w długim dodaniu w bazie 10.

Przykłady

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

Potrzebne są trzy przewozy.

 ¹
 348
+ 91
----
 439

Potrzebny jest jeden bagaż.

Przypadki testowe

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

Punktacja

To jest . Najkrótsza odpowiedź w bajtach wygrywa. Obowiązują standardowe luki .

Leaky Nun
źródło
Związane .
Leaky Nun
14
Sugerowany przypadek testowy: 190192, 90909(ma przerwę w przenoszeniu).
Jonathan Allan,
5
Z odpowiedzi @Jenny_mathy : liczba przeniesień jest równa różnicy między (1) sumą sumy cyfr dwóch wejść i (2) sumą cyfr sumy dwóch wejść podzieloną przez dziewięć. Dzieje się tak, ponieważ gdy występuje przeniesienie, odejmujesz 10 od i dodajesz 1 do sumy cyfr. Na przykład 9+9daje 18, ale suma cyfr jest 9+9-10+1spowodowana przeniesieniem.
JungHwan Min
Czy możemy założyć, że liczby pasują do typu int naszego języka? W szczególności w przypadku Python 2, czy powinniśmy poradzić sobie z reprdodawaniem Lliczby powyżej 2**63-1?
xnor

Odpowiedzi:

21

Mathematica, 46 39 bajtów

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

wkład

[348,51]

-7 bajtów od JungHwan

J42161217
źródło
Dang, naprawdę podoba mi się ta metoda. Różnica między (1) sumą sumy cyfr dwóch wejść i (2) sumą cyfr sumy dwóch wejść jest dziewięciokrotnie większa niż liczba przeniesień, ponieważ gdy występuje przeniesienie, odejmuje się 10 od suma cyfr i dodaj 1 do sumy cyfry.
JungHwan Min
Ja też! dzięki za wskazówki dotyczące gry w golfa
J42161217,
Testy mówią, że [348,51] powinien zwrócić 0, ale dostaję 56/3 po uruchomieniu tego ...?
numbermaniac
Welp, wygląda na to, że teraz działa. Nie jestem pewien, co Mathematica robił wcześniej ...
numbermaniac
6

JavaScript (ES6), 50 bajtów

Naprawiono skradzione rozwiązanie Owsa

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

Wyjaśnienie

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

Przeprowadź wyjaśnienie

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

Tylko ASCII
źródło
1
348 , 52powinno być2
Toto
Jak to działa? Czy możesz dodać wyjaśnienie?
Arjun
5

C (gcc) , 65 bajtów

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

Wypróbuj online!

Kritixi Lithos
źródło
Nie musisz inicjować zmiennych globalnych.
user1502040
@ user1502040 musisz, jeśli są używane wewnątrz funkcji bez inicjalizacji.
Leaky Nun
1
Właśnie zastanawiam się nad inicjalizacją tutaj: zmienne inicjowane zerem automatycznie, ale tylko raz, więc ponieważ przesyłanie funkcji w PPCG musi działać, jeśli funkcja działa więcej niż jeden raz, muszą być ręcznie zerowane na korzyść drugiego i kolejne przebiegi.
5

Galaretka ,  13 12 11  9 bajtów

-1 bajt przez przeniesienie matematycznej odpowiedzi Jenny_mathy .
-2 więcej bajtów dzięki lepszemu golfowi: p

;SN$DFS:9

Zobacz pakiet testowy .

W jaki sposób?

;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

Moje 12-bajtowe rozwiązanie ...

:⁵+
DUSç\>9S

Łącze monadyczne pobierające parę liczb całkowitych i zwracające liczbę przeniesień jako liczbę całkowitą.

Prawdopodobnie jest jednak krótsza droga! Tam było!

Wypróbuj online! lub zobacz pakiet testowy .

W jaki sposób

:⁵+ · 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
źródło
Wiele zastosowań Di S...
Erik the Outgolfer
4

Python , 48 bajtów

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

Wypróbuj online!

Dla każdej wartości miejsca m=1, 10, 100, ..., 10**99sprawdza, czy w tej wartości miejsca występuje przeniesienie. Kontrola przepełnienia a%m+b%m>=mzostała skrócona do ~a%m<b%m.

Ładniejszy 45-bajtowy wariant, w którym zamiast tego unosi się ai bprzesuwa w dół

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

niestety występują problemy z precyzją pływaka.

xnor
źródło
Czy nie możesz użyć a+b<mjako warunku zakończenia?
Neil
@Neil Musi być <=dłuższy.
xnor
1e99andjest paskudny.
Jonas Schäfer
4

JavaScript (ES6), 53 45 bajtów

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

Zaoszczędzono 1 bajt, dodając dodatkową iterację „nic nie rób” dla przeniesień na miejsce 1. Zaoszczędzono 7 bajtów poprzez odpowiednie sprawdzenie przeniesienia @ xnor. Miałem też bardziej elegancką 45-bajtową wersję, ale cierpi na niedokładność zmiennoprzecinkową; świetnie działałoby przetłumaczone na język z dokładną arytmetyką dziesiętną:

f=(a,b,c=a+b)=>c<1?0:a%1+b%1-c%1+f(a/10,b/10)
Neil
źródło
3

Python 2 , 55 bajtów

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

Wypróbuj online!

ovs
źródło
1
Jak zauważył @JathanathanAllan, jeśli użyłeś wywołania funkcji, musisz to również zadeklarować. Biorąc to pod uwagę, twoja odpowiedź to 55 bajtów
Pan Xcoder
@ Mr.Xcoder naprawił to
dniu
2

05AB1E , 11 10 bajtów

|DO‚€SOÆ9÷

Wypróbuj online!

Okx
źródło
@JonathanAllan Naprawiono.
Okx,
|DO‚€SOÆ9÷na 10 bajtów.
Emigna
@Emigna To całkiem fajne.
Okx,
2

Neim , 10 bajtów

𝔸𝐣𝐬₁₂𝔻𝐬𝕊λ𝕍

Wyjaśnienie:

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

Spróbuj!

Alternatywne rozwiązanie, również 10 bajtów:

𝔸D𝐣𝐬S𝐬𝐬𝕊9𝕍

Wyjaśnienie:

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

Spróbuj!

Okx
źródło
1

PHP> = 7,1, 81 bajtów

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 Usuwanie bajtów |0W tym przypadku pętla działa, dopóki nie $izostanieINF

Przypadki testowe

Jörg Hülsermann
źródło
Kiedy się $istanie INF?
kot
@cat Nie jestem pewien, dlaczego jest to ważne. Nie korzystałem z tego. 1.0E+309to pierwsza INFwartość Wypróbuj online!
Jörg Hülsermann
0

Braingolf , 20 bajtów

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

Wypróbuj online!

Używa tej samej metody, co wszyscy inni.

Mógłbym zaoszczędzić bajt lub 2, gdybym miał przewidywanie pozwalające dna użycie chciwego modyfikatora, wtedy mógłbym zastąpić d<dgo &dcóż, następnym razem.

Wyjaśnienie

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
źródło