Dado um número, imprima sua "soma coletiva"

20

Dado um número como entrada, imprima sua soma coletiva

O que é uma soma coletiva?

Considere o número 13214, a entrada

Ao percorrer cada um dos dígitos a partir da esquerda, poderemos obter sua soma coletiva.

1 significa olhar para o primeiro dígito e adicioná-lo à soma, soma = 1

3 significa olhar para os "primeiros 3 dígitos" e adicioná-lo à soma, soma = 1 + 132

2 significa olhar para os "primeiros 2 dígitos" e adicioná-lo à soma, soma = 1 + 132 + 13

1 significa olhar para o primeiro dígito e adicioná-lo à soma, soma = 1 + 132 + 13 + 1

4 significa olhar para os "primeiros 4 dígitos" e adicioná-lo à soma, soma = 1 + 132 + 13 + 1 + 1321

Soma total = 1468e esta é sua saída


Casos especiais:

Se encontrarmos a 0, então claramente manteremos a soma da mesma

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

Se encontrarmos um número maior que o comprimento da entrada, adicionamos tudo

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

Casos de teste:

collectiveSum(0) = 0

collectiveSum(2) = 2

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

Menor quantidade de bytes vence. Feliz golfe!

K Divisão X
fonte
6
Como costuma ser uma pergunta com esses tipos de tarefas: podemos aceitar uma lista dos dígitos como entrada?
Jonathan Allan
7
O 2315caso de teste está faltando a + 2partir do 1e deve resultar em 2571.
Jonathan Allan
Esperamos ter que lidar com entradas começando com 0 além de 0? Como deve ser o programa lidar com estas entradas
fənɛtɪk
Parece que o último caso de teste está errado; deveria ser 2571.
Shaggy
Não vejo por que a entrada deve ser um número, e não uma lista de números inteiros. Parece uma forma de entrada desnecessariamente complicada.
Assistente de trigo

Respostas:

7

05AB1E ,  4  3 bytes

-1 graças a Kevin Cruijssen (uso de evitar a })

€£O

Experimente online!

Quão?

€£O - implicit input   e.g. 2315
€   - map with:
 £  -   head to             23, 231, 2, 2315
  O - sum                   2571
Jonathan Allan
fonte
Bata-me por 13 segundos xD
Magic Octopus Urn
Fico feliz que esperei para adicionar o link para bytes, em seguida: p
Jonathan Allan
ε£}pode ser €£para salvar um byte.
Kevin Cruijssen 24/06
@KevinCruijssen também foi uma opção quando eu criei isso?
Jonathan Allan
@ JonathanAllan Não tenho muita certeza, mas acho que já era. Adnan começou a escrever a reescrita do Elixir no verão de 2018 (que foi lançado em agosto), e já estava lá por um bom tempo na versão herdada do 05AB1E antes disso. Já estava lá quando publiquei minha primeira resposta 05AB1E em abril de 2018. Portanto, pode ser possível que ela tenha sido adicionada logo após a publicação desta resposta, mas não tenho certeza.
Kevin Cruijssen 24/06
5

Python 2 , 43 bytes

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

Experimente online!

Somente ASCII
fonte
Infelizmente, isso parece aumentar a ValueErrorentrada de 1301ou qualquer entrada que tenha zero como um de seus dígitos.
mathmandan
@mathmandan Deve ser corrigido agora?
somente ASCII
A intfunção pode aceitar um número inteiro, substituindo o '0'literal da string por just 0shave off one byte.
MooseOnTheRocks
@MooseOnTheRocks Será que de uma forma que parece menos hacky-olhando para mim, a menos que eu sou estúpido e confuso alguma coisa (geralmente) (?)
ASCII-only
4

Python 2, 72 bytes

Primeira submissão! Obrigado a @DestructibleLemon pela ajuda!

import sys;d=sys.argv[1];s=0;for e in d:s+=int(d[:int(e)]);print str(s)
Allen Fisher
fonte
Só para você saber, o voto negativo parece ter sido dado automaticamente pelo usuário da comunidade quando editei o cabeçalho da sua postagem. Desculpe. É uma característica irritante e sem sentido . Embora eu não saiba por que fez isso desta vez, porque, até onde eu sei, isso não foi sinalizado como de baixa qualidade.
Steadybox
Bem-vindo ao PPCG! Boa primeira apresentação! E sim, como disse a Steadybox, o voto negativo foi automaticamente colocado sem nenhuma boa razão em particular. O envio da mensagem tem obtido algumas upvotes por isso espero que no trabalho cron seguinte, o downvote automático deve ser removido :)
HyperNeutrino
3

Haskell, 43 37 bytes

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

Experimente online!

O número de entrada é tomado como uma sequência.

   [        |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
fonte
3

Ruby , 36 bytes

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

Experimente online!

Somente ASCII
fonte
#sumnão está definido nos fixnums, então suponho que você queira nser uma string. No entanto, String#sumcalcula a not a particularly good checksume ignora o bloco que você fornece. Se você quis dizer n.chars.sum{, Enumerable#sumnão está no ruby ​​stdlib, é uma extensão fornecida por rails. Teste suas soluções antes de publicá-las.
Shelvacu
@ Shelvacu Sim, estou recebendo a entrada como uma matriz ... veja o rodapé fornecido. O Plus Enumerable#sumestá no Ruby 2.4 , e o TIO usa 2.4
somente ASCII
31 bytes se você tomar uma série de dígitos como entrada
asone Tuhid
@AsoneTuhid Eu não acho que seja uma forma válida de entrada, se você encontrar evidências de outra forma, por favor explique
ASCII-only
Esta página não parece resolver a questão, mas eu não ver uma lista de números inteiros como sendo muito diferente de uma lista de caracteres (que é o que a sua resposta toma como entrada)
asone Tuhid
3

JavaScript, 42 40 bytes

Obrigado @Shaggy por jogar fora 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"))

Recebe entrada como uma string e retorna um número inteiro. Como atualmente escrito, esse código deixa zeros à esquerda em quaisquer números inteiros.

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

R, 57 bytes

salvou mais um graças a @Vlo

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

foi: salvou 4 bytes graças à sugestão de @Robert Hacken.

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

Uma abordagem de string simples.

Zahiro Mor
fonte
1
Você pode salvar 4 bytes substituindo unlistpor el.
Robert Hacken
1
Salve 1 com atribuição em linhasum(strtoi(substring(i<-scan(,""),1,el(strsplit(i,"")))))
Vlo 27/02
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;}

Experimente online!

Jonathan Frech
fonte
2

Carvão , 10 bytes

IΣIEθ✂θ⁰Iι

Experimente online! Link é a versão detalhada do código. Explicação:

   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
fonte
Haha, eu tinha exatamente a mesma coisa
somente ASCII
2

Oitava , 56 bytes

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

Função anônima que pega uma string como argumento de entrada e retorna um número como saída.

Experimente online!

A versão mais curta

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

trabalha no Matlab, porque char(0)é tratado como um espaço.

Luis Mendo
fonte
2

Geléia ,  7  5 bytes

-2 graças a Dennis (a cabeça vectoriza>. <)

4 se pudermos pegar listas de dígitos *

Dḣ`ḌS

Experimente online!

* ḣ`ḌS

Quão?

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
fonte
2

Perl 6 , 27 bytes

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

Teste-o

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
fonte
2

C (gcc) , 77 75 bytes

Precisa ser compilado com o -lmswitch ou o GCC não reconhece as funções 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;}

Experimente online!

gastropner
fonte
2

dc , 55 bytes

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

Sem cordas nem matrizes! De fato, os dígitos necessários são adquiridos apenas através da manipulação matemática.

Experimente online!

R. Kap
fonte
1

Casca , 6 bytes

ṁd´M↑d

Experimente online!

Explicação

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

J , 18 bytes

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

Explicação

Pega uma string como entrada

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

Experimente online!

Galen Ivanov
fonte
1

Japt, 5 bytes

Recebe a entrada como uma sequência.

¬x@¯X

Tente


Explicação

          :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
Shaggy
fonte
O_o O Japt é realmente golfista ou eu estou realmente errado
somente ASCII
2
@ Somente ASCII: Japt é muito mais "golfista" do que a maioria das pessoas imagina; vencemos nosso quinhão de desafios, vencendo até o carvão e a SOGL em um recente desafio da arte- científica .
Shaggy
@Shaggy Claro, mas eu não sabia que era golfe de nível Jelly / Na verdade / 05AB1E
somente ASCII
@ Somente ASCII: Ah, sim, definitivamente está lá com eles, mantendo-se muito bem :) Se você estiver interessado, dê uma olhada no nosso idioma do nom do mês. ou entre na sala de bate-papo do Japt em algum momento e faremos um tour.
Shaggy
1

Stax , 6 bytes

ç╫&º±å

Execute e depure on-line

A representação ascii correspondente do mesmo programa é essa.

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
fonte
0

Na verdade , 10 bytes

╝ß⌠≈╛H≈⌡MΣ

Experimente online!

Explicação

╝          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
Somente ASCII
fonte
0

JavaScript, 43 bytes

Já passa das 3 da manhã, por que ainda estou jogando golfe ?!

Recebe a entrada como uma sequência.

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

Experimente online

Shaggy
fonte
0

Perl 5, 26 bytes

Inclui +1parap

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

K4 , 22 bytes

Solução:

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

Exemplos:

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

Explicação:

Entre na base 10, considere o mínimo de cada número e o comprimento da lista. Converta de volta e resuma.

+/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
rua
fonte
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()

Explicação:

Experimente online.

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

Experimente aqui
Fornecer valor de entrada na guia STDIN.

Srinivasan JV
fonte
0

Gelatina , 6 bytes

DµḣµVS

Experimente online!

Obtenha os Digits da entrada e, em seguida, obtenha os primeiros [cada dígito] dos elementos da entrada ( ead) e depois Vcada soma para torná-lo um número novamente e Sum.

cromática
fonte