Podając liczbę, wydrukuj „sumę zbiorczą”

20

Podając liczbę jako dane wejściowe, wydrukuj jej sumę zbiorczą

Co to jest suma zbiorowa?

Rozważ liczbę 13214, dane wejściowe

Pętląc każdą cyfrę zaczynając od lewej, będziemy mogli uzyskać jej sumę zbiorczą.

1 oznacza spójrz na pierwszą cyfrę i dodaj ją do sumy sum = 1

3 oznacza spójrz na „pierwsze 3 cyfry” i dodaj go do sumy, sum = 1 + 132

2 oznacza spójrz na „pierwsze 2 cyfry” i dodaj go do sumy, sum = 1 + 132 + 13

1 oznacza spójrz na pierwszą cyfrę i dodaj ją do sumy, sum = 1 + 132 + 13 + 1

4 oznacza spójrz na „pierwsze 4 cyfry” i dodaj go do sumy, sum = 1 + 132 + 13 + 1 + 1321

Suma całkowita = 1468i to jest twój wynik


Przypadki specjalne:

Jeśli napotkamy a 0, to oczywiście zachowamy tę samą sumę

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

Jeśli napotkamy liczbę większą niż długość danych wejściowych, dodajemy wszystko

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

Przypadki testowe:

collectiveSum(0) = 0

collectiveSum(2) = 2

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

Najkrótsza ilość bajtów wygrywa. Miłej gry w golfa!

K Split X
źródło
6
Jak to często bywa w przypadku tego rodzaju zadań: czy możemy przyjąć listę cyfr jako nasz wkład?
Jonathan Allan
7
W 2315przypadku testowym brakuje + 2oznaczenia 1i powinno to skutkować 2571.
Jonathan Allan
Czy oczekujemy, że będziemy musieli poradzić sobie z danymi wejściowymi zaczynającymi się od 0 oprócz 0? Jak program powinien sobie poradzić z tymi
danymi
Wygląda na to, że ostatni przypadek testowy jest nieprawidłowy; powinno być 2571.
Kudłaty
Nie rozumiem, dlaczego dane wejściowe powinny być liczbą, a nie listą liczb całkowitych. Wydaje się to niepotrzebnie kłopotliwą formą wprowadzania danych.
Wheat Wizard

Odpowiedzi:

7

05AB1E ,  4  3 bajty

-1 dzięki Kevin Cruijssen (użycie unikania a })

€£O

Wypróbuj online!

W jaki sposób?

€£O - implicit input   e.g. 2315
€   - map with:
 £  -   head to             23, 231, 2, 2315
  O - sum                   2571
Jonathan Allan
źródło
Pokonaj mnie o 13 sekund xD
Magic Octopus Urn
Cieszę się, że czekałem na dodanie linku do bajtów: p
Jonathan Allan
ε£}może być €£zapisanie bajtu.
Kevin Cruijssen
@KevinCruijssen był również opcją, kiedy to stworzyłem?
Jonathan Allan
@JonathanAllan Nie do końca pewny, ale myślę, że tak już było. Adnan zaczął pisać przeróbkę Elixiru latem 2018 r. (Która została wydana w sierpniu), a wcześniej była już od dłuższego czasu w starszej wersji 05AB1E. Było już tam, kiedy opublikowałem swoją pierwszą odpowiedź 05AB1E w kwietniu 2018 r. Może być więc możliwe, że została dodana wkrótce po opublikowaniu tej odpowiedzi, ale nie jestem pewien.
Kevin Cruijssen
5

Python 2 , 43 bajty

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

Wypróbuj online!

Tylko ASCII
źródło
Niestety wydaje się, że podnosi to ValueErrorwejście 1301lub dowolne wejście, które ma zero jako jedną z jego cyfr.
matmandan
@mathmandan Powinien zostać naprawiony?
Tylko ASCII,
intFunkcja może przyjąć liczbę całkowitą, zastępując '0'ciągiem znaków z właśnie 0powinien zgolić jednego bajta.
MooseOnTheRocks
@MooseOnTheRocks Zrobiłem to w sposób, który wydaje mi się mniej hacky (?), Chyba że jestem głupi i coś zepsułem (zwykle)
tylko ASCII
4

Python 2, 72 bajty

Pierwsze zgłoszenie! Dzięki @DestructibleLemon za pomoc!

import sys;d=sys.argv[1];s=0;for e in d:s+=int(d[:int(e)]);print str(s)
Allen Fisher
źródło
Po prostu wiesz, że opinia głosowa została wydana automatycznie przez użytkownika społeczności, gdy edytowałem nagłówek twojego postu. Przepraszam. To denerwująca, bezsensowna cecha . Chociaż nie wiem, dlaczego tym razem tak się stało, ponieważ, o ile mogę stwierdzić, nie oznaczono tego jako niskiej jakości.
Steadybox
Witamy w PPCG! Ładne pierwsze zgłoszenie! I tak, jak powiedział Steadybox, głosowanie negatywne zostało automatycznie umieszczone bez konkretnego powodu. Twój post zyskał kilka głosów pozytywnych, więc mam nadzieję, że przy następnej pracy crona automatyczna opinia negatywna powinna zostać usunięta :)
HyperNeutrino
3

Haskell, 43 37 bajtów

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

Wypróbuj online!

Numer wejściowy jest traktowany jako ciąg.

   [        |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
źródło
3

Rubinowy , 36 bajtów

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

Wypróbuj online!

Tylko ASCII
źródło
#sumnie jest zdefiniowane w fixnums, więc zakładam, że chcesz nbyć ciągiem. Jednak String#sumoblicza not a particularly good checksumi ignoruje blok ją podać. Jeśli miałeś na myśli n.chars.sum{, Enumerable#sumnie ma go w ruby ​​stdlib, jest to rozszerzenie dostarczane przez szyny. Sprawdź swoje rozwiązania przed ich opublikowaniem.
Shelvacu
@Shelvacu Tak, przyjmuję dane jako tablicę ... zobacz stopkę pod warunkiem. Plus Enumerable#sumjest w Ruby 2.4 , a TIO używa 2.4
tylko ASCII
31 bajtów, jeśli weźmiesz tablicę cyfr jako dane wejściowe
Asone Tuhid
@AsoneTuhid Nie sądzę, że jest to poprawna forma danych wejściowych, jeśli znajdziesz dowody, proszę wyjaśnić
tylko ASCII
Wygląda na to, że ta strona nie rozwiązuje problemu, ale nie widzę listy liczb całkowitych jako zbyt odmiennych od listy znaków (co odpowiada twojej odpowiedzi jako danych wejściowych)
Asone Tuhid
3

JavaScript, 42 40 bajtów

Dzięki @Shaggy za grę w golfa z 2 bajtów

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

Odbiera dane wejściowe jako ciąg znaków i zwraca liczbę całkowitą. Jak obecnie napisano, ten kod pozostawia zera na dowolnych liczbach całkowitych.

Fəˈnɛtɪk
źródło
40 bajtów:x=>[...x].map(y=>a+=+x.slice(0,y),a=0)|a
Kudłaty
3

R, 57 bajtów

uratował jeszcze jeden dzięki @Vlo

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

był: Zapisano 4 bajty dzięki sugestii @Robert Hacken.

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

Proste podejście łańcuchowe.

Zahiro Mor
źródło
1
Możesz zapisać 4 bajty zamieniając unlistna el.
Robert Hacken,
1
Zaoszczędź 1 dzięki przypisaniu inlinesum(strtoi(substring(i<-scan(,""),1,el(strsplit(i,"")))))
Vlo
2

C (gcc) , 106 bajtów

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

Wypróbuj online!

Jonathan Frech
źródło
2

Węgiel drzewny , 10 bajtów

IΣIEθ✂θ⁰Iι

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

   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
źródło
Haha, miałem dokładnie to samo
tylko ASCII
2

Oktawa , 56 bajtów

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

Anonimowa funkcja, która pobiera ciąg jako argument wejściowy i zwraca liczbę jako wynik.

Wypróbuj online!

Krótsza wersja

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

działa w Matlabie, ponieważ char(0)jest traktowany jako spacja.

Luis Mendo
źródło
2

Galaretka ,  7  5 bajtów

-2 dzięki Dennisowi (głowa wektoryzuje>. <)

4, jeśli możemy wziąć listy cyfr *

Dḣ`ḌS

Wypróbuj online!

* ḣ`ḌS

W jaki sposób?

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
źródło
2

Perl 6 , 27 bajtów

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

Sprawdź to

Rozszerzony:

{  # 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
źródło
2

C (gcc) , 77 75 bajtów

Musi zostać skompilowany z -lmprzełącznikiem, inaczej GCC nie rozpoznaje funkcji matematycznych.

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

Wypróbuj online!

gastropner
źródło
2

dc , 55 bajtów

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

Bez ciągów ani tablic! Rzeczywiście, wymagane cyfry są uzyskiwane wyłącznie poprzez manipulację matematyczną.

Wypróbuj online!

R. Kap
źródło
1

Łuska , 6 bajtów

ṁd´M↑d

Wypróbuj online!

Wyjaśnienie

ṁ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
ბიმო
źródło
1

J , 18 bajtów

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

Wyjaśnienie

Pobiera ciąg jako dane wejściowe

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

Wypróbuj online!

Galen Iwanow
źródło
1

Japt, 5 bajtów

Pobiera dane wejściowe jako ciąg.

¬x@¯X

Spróbuj


Wyjaśnienie

          :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
Kudłaty
źródło
O_o Albo Japt jest naprawdę golfowy, albo źle się spisuję
tylko ASCII
2
@ Tylko ASCII: Japt jest bardziej „golfowy”, niż większość ludzi zdaje sobie sprawę; wygrywamy uczciwą część wyzwań, pokonując nawet węgiel drzewny i SOGL w ostatnim wyzwaniu ascii-art .
Kudłaty
@Shaggy Pewnie, ale nie zdawałem sobie sprawy, że to był Jelly / Actually / 05AB1E golfy
tylko ASCII
@ Tylko ASCII: Och, tak, zdecydowanie jest tam z nimi, ładnie się trzyma :) Jeśli jesteś zainteresowany, spójrz na nasz język miesiąca nom. lub wpadnij kiedyś do pokoju rozmów Japt, a my oprowadzimy Cię po nim.
Kudłaty
1

Stax , 6 bajtów

ç╫&º±å

Uruchom i debuguj online

Odpowiada to reprezentacji ascii tego samego programu.

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
rekurencyjny
źródło
0

Właściwie 10 bajtów

╝ß⌠≈╛H≈⌡MΣ

Wypróbuj online!

Wyjaśnienie

╝          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
Tylko ASCII
źródło
0

JavaScript, 43 bajty

Jest już dobrze po trzeciej rano, dlaczego nadal gram w golfa ?!

Pobiera dane wejściowe jako ciąg.

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

Wypróbuj online

Kudłaty
źródło
0

Perl 5, 26 bajtów

Obejmuje +1dlap

perl -pE 's%.%/.{0,$&}/;$\+=$&%eg}{' <<< 2315; echo
Ton Hospel
źródło
0

K4 , 22 bajty

Rozwiązanie:

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

Przykłady:

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

Wyjaśnienie:

Włam się do podstawy-10, weź z tego min każdej liczby i długość listy. Przelicz z powrotem i podsumuj.

+/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
źródło
0

Java 8, 92 bajty

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

Wyjaśnienie:

Wypróbuj 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
źródło
0

REXX 118 bajtów

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                                 

Wypróbuj tutaj
Podaj wartość wejściową na karcie STDIN.

Srinivasan JV
źródło
0

Galaretka , 6 bajtów

DµḣµVS

Wypróbuj online!

Zdobądź Digits wejścia, a następnie zdobądź pierwsze [każda cyfra] elementy wejścia ( ead), a następnie połącz Vwszystkie sumy, aby znów była liczbą i Sum.

chromat
źródło