¿Cuántos acarreos necesito para sumar estos dos números?

27

Tarea

Dados dos enteros positivos, genera el número de acarreos necesarios para sumarlos en una suma larga en la base 10.

Ejemplos

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

Se necesitan tres acarreos.

 ¹
 348
+ 91
----
 439

Se necesita un transporte.

Casos de prueba

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

Tanteo

Este es el . La respuesta más corta en bytes gana. Se aplican lagunas estándar .

Monja permeable
fuente
Relacionados .
Leaky Nun
14
Caso de prueba sugerido: 190192, 90909(tiene un descanso en los acarreos).
Jonathan Allan
55
De la respuesta de @Jenny_mathy : el número de acarreos es igual a la diferencia entre (1) la suma de la suma de dígitos de las dos entradas y (2) la suma de dígitos de la suma de las dos entradas, dividido por nueve. Esto se debe a que cuando hay un carry, resta 10 y suma 1 a la suma de dígitos. Por ejemplo, 9+9te da 18, pero la suma de dígitos es 9+9-10+1porque hay un carry.
JungHwan Min
¿Podemos suponer que los números encajan en el tipo int de nuestro idioma? En particular para Python 2, ¿deberíamos tratar de repragregar un Lpara los números anteriores 2**63-1?
xnor

Respuestas:

21

Mathematica, 46 39 bytes

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

entrada

[348,51]

-7 bytes de JungHwan

J42161217
fuente
Dang, realmente me gusta este método. La diferencia entre (1) la suma de la suma de dígitos de las dos entradas y (2) la suma de dígitos de la suma de las dos entradas, es nueve veces el número de acarreos porque cuando hay un acarreo, restas 10 del suma de dígitos y agregue 1 a la suma de dígitos.
JungHwan Min
¡Yo también! gracias por los consejos de golf
J42161217
Los casos de prueba dicen que [348,51] debería devolver 0 pero obtengo 56/3 cuando ejecuto esto ...?
numbermaniac
Welp, parece que está funcionando ahora. No está seguro de lo que estaba haciendo antes de Mathematica ...
numbermaniac
6

JavaScript (ES6), 50 bytes

Solucionado el robo de la solución de ovs

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

Explicación

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

Llevar explicación

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

Solo ASCII
fuente
1
348 , 52debería ser2
Toto
¿Como funciona esto? ¿Podría agregar una explicación?
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;}

Pruébalo en línea!

Kritixi Lithos
fuente
No necesita inicializar variables globales.
user1502040
@ user1502040 necesita, si se usan dentro de la función sin ser inicializados.
Leaky Nun
1
Solo estoy entendiendo la inicialización aquí: las variables se inicializan a cero automáticamente, pero solo una vez, por lo que debido a que las presentaciones de funciones en PPCG tienen que funcionar si la función se ejecuta más de una vez, deben ser puestas a cero manualmente para el beneficio de la segunda y ejecuciones posteriores.
5

Jalea ,  13 12 11  9 bytes

-1 byte portando la respuesta matemática de Jenny_mathy .
-2 bytes más por un mejor golf: p

;SN$DFS:9

Ver el conjunto de pruebas .

¿Cómo?

;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

Mi solución de 12 bytes ...

:⁵+
DUSç\>9S

Un enlace monádico que toma un par de enteros y devuelve el número de acarreos como un entero.

¡Probablemente hay un camino más corto! ¡Había!

Pruébalo en línea! o ver el conjunto de pruebas .

Cómo

:⁵+ · 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
fuente
Los muchos usos de Dy 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)

Pruébalo en línea!

Para cada valor posicional m=1, 10, 100, ..., 10**99, verifica si hay un carry en ese valor posicional. La verificación de desbordamiento a%m+b%m>=mse acorta a ~a%m<b%m.

Una variante más agradable de 45 bytes donde flota ay se bdesplaza hacia abajo

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

lamentablemente se encuentra con problemas de precisión de flotación.

xnor
fuente
¿No puedes usar a+b<mcomo tu condición de terminación?
Neil
@Neil Tiene que ser el <=que sea más largo.
xnor
1e99andes asqueroso.
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)

Se guardó 1 byte al agregar una iteración adicional de no hacer nada para los acarreos en el lugar de 1. Se ahorraron 7 bytes al apropiarse de la comprobación de transporte de @ xnor. También tenía una versión más elegante de 45 bytes, pero sufre de imprecisión de coma flotante; funcionaría muy bien traducido a un idioma con aritmética decimal exacta:

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

Pruébalo en línea!

ovs
fuente
1
Como señaló @JonathanAllan, si utilizó una llamada a su función, también debe declararla. Dicho esto, su respuesta es de 55 bytes
Sr. Xcoder
@ Mr.Xcoder lo arregló
ovs
2

05AB1E , 11 10 bytes

|DO‚€SOÆ9÷

Pruébalo en línea!

Okx
fuente
@JonathanAllan Corregido.
Okx
|DO‚€SOÆ9÷por 10 bytes.
Emigna
@Emigna Eso es genial.
Okx
2

Neim , 10 bytes

𝔸𝐣𝐬₁₂𝔻𝐬𝕊λ𝕍

Explicación:

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

¡Intentalo!

Solución alternativa, también 10 bytes:

𝔸D𝐣𝐬S𝐬𝐬𝕊9𝕍

Explicación:

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

¡Intentalo!

Okx
fuente
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 de eliminación |0En este caso, el ciclo se ejecuta hasta que $iesINF

Casos de prueba

Jörg Hülsermann
fuente
¿Cuándo se $iconvierte INF?
gato
@cat No estoy seguro de por qué es importante. No he usado esto. 1.0E+309es el primer INFvalor ¡ Pruébelo en línea!
Jörg Hülsermann
0

Braingolf , 20 bytes

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

Pruébalo en línea!

Utiliza el mismo método que todos los demás.

Podría haber guardado un byte o 2 si hubiera tenido la previsión de permitir el duso del modificador codicioso, entonces podría haber reemplazado d<dcon &dah bueno, la próxima vez.

Explicación

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
fuente