Quantos carregamentos eu preciso adicionar esses dois números?

27

Tarefa

Dados dois números inteiros positivos, produza o número de carregamentos necessários para adicioná-los em adição longa na base 10.

Exemplos

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

São necessários três carregamentos.

 ¹
 348
+ 91
----
 439

É necessário um transporte.

Casos de teste

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

Pontuação

Isso é . A resposta mais curta em bytes vence. Aplicam-se brechas padrão .

Freira Furada
fonte
Relacionado .
Leaky Nun
14
Caso de teste sugerido: 190192, 90909(tem uma interrupção no transporte).
Jonathan Allan
5
De resposta de @Jenny_mathy : o número de portadores é igual à diferença entre (1) a soma da soma dígitos das duas entradas e (2) a soma dos dígitos a soma das duas entradas, dividido por nove. Isso ocorre porque, quando há uma transferência, você subtrai 10 de e adiciona 1 à soma dos dígitos. Por exemplo, 9+9fornece 18, mas a soma dos dígitos é 9+9-10+1porque existe um carry.
JungHwan Min
Podemos assumir que os números se encaixam no tipo int da nossa linguagem? Em particular para o Python 2, devemos lidar com o repracréscimo de um Lpara números acima 2**63-1?
xnor

Respostas:

21

Mathematica, 46 39 bytes

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

entrada

[348,51]

-7 bytes de JungHwan

J42161217
fonte
Dang, eu realmente gosto deste método. A diferença entre (1) a soma da soma dos dígitos das duas entradas e (2) a soma dos dígitos da soma das duas entradas, é nove vezes o número de carregamentos, porque quando há uma carga, você subtrai 10 da soma de dígitos e adicione 1 à soma dos dígitos.
JungHwan Min
Eu também! obrigado pelas dicas de golfe
J42161217
Os casos de teste dizem que [348,51] deve retornar 0, mas estou recebendo 56/3 quando executo isso ...?
numbermaniac
Welp, parece que está funcionando agora. Não tenho certeza do que o Mathematica estava fazendo antes ... #
1113
6

JavaScript (ES6), 50 bytes

Corrigido o roubo da solução ovs

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

Explicação

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

Carregar explicação

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

Somente ASCII
fonte
1
348 , 52deve ser2
Toto
Como é que isso funciona? Você poderia adicionar uma explicação?
Arjun #
5

C (gcc) , 65 bytes

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

Experimente online!

Kritixi Lithos
fonte
Você não precisa inicializar variáveis ​​globais.
user1502040
@ user1502040, se eles forem usados ​​dentro da função sem serem inicializados.
Leaky Nun
1
Apenas pensando na inicialização aqui: as variáveis são inicializadas com zero automaticamente, mas apenas uma vez; portanto, porque os envios de funções no PPCG precisam funcionar se a função for executada mais de uma vez, eles precisam ser zerados manualmente para o benefício do segundo e execuções subseqüentes.
5

Geléia ,  13 12 11  9 bytes

-1 byte, portando a resposta matemática de Jenny_mathy .
-2 bytes a mais de golfe melhor: p

;SN$DFS:9

Veja a suíte de testes .

Quão?

;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

Minha solução de 12 bytes ...

:⁵+
DUSç\>9S

Um link monádico que pega um par de números inteiros e retorna o número de carrega como um inteiro.

Provavelmente existe uma maneira mais curta! Houve!

Experimente online! ou veja a suíte de testes .

Quão

:⁵+ · 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
fonte
Os muitos usos De S...
Erik the Outgolfer
4

Python , 48 bytes

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

Experimente online!

Para cada valor de posição m=1, 10, 100, ..., 10**99, verifica se há uma carga nesse valor de posição. A verificação de estouro a%m+b%m>=mé reduzida para ~a%m<b%m.

Uma variante melhor de 45 bytes, onde flutua ae bdesloca para baixo

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

infelizmente corre para problemas de precisão de flutuação.

xnor
fonte
Você não pode usar a+b<mcomo sua condição final?
305 Neil
@ Neil Precisa ser o <=que é mais longo.
Xnor
1e99andé desagradável.
Jonas Schäfer
4

JavaScript (ES6), 53 45 bytes

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

Economizou 1 byte adicionando uma iteração extra de não fazer nada para carrega no lugar de 1. Economizou 7 bytes apropriando a verificação de transporte do @ xnor. Eu também tinha uma versão mais elegante de 45 bytes, mas sofre de imprecisão de ponto flutuante; funcionaria muito bem traduzido para um idioma com aritmética decimal exata:

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

Python 2 , 55 bytes

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

Experimente online!

ovs
fonte
1
Como apontou @ JonathanAllan, se você usou uma chamada para sua função, também deve declara-la. Dito isto, a sua resposta é de 55 bytes
Mr. Xcoder
@ Mr.Xcoder corrigiu
ov
2

05AB1E , 11 10 bytes

|DO‚€SOÆ9÷

Experimente online!

Okx
fonte
@JonathanAllan Fixed.
Okx,
|DO‚€SOÆ9÷por 10 bytes.
Emigna
@Emigna Isso é muito legal.
Okx
2

Neim , 10 bytes

𝔸𝐣𝐬₁₂𝔻𝐬𝕊λ𝕍

Explicação:

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

Tente!

Solução alternativa, também 10 bytes:

𝔸D𝐣𝐬S𝐬𝐬𝕊9𝕍

Explicação:

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

Tente!

Okx
fonte
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;

-2 Bytes remoção |0Neste caso, o laço é executado até que $isejaINF

Casos de teste

Jörg Hülsermann
fonte
Quando se $itorna INF?
gato
@cat Não sei por que é importante. Eu não uso isso. 1.0E+309é o primeiro INFvalor Experimente online!
Jörg Hülsermann
0

Braingolf , 20 bytes

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

Experimente online!

Usa o mesmo método que todos os outros.

Poderia ter salvo um byte ou 2, se eu tivesse a previsão de permitir o duso do modificador ganancioso, então poderia ter substituído d<dpor um &dah, da próxima vez.

Explicação

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
fonte