Di quanti carry ho bisogno per aggiungere questi due numeri?


27

Compito

Dati due numeri interi positivi, genera il numero di carry necessari per sommarli in aggiunta lunga nella base 10.

Esempi

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

Sono necessari tre trasporti.

 ¹
 348
+ 91
----
 439

È necessario un trasporto.

Casi test

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

punteggio

Questo è . Vince la risposta più breve in byte. Si applicano scappatoie standard .



14
Caso di prova suggerito: 190192, 90909(ha una pausa nei carry).
Jonathan Allan,

5
Dalla risposta di @Jenny_mathy : il numero di carry è uguale alla differenza tra (1) la somma della somma delle cifre dei due input e (2) la somma delle cifre della somma dei due input, divisa per nove. Questo perché quando c'è un carry, sottrai 10 da e aggiungi 1 alla somma delle cifre. Ad esempio, 9+9ti dà 18, ma la somma delle cifre è 9+9-10+1perché c'è un carry.
JungHwan Min,


Possiamo assumere che i numeri si adattino al tipo di int della nostra lingua? In particolare per Python 2, dovremmo occuparci di repraggiungere un Lnumero precedente 2**63-1?
xnor

Risposte:


21

Mathematica, 46 39 byte

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

ingresso

[348,51]

-7 byte da JungHwan


Dang, mi piace molto questo metodo. La differenza tra (1) la somma della somma delle cifre dei due input e (2) la somma delle cifre della somma dei due input, è nove volte il numero di carry perché quando c'è un carry, sottrai 10 dal somma cifre e aggiungi 1 alla somma cifre.
JungHwan Min,

Anche a me! grazie per i consigli sul golf
J42161217,

Testcase dicono che [348,51] dovrebbe restituire 0 ma sto ottenendo 56/3 quando eseguo questo ...?
numbermaniac

Welp, sembra che funzioni ora. Non sono sicuro di quello che Mathematica stava facendo prima ...
numbermaniac

6

JavaScript (ES6), 50 byte

Risolto il problema rubato dalla soluzione di ovs

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

Spiegazione

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

Porta spiegazione

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 , 52dovrebbe essere2
Tot

Come funziona? Potresti aggiungere una spiegazione?
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;}

Provalo online!


Non è necessario inizializzare le variabili globali.
user1502040

@ user1502040 è necessario, se vengono utilizzati all'interno della funzione senza essere inizializzati.
Leaky Nun,

1
Mi sto solo concentrando sull'inizializzazione qui: le variabili vengono inizializzate automaticamente a zero, ma solo una volta, quindi poiché gli invii di funzioni su PPCG devono funzionare se la funzione viene eseguita più di una volta, devono essere azzerati manualmente a vantaggio del secondo e successive esecuzioni.

5

Gelatina ,  13 12 11  9 byte

-1 byte eseguendo il porting della risposta matematica di Jenny_mathy .
-2 byte in più giocando a golf meglio: p

;SN$DFS:9

Vedi la suite di test .

Come?

;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

La mia soluzione a 12 byte ...

:⁵+
DUSç\>9S

Un collegamento monadico che prende una coppia di numeri interi e restituisce il numero di carry come numero intero.

C'è probabilmente un modo più breve però! C'era!

Provalo online! o vedi la suite di test .

Come

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

I molti usi di De 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)

Provalo online!

Per ciascun valore di luogo m=1, 10, 100, ..., 10**99, controlla se è presente un valore di riporto in quel valore di luogo. Il controllo di overflow a%m+b%m>=mè ridotto a ~a%m<b%m.

Una variante a 45 byte più bella in cui invece galleggia ae si bsposta verso il basso

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

purtroppo si imbatte in problemi di precisione del galleggiante.


Non puoi usare a+b<mcome condizione finale?
Neil,

@Neil Deve essere quello <=che è più lungo.
xnor

1e99andè brutto.
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)

Salvato 1 byte aggiungendo un'iterazione extra do-nothing per carry al posto di 1. Salvati 7 byte appropriandosi del check carry di x xor. Ho anche avuto una versione a 45 byte più elegante ma soffre di inesattezze in virgola mobile; funzionerebbe alla grande tradotto in una lingua con l'aritmetica decimale esatta:

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)

Provalo online!


1
Come ha sottolineato @JonathanAllan, se hai usato una chiamata alla tua funzione, devi dichiararla anche tu. Detto questo, la tua risposta è di 55 byte
Mr. Xcoder l'

@ Mr.Xcoder risolto
ovs


2

Neim , 10 byte

𝔸𝐣𝐬₁₂𝔻𝐬𝕊λ𝕍

Spiegazione:

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

Provalo!

Soluzione alternativa, anche 10 byte:

𝔸D𝐣𝐬S𝐬𝐬𝕊9𝕍

Spiegazione:

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

Provalo!


1

PHP> = 7.1, 81 byte

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

Rimozione di -2 byte |0In questo caso il ciclo viene eseguito fino a quando non lo $ièINF

Casi test


Quando $idiventa INF?
gatto,

@cat Non sono sicuro del perché sia ​​importante. Non ho usato questo. 1.0E+309è il primo INFvalore Provalo online!
Jörg Hülsermann,

0

Braingolf , 20 byte

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

Provalo online!

Utilizza lo stesso metodo di tutti gli altri.

Avrei potuto salvare un byte o 2 se avessi avuto la lungimiranza di consentire ddi utilizzare il modificatore goloso, quindi avrei potuto sostituire d<dcon un &dah bene, la prossima volta.

Spiegazione

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.