Etant donné un nombre, imprimez sa «somme collective»

20

Étant donné un nombre en entrée, imprimez sa somme collective

Qu'est-ce qu'une somme collective?

Considérez le nombre 13214, l'entrée

En parcourant chacun des chiffres à partir de la gauche, nous pourrons obtenir sa somme collective.

1 signifie regarder le premier chiffre et l'ajouter à la somme, somme = 1

3 signifie regarder les "3 premiers chiffres" et les ajouter à la somme, somme = 1 + 132

2 signifie regarder les "2 premiers chiffres" et les ajouter à la somme, somme = 1 + 132 + 13

1 signifie regarder le premier chiffre et l'ajouter à la somme, somme = 1 + 132 + 13 + 1

4 signifie regarder les "4 premiers chiffres" et les ajouter à la somme, somme = 1 + 132 + 13 + 1 + 1321

Somme totale = 1468et ceci est votre sortie


Cas spéciaux:

Si nous rencontrons un 0, alors nous gardons clairement la même somme

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

Si nous rencontrons un nombre plus grand que la longueur de l'entrée, nous ajoutons tout

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

Cas de test:

collectiveSum(0) = 0

collectiveSum(2) = 2

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

Le nombre d'octets le plus court gagne. Bon golf!

K Split X
la source
6
Comme c'est souvent une question avec ce genre de tâches: pouvons-nous accepter une liste de chiffres comme entrée?
Jonathan Allan
7
Le 2315cas de test ne contient pas + 2le 1et devrait se traduire par 2571.
Jonathan Allan
Nous attendons-nous à devoir traiter des entrées commençant par 0 à part 0? Comment le programme devrait-il gérer ces entrées
fəˈnɛtɪk
Il semble que le dernier cas de test soit incorrect; devrait être 2571.
Shaggy
Je ne vois pas pourquoi l'entrée devrait être un nombre plutôt qu'une liste d'entiers. Cela semble être une forme d'entrée inutilement lourde.
Wheat Wizard

Réponses:

7

05AB1E ,  4  3 octets

-1 merci à Kevin Cruijssen (utilisation d' éviter a })

€£O

Essayez-le en ligne!

Comment?

€£O - implicit input   e.g. 2315
€   - map with:
 £  -   head to             23, 231, 2, 2315
  O - sum                   2571
Jonathan Allan
la source
Battez-moi de 13 secondes xD
Urne de poulpe magique
Heureux d'avoir attendu pour ajouter le lien aux octets, puis: p
Jonathan Allan
ε£}peut être €£de sauvegarder un octet.
Kevin Cruijssen
@KevinCruijssen était-ce également une option lorsque j'ai créé cela?
Jonathan Allan
@JonathanAllan Pas tout à fait sûr, mais je pense que c'était déjà le cas. Adnan a commencé à écrire la réécriture d'Elixir à l'été 2018 (qui a été publié en août), et était déjà là depuis un certain temps dans la version héritée de 05AB1E avant cela. Elle était déjà là lorsque j'ai posté ma toute première réponse 05AB1E en avril 2018. Il est donc possible qu'elle ait été ajoutée peu de temps après avoir posté cette réponse, mais je ne suis pas sûr.
Kevin Cruijssen
5

Python 2 , 43 octets

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

Essayez-le en ligne!

ASCII uniquement
la source
Malheureusement, cela semble soulever un ValueErrorpour l'entrée de 1301, ou toute entrée qui a un zéro comme l'un de ses chiffres.
mathmandan
@mathmandan Doit être corrigé maintenant?
ASCII uniquement
La intfonction peut accepter un entier, en remplaçant le '0'littéral de chaîne par juste 0devrait raser un octet.
MooseOnTheRocks
@MooseOnTheRocks A fait d'une manière qui me semble moins hacky (?), À moins que je ne sois stupide et que je gâche quelque chose (généralement)
ASCII uniquement
4

Python 2, 72 octets

Première soumission! Merci à @DestructibleLemon pour l'aide!

import sys;d=sys.argv[1];s=0;for e in d:s+=int(d[:int(e)]);print str(s)
Allen Fisher
la source
Juste pour que vous le sachiez, le downvote semble avoir été donné automatiquement par l' utilisateur de la communauté lorsque j'ai modifié l'en-tête de votre message. Pardon. C'est une caractéristique ennuyeuse et absurde . Bien que je ne sache pas pourquoi cela a été le cas cette fois-ci, car pour autant que je sache, cela n'a pas été signalé comme de mauvaise qualité.
Steadybox
Bienvenue chez PPCG! Belle première soumission! Et oui, comme l'a dit Steadybox, le downvote a été automatiquement placé sans raison particulière. Votre message a obtenu quelques votes positifs, alors j'espère que lors du prochain cron, le
vote négatif
3

Haskell, 43 37 octets

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

Essayez-le en ligne!

Le numéro d'entrée est considéré comme une chaîne.

   [        |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
la source
3

Rubis , 36 octets

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

Essayez-le en ligne!

ASCII uniquement
la source
#sumn'est pas défini sur les fixnums, donc je suppose que vous voulez nêtre une chaîne. Cependant, String#sumcalcule a not a particularly good checksumet ignore le bloc que vous lui donnez. Si vous vouliez dire n.chars.sum{, Enumerable#sumn'est pas dans le stdlib rubis, c'est une extension fournie par des rails. Veuillez tester vos solutions avant de les publier.
Shelvacu
@Shelvacu Ouais, je prends l'entrée comme un tableau cependant ... voir le pied de page fourni. Plus Enumerable#sumest dans Ruby 2.4 et TIO utilise 2.4
ASCII uniquement le
31 octets si vous prenez un tableau de chiffres en entrée
Asone Tuhid
@AsoneTuhid Je ne pense pas que ce soit une forme d'entrée valide, si vous trouvez des preuves autrement, veuillez expliquer
ASCII uniquement
Cette page ne semble pas résoudre le problème, mais je ne vois pas une liste d'entiers trop différente d'une liste de caractères (ce que votre réponse prend en entrée)
Asone Tuhid
3

JavaScript, 42 40 octets

Merci @Shaggy d'avoir joué au golf sur 2 octets

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

Reçoit l'entrée sous forme de chaîne et renvoie un entier. Tel qu'il est actuellement écrit, ce code laisse des zéros non significatifs sur tous les entiers.

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

R, 57 octets

encore sauvé grâce à @Vlo

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

était: enregistré 4 octets grâce à la suggestion de @Robert Hacken.

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

Une approche de chaîne simple.

Zahiro Mor
la source
1
Vous pouvez enregistrer 4 octets en remplaçant unlistpar el.
Robert Hacken
1
Économisez 1 avec affectation en lignesum(strtoi(substring(i<-scan(,""),1,el(strsplit(i,"")))))
Vlo
2

C (gcc) , 106 octets

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

Essayez-le en ligne!

Jonathan Frech
la source
2

Fusain , 10 octets

IΣIEθ✂θ⁰Iι

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

   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
la source
Haha, j'ai eu exactement la même chose
ASCII uniquement
2

Octave , 56 octets

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

Fonction anonyme qui prend une chaîne comme argument d'entrée et renvoie un nombre en sortie.

Essayez-le en ligne!

La version plus courte

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

fonctionne dans Matlab, car il char(0)est traité comme un espace.

Luis Mendo
la source
2

Gelée ,  7  5 octets

-2 merci à Dennis (tête vectorise>. <)

4 si nous pouvons prendre des listes de chiffres *

Dḣ`ḌS

Essayez-le en ligne!

* ḣ`ḌS

Comment?

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
la source
2

Perl 6 , 27 octets

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

Essaye-le

Étendu:

{  # 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
la source
2

C (gcc) , 77 75 octets

Doit être compilé avec le -lmcommutateur ou GCC ne reconnaît pas les fonctions mathématiques.

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

Essayez-le en ligne!

gastropner
la source
2

cc , 55 octets

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

Pas de chaînes ni de tableaux! En effet, les chiffres requis sont acquis uniquement par manipulation mathématique.

Essayez-le en ligne!

R. Kap
la source
1

Husk , 6 octets

ṁd´M↑d

Essayez-le en ligne!

Explication

ṁ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
ბიმო
la source
1

J , 18 octets

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

Explication

Prend une chaîne en entrée

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

Essayez-le en ligne!

Galen Ivanov
la source
1

Japt, 5 octets

Prend l'entrée sous forme de chaîne.

¬x@¯X

Essayez-le


Explication

          :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
Hirsute
la source
O_o Soit Japt est vraiment golfique, soit je fais vraiment mal
ASCII uniquement
2
@ ASCII uniquement: Japt est beaucoup plus "golfique" que la plupart des gens ne le pensent; nous gagnons notre lot de défis, battant même Charcoal et SOGL dans un récent défi ascii-art .
Shaggy
@Shaggy Bien sûr, mais je ne savais pas que c'était le niveau Jelly / En fait / 05AB1E golfy
ASCII uniquement le
@ ASCII uniquement: Oh, ouais, c'est définitivement là-haut avec eux, qui tient bien la sienne :) Si vous êtes intéressé, jetez un œil à notre langue du mois nom. ou passez dans le salon de discussion Japt un jour et nous vous ferons une visite.
Shaggy
1

Stax , 6 octets

ç╫&º±å

Exécutez-le et déboguez-le en ligne

La représentation ascii correspondante du même programme est la suivante.

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
récursif
la source
0

En fait , 10 octets

╝ß⌠≈╛H≈⌡MΣ

Essayez-le en ligne!

Explication

╝          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
ASCII uniquement
la source
0

JavaScript, 43 octets

C'est bien après 3 heures du matin, pourquoi suis-je encore en train de jouer au golf?!

Prend l'entrée sous forme de chaîne.

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

Essayez-le en ligne

Hirsute
la source
0

Perl 5, 26 octets

Comprend +1pourp

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

K4 , 22 octets

Solution:

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

Exemples:

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

Explication:

Divisez en base 10, prenez min de chaque nombre et la longueur de la liste à partir de cela. Reconvertissez et résumez.

+/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
streetster
la source
0

Java 8, 92 octets

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

Explication:

Essayez-le en ligne.

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
la source
0

REXX 118 octets

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                                 

Essayez-le ici
Fournissez la valeur d'entrée dans l'onglet STDIN.

Srinivasan JV
la source
0

Gelée , 6 octets

DµḣµVS

Essayez-le en ligne!

Obtenez les Dchiffres de l'entrée, puis obtenez les premiers [chaque chiffre] éléments de l'entrée ( ead), puis e Val chaque somme pour en faire à nouveau un nombre et Seuh.

ChromaticiT
la source