Dado un número, imprima su "suma colectiva"

20

Dado un número como entrada, imprima su suma colectiva

¿Qué es una suma colectiva?

Considere el número 13214, la entrada

Recorriendo cada uno de los dígitos comenzando desde la izquierda, podremos obtener su suma colectiva.

1 significa mirar el primer dígito y agregarlo a la suma, suma = 1

3 significa mirar los "primeros 3 dígitos" y agregarlo a la suma, suma = 1 + 132

2 significa mirar los "primeros 2 dígitos" y agregarlo a la suma, suma = 1 + 132 + 13

1 significa mirar el primer dígito y agregarlo a la suma, suma = 1 + 132 + 13 + 1

4 significa mirar los "primeros 4 dígitos" y agregarlo a la suma, suma = 1 + 132 + 13 + 1 + 1321

Suma total = 1468y esta es su salida


Casos especiales:

Si encontramos un 0, entonces claramente mantenemos la suma igual

The number 1301 would have a sum = 1 + 130 + 1 = 132

Si encontramos un número que es más grande que la longitud de la entrada, lo agregamos todo

The number 251 would have a sum = 25 + 251 + 2 = 278

Casos de prueba:

collectiveSum(0) = 0

collectiveSum(2) = 2

collectiveSum(2315) = 23 + 231 + 2 + 2315 = 2571

La menor cantidad de bytes gana. ¡Feliz golf!

K Split X
fuente
66
Como suele ser una pregunta con este tipo de tareas: ¿podemos aceptar una lista de los dígitos como nuestra entrada?
Jonathan Allan
77
Al 2315caso de prueba le falta + 2el 1y debería resultar en 2571.
Jonathan Allan
¿Esperamos tener que lidiar con entradas que comienzan con 0 aparte de 0? ¿Cómo debería tratar el programa con estas entradas
Fəˈnɛtɪk
Parece que el último caso de prueba está mal; debería ser 2571.
Shaggy
No veo por qué la entrada debería ser un número en lugar de una lista de enteros. Parece una forma de entrada innecesariamente engorrosa.
Wheat Wizard

Respuestas:

7

05AB1E ,  4  3 bytes

-1 gracias a Kevin Cruijssen (uso de evitar a })

€£O

Pruébalo en línea!

¿Cómo?

€£O - implicit input   e.g. 2315
€   - map with:
 £  -   head to             23, 231, 2, 2315
  O - sum                   2571
Jonathan Allan
fuente
Derrótame 13 segundos xD
Urna de pulpo mágico
Me alegro de haber esperado para agregar el enlace a bytes y luego: p
Jonathan Allan
ε£}puede ser €£guardar un byte.
Kevin Cruijssen
@KevinCruijssen, ¿esa también era una opción cuando creé esto?
Jonathan Allan
@JonathanAllan No estoy completamente seguro, pero creo que de hecho ya lo estaba. Adnan comenzó a escribir la reescritura de Elixir en el verano de 2018 (que se lanzó en agosto), y ya estuvo allí durante bastante tiempo en la versión heredada de 05AB1E antes de eso. Ya estaba allí cuando publiqué mi primera respuesta 05AB1E en abril de 2018. Por lo tanto, es posible que se haya agregado poco después de publicar esta respuesta, pero no estoy seguro.
Kevin Cruijssen
5

Python 2 , 43 bytes

lambda n:sum(int('0'+n[:int(x)])for x in n)

Pruébalo en línea!

Solo ASCII
fuente
Desafortunadamente, esto parece elevar una ValueErrorentrada for 1301, o cualquier entrada que tenga un cero como uno de sus dígitos.
Mathmandan
@mathmandan ¿Debería arreglarse ahora?
Solo ASCII
La intfunción puede aceptar un número entero, reemplazando el '0'literal de cadena por solo 0debería eliminar un byte.
MooseOnTheRocks
@MooseOnTheRocks Lo hizo de una manera que me parece menos hacky (?), A menos que sea estúpido y arruine algo (por lo general)
solo ASCII
4

Python 2, 72 bytes

Primera presentación! ¡Gracias a @DestructibleLemon por la ayuda!

import sys;d=sys.argv[1];s=0;for e in d:s+=int(d[:int(e)]);print str(s)
Allen Fisher
fuente
Para que lo sepas, el usuario de la comunidad parece haber dado automáticamente el voto negativo cuando edité el encabezado de tu publicación. Lo siento. Es una característica molesta y sin sentido . Aunque no sé por qué lo hizo esta vez, porque hasta donde puedo decir, esto no se marcó como de baja calidad.
Steadybox
Bienvenido a PPCG! Buena primera presentación! Y sí, como dijo Steadybox, el voto negativo se colocó automáticamente sin una buena razón en particular. Su publicación ha recibido algunos votos positivos, así que espero que en el próximo trabajo cron se elimine el
voto negativo
3

Haskell, 43 37 bytes

f l=sum[read$'0':take(read[d])l|d<-l]

Pruébalo en línea!

El número de entrada se toma como una cadena.

   [        |d<-l]      -- for every digit d in the input string
        read[d]         -- convert to a number
      take     l        -- and take that many digits from l
     0:                 -- prepend a 0 (to handle 0s)
   read                 -- convert to a number
sum                     -- sum all numbers
nimi
fuente
3

Ruby , 36 bytes

->n{n.sum{|x|n[0,x.to_i].join.to_i}}

Pruébalo en línea!

Solo ASCII
fuente
#sumno está definido en fixnums, así que supongo que quieres nser una cadena. Sin embargo, String#sumcalcula ay not a particularly good checksumignora el bloque que le da. Si quisiste decir n.chars.sum{, Enumerable#sumno está en el ruby ​​stdlib, es una extensión proporcionada por rieles. Pruebe sus soluciones antes de publicarlas.
Shelvacu
@Shelvacu Sí, aunque estoy tomando datos como una matriz ... vea el pie de página proporcionado. Plus Enumerable#sumestá en Ruby 2.4 , y TIO usa 2.4
solo ASCII
31 bytes si toma una matriz de dígitos como entrada
Asone Tuhid
@AsoneTuhid No creo que sea una forma válida de entrada, si encuentra evidencia de lo contrario, explique
solo ASCII
Esta página no parece abordar el problema, pero no veo una lista de enteros que sea demasiado diferente de una lista de caracteres (que es lo que su respuesta toma como entrada)
Asone Tuhid
3

JavaScript, 42 40 bytes

Gracias @Shaggy por jugar 2 bytes

f=
x=>[...x].map(y=>a+=+x.slice(0,y),a=0)|a

console.log(f("2315"))
console.log(f("0100"))
console.log(f("2"))
console.log(f("01025"))

Recibe la entrada como una cadena y devuelve un entero. Como está escrito actualmente, este código deja ceros a la izquierda en cualquier número entero.

fəˈnɛtɪk
fuente
40 bytes:x=>[...x].map(y=>a+=+x.slice(0,y),a=0)|a
Shaggy
3

R, 57 bytes

salvó uno más gracias a @Vlo

sum(strtoi(substring(i<-scan(,""),1,el(strsplit(i,"")))))

was: Guardado 4 bytes gracias a la sugerencia de @Robert Hacken.

i=scan(,"");sum(strtoi(substring(i,1,el(strsplit(i,"")))))

Un enfoque de cuerda simple.

Zahiro Mor
fuente
1
Puede guardar 4 bytes reemplazando unlistpor el.
Robert Hacken
1
Ahorre 1 con asignación en líneasum(strtoi(substring(i<-scan(,""),1,el(strsplit(i,"")))))
Vlo
2

C (gcc) , 106 bytes

j,k,c,t;f(char*S){for(t=j=0;S[j];j++)c=S[k=S[j]-48<(c=strlen(S))?S[j]-48:c],S[k]=0,t+=atoi(S),S[k]=c;S=t;}

Pruébalo en línea!

Jonathan Frech
fuente
2

Carbón de leña , 10 bytes

IΣIEθ✂θ⁰Iι

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

   Eθ       Map over input string
        Iι  Cast current character to integer
     ✂θ⁰    Slice input string to that length
 ΣI         Cast slices to integer and take the sum
I           Cast result to string and implicitly print
Neil
fuente
Jaja, tuve exactamente lo mismo
solo ASCII
2

Octava , 56 bytes

@(n)sum(str2num(['' 32+char(n.*(find(n)<=(n'-48))-32)]))

Función anónima que toma una cadena como argumento de entrada y devuelve un número como salida.

Pruébalo en línea!

La versión más corta

@(n)sum(str2num(['' char(n.*(find(n)<=(n'-48)))]))

funciona en Matlab, porque char(0)se trata como un espacio.

Luis Mendo
fuente
2

Jalea ,  7  5 bytes

-2 gracias a Dennis (cabeza vectorises>. <)

4 si podemos tomar listas de dígitos *

Dḣ`ḌS

Pruébalo en línea!

* * ḣ`ḌS

¿Cómo?

Dḣ`ḌS - Link: integer, n   e.g. 2315
D     - to decimal list         [2,3,1,5]
  `   - repeat left as right    [2,3,1,5]
 ḣ    - head                    [2,3], [2,3,1], [2], [2,3,1,5]
   Ḍ  - from decimal lists      23, 231, 2, 2315
    S - sum                     2571
Jonathan Allan
fuente
2

Perl 6 , 27 bytes

{sum $_ X[&substr]^«.comb}

Pruébalo

Expandido:

{  # bare block lambda with implicit param 「$_」

  sum

    $_           # the input

      X[&substr] # crossed using &substr sub as if it was an infix operator

    \          # upto 「^」 for each of the following 「«」 (creates Range objects)
    .comb        # the input split into digits (implicit method call on 「$_」
}
Brad Gilbert b2gills
fuente
2

C (gcc) , 77 75 bytes

Tiene que ser compilado con el -lminterruptor o GCC no reconoce las funciones matemáticas.

r,q,i;f(n){for(r=0,i=n;i;i/=10)q=log10(n)+1-i%10,r+=n/pow(10,q>0?q:0);n=r;}

Pruébalo en línea!

gastropner
fuente
2

dc , 55 bytes

[0*]sq?dsfZ1-se[lfddZrIle^/I%-d0>qIr^/+led1-se0<a]dsaxp

¡Sin cadenas ni matrices! De hecho, los dígitos requeridos se adquieren únicamente a través de la manipulación matemática.

Pruébalo en línea!

R. Kap
fuente
1

Casco , 6 bytes

ṁd´M↑d

Pruébalo en línea!

Explicación

ṁd´M↑d  -- example input: 1301
     d  -- decimal digits: [1,3,0,1]
  ´M    -- map over it using it as argument (example with 3):
    ↑   -- | take: [1,3,0]
        -- : [[1],[1,3,0],[],[1]]
ṁ       -- map and then sum the result (example on [1,3,0]):
 d      -- | as decimal: 130
        -- : 1 + 130 + 0 + 1 = 132
ბიმო
fuente
1

J , 18 bytes

[:+/"."0".@{."0 1]

Explicación

Toma una cadena como entrada

           {."0 1  - take
    "."0           - current char as int items
                 ] - from the argument
         ".        - and convert them to an integer  
[:+/               - add them up

Pruébalo en línea!

Galen Ivanov
fuente
1

Japt, 5 bytes

Toma la entrada como una cadena.

¬x@¯X

Intentalo


Explicación

          :Implicit input of integer string U
¬         :Split to an array of characters/digits
  @       :Pass each X through a function
   ¯X     :Slice U from the first to the Xth character
 x        :Reduce by addition
Lanudo
fuente
O_o O Japt es realmente golfista o lo estoy haciendo realmente mal
solo ASCII
2
@ Solo ASCII: Japt es mucho más "golf" de lo que la mayoría de la gente piensa; ganamos nuestra parte justa de desafíos, incluso superando a Charcoal y SOGL en un reciente desafío de arte ascii .
Shaggy
@Shaggy Claro, pero no me di cuenta de que era Jelly / Actually / 05AB1E nivel golfy
solo ASCII
@ Solo ASCII: Oh, sí, definitivamente está a la altura de ellos, manteniéndose muy bien :) Si está interesado, eche un vistazo a nuestro nom del idioma del mes. o visite la sala de chat de Japt en algún momento y le daremos un recorrido.
Shaggy
1

Stax , 6 bytes

ç╫&º±å

Ejecútelo y depúrelo en línea

La representación ascii correspondiente del mismo programa es esta.

EZFy(e+

E        get array of digits
 Z       push 0 under array of digits
  F      for each digit, run the rest of the program
   y     input as a string
    (    get start of string for specified number of characters
     e   evaluate substring as integer
      +  add
recursivo
fuente
0

En realidad , 10 bytes

╝ß⌠≈╛H≈⌡MΣ

Pruébalo en línea!

Explicación

╝          Push input to register 1
 ß         Push n-th input (0 by default)
        M  Map
  ⌠    ⌡   Function
   ≈       Cast current character of input to int
    ╛      Get value of register 1 (input)
     H     Push input[:current character]
      ≈    Cast to int
         Σ Sum
Solo ASCII
fuente
0

JavaScript, 43 bytes

Son más de las 3 de la mañana, ¿por qué sigo jugando al golf?

Toma la entrada como una cadena.

s=>(g=x=>s[x]?+s.slice(0,s[x])+g(++x):0)(0)

Pruébalo en línea

Lanudo
fuente
0

Perl 5, 26 bytes

Incluye +1parap

perl -pE 's%.%/.{0,$&}/;$\+=$&%eg}{' <<< 2315; echo
Ton Hospel
fuente
0

K4 , 22 bytes

Solución:

+/10/:'(x&#x)#\:x:10\:

Ejemplos:

q)k)+/10/:'(x&#x)#\:x:10\:13214
1468
q)k)+/10/:'(x&#x)#\:x:10\:1301
132
q)k)+/10/:'(x&#x)#\:x:10\:251
278
q)k)+/10/:'(x&#x)#\:x:10\:2315
2571

Explicación:

Irrumpir en base-10, tomar min de cada número y la longitud de la lista de esto. Convertir de nuevo y resumir.

+/10/:'(x&#x)#\:x:10\: / the solution
                  10\: / to base 10, 123 => 1 2 3
                x:     / save as x
             #\:       / take (#) each left
       (    )          / the left
          #x           / count (#) length of x
        x&             / min of x and the length
  10/:'                / from base 10 each
+/                     / sum up the results
callejero
fuente
0

Java 8, 92 bytes

n->n.chars().map(c->(c-=48)>0?new Integer(n.substring(0,c<n.length()?c:n.length())):0).sum()

Explicación:

Pruébalo en línea.

n->                                  // Method with String parameter and int return-type
  n.chars()                          //  Loop over the characters
   .map(c->(c-=48)                   //   Convert character to digit
        >0?                          //    And if it's larger than 0
         new Integer(n.substring(0,  //     Take the first `x` digits, where `x` is:
          c<n.length()?              //      If the digit higher than the total a.o. digits
           c                         //       Take the first `c` digits
          :                          //      Else:
           n.length()))              //       Take all digits
         :                           //    Else:
          0)                         //     Take 0
   .sum()                            //   And sum everything
Kevin Cruijssen
fuente
0

REXX 118 bytes

pull n                           
l=length(n)                      
a=0                              
j=1                              
do while (j<=l)                  
if substr(n,j,1)==0 then m=0;    
else m=substr(n,1,substr(n,j,1));
a=a+m                            
j=j+1                            
end                              
say a                                 

Pruébelo aquí
Proporcione el valor de entrada en la pestaña STDIN.

Srinivasan JV
fuente
0

Jalea , 6 bytes

DµḣµVS

Pruébalo en línea!

Obtenga los Digits de la entrada, luego obtenga los primeros elementos [de cada dígito] de la entrada ( ead), luego e Vcada suma para que sea un número nuevamente y Sum.

cromático
fuente