Suma liczb w standardzie w

32

Rozważ strumień / plik z jedną liczbą całkowitą w wierszu. Na przykład:

123
5
99

Twój kod powinien wypisać sumę tych liczb, to znaczy 227.

Format wejściowy jest ściśle jedną liczbą całkowitą na wiersz. Nie można na przykład założyć, że dane wejściowe znajdują się w jednym wierszu jako tablica liczb całkowitych.

Możesz pobrać dane wejściowe ze STDIN, w postaci nazwy pliku lub pliku o wybranej nazwie; możesz wybrać który. Żadne inne sposoby uzyskania danych wejściowych są niedozwolone.

Dane wejściowe będą zawierać co najmniej jedną liczbę całkowitą. Możesz założyć, że wszystkie liczby całkowite są nieujemne, a ich całkowita suma jest mniejsza niż .232

Dennis
źródło
2
Czy istnieje nowa linia? Czy ta nowa linia jest opcjonalna?
Proszę przestańcie być źli
9
Cześć! Odrzuciłem to wyzwanie, ponieważ jest ono sprzeczne z naszymi standardami społecznościowymi w zakresie akceptowalnych formatów wejścia / wyjścia, ponieważ mają restrykcyjny format wejściowy.
AdmBorkBork
1
@AdmBorkBork i ja omawialiśmy to szczegółowo na czacie. Zgodziliśmy się nie zgadzać :)
22
Jako autor rzeczy, których należy unikać uciążliwych operacji we / wy i arbitralnie zastępujących wartości domyślne , chcę bronić tego wyzwania na tej podstawie. Tutaj wkład przetwarzania jest podstawą wyzwania, a nie dodatkową pracą, która odwraca uwagę od głównego wyzwania. To nie jest „dodawanie liczb” z dziwnymi wymaganiami I / O, to „zrób to I / O” z dodawaniem jako krok. Zastąpienie standardowego wejścia / wyjścia jest konieczne, aby odpowiedzi nie powodowały skrótu w głównym zadaniu.
xnor
2
Dlaczego nie można użyć wejścia funkcji?
CalculatorFeline

Odpowiedzi:

15

05AB1E , 2 bajty

|O

Wyjaśnienie:

|   Get input as array
 O  Sum

Wypróbuj online!

Okx
źródło
7
To niedorzeczne :)
Czy to czyta ze standardowego w?
1
@Lembik to robi.
Okx
Wierzę, że twoja 2-bajtowa odpowiedź była pierwsza. Jesteś zwycięzcą! (Chyba że ktoś znajdzie odpowiedź 1-bajtową.)
4
@Lembik Lub odpowiedź 0-bajtowa ....
Towarzysz SparklePony
21

Bash + coreutils, 16 bajtów

xargs|tr \  +|bc

Wypróbuj online!

Istnieją dwie spacje po \. Działa to również w przypadku liczb ujemnych.

Wyjaśnienie:

xargs             # known trick to turn newlines into spaces, while adding a
                  #trailing newline when printing the result (needed for bc)
|tr \  +          # turn spaces into '+'s
|bc               # calculates the sum

Możesz się zastanawiać, dlaczego tr \\n +|bcnie jest lepiej, ponieważ zamienia on nowe linie bezpośrednio w „+”. Cóż, ma 2 nieprzewidziane błędy:

  • jeśli dane wejściowe mają końcowy znak nowej linii, to są konwertowane na końcowe „+”, stąd nie ma po nim liczby do wykonania dodawania
  • a najbardziej dziwnym problemem jest to, że bc wymaga końca nowej linii po wejściu, ale właśnie zastąpiłeś wszystkie wejściowe znaki nowej linii znakami „+”.
seshoumara
źródło
1
Lubię to. To miłe i sprytne.
Czy możesz użyć tr \\ n + Zamiast xargs?
1
@Lembik Masz na myśli tr \\n +|bc? Jeśli tak, zapoznaj się ze zaktualizowanym wyjaśnieniem. Dobre pytanie.
seshoumara
paste -s -d+|bcma 15 bajtów
David Conrad
1
@Lembik Nie rozważyłem tego przypadku, ale na szczęście skrypt nadal działa. xargs|tr \ +w tym przypadku nic nie robi, a bc otrzymuje numer i drukuje go z powrotem.
seshoumara
14

MATL , 2 bajty

Us

To oczekuje danych wejściowych w pliku tekstowym o nazwie defin.

Gif lub tak się nie stało :

wprowadź opis zdjęcia tutaj

Lub wypróbuj online! ( dzięki Dennis za konfigurację! )

Wyjaśnienie

Po uruchomieniu programu MATL, jeśli definznaleziono nazwany plik (nazwa odnosi się do „domyślnego wejścia”), jego zawartość jest automatycznie ładowana jako tekst i przekazywana do stosu jako ciąg przed wykonaniem kodu.

Funkcja Uocenia ciąg, aby przekonwertować go na wektor kolumnowy liczb i soblicza sumę, która jest domyślnie wyświetlana.

Luis Mendo
źródło
13

Japt , 2 bajty

Nx

Wyjaśnienie

     Implicit: parse STDIN into array of numbers, strings, and arrays
N    Get the resulting parsed array.
 x   Sum.
     Implicit: output result of last expression

Wypróbuj online!

ETHprodukcje
źródło
12

Wklej + BC, 13 bajtów

paste -sd+|bc

Wyjaśnienie:

paste -s        Take one line at a time from input
        d+      Joining by '+'
          |bc   Pass as expression to bc

Kolejna odpowiedź powłoki!

Okx
źródło
1
Bardzo schludnie i schludnie.
Ooh, miałem paste -s -d+|bci nie zdawałem sobie sprawy, że mogę skonsolidować przełączniki. Schludny!
David Conrad
12

Perl 6 , 13 bajtów

say sum lines

Spróbuj

Wyjaśnienie

  • lines()zwraca listę wierszy $*INlub $*ARGFILES„magiczny” uchwyt wprowadzania wiersza poleceń.
  • sum(…)został dodany do Perla 6, aby umożliwić [+] Listoptymalizację pod kątem Pozycjonerów, które mogą obliczyć swoją sumę bez generowania wszystkich swoich wartości, takich jak 1..100000
    (myślałem, że sumjest tu po prostu zbyt słodki, by używać go [+]tak, jak normalnie)
  • say(…)wywołaj .gistmetodę na jej wejściu i wypisze ją z dodatkową nową linią.
Brad Gilbert b2gills
źródło
Co to jest perl 5?
15
brzmi to jak lolcode
Bryan Boettcher
@Lembik jest wyraźnie oznaczony jako Perl 6 , który jest językiem siostrzanym dla Perl 5 .
Brad Gilbert b2gills
Była literówka. Miałem na myśli, co to jest w Perlu 5?
1
Dobrze $a+=$_ for <>;print $adziała w Perlu 5, ale może być krótsza droga.
Brad Gilbert b2gills
10

C, 53 bajty

r;main(i){for(;~scanf("%d",&i);r+=i);printf("%d",r);}
orlp
źródło
C ponownie pokazuje swoje dane uwierzytelniające :)
2
Wydaje mi się, że powinna istnieć krótsza droga, ale jej nie widzę :)
Digital Trauma
10

Python 3 , 28 bajtów

print(sum(map(int,open(0))))

Zaczerpnięte z tej wskazówki . Powiedziano mi, że to nie będzie działać w systemie Windows.

Wypróbuj online!

Dennis
źródło
5
Nauczyłem się czegoś nowego!
9

Siatkówka , 11 7 bajtów

-4 dzięki Martinowi Enderowi

.*
$*
1

Wypróbuj online!


Konwertuj na unary:

.*
$*

Policz liczbę 1s:

1
Riley
źródło
1
Ciekawe, w jaki sposób Retina, jako język oparty na wyrażeniach regularnych, może wykonać sumę w mniejszej liczbie bajtów niż najkrótsza jak dotąd opublikowana odpowiedź na bash. +1
seshoumara
Czy ten odczyt jest w standardzie?
2
@Lembik Tak to jest.
Riley
Gdyby dopuszczono wprowadzanie danych w unarnym, byłby to tylko jeden bajt.
mbomb007
@ mbomb007 Już próbowałem tego w sed.
Riley
8

Brain-Flak , 20 bajtów

(([]){[{}]{}([])}{})

Wypróbuj online!

Wyjaśnienie

To gra golfowa od rozwiązania wykonanego przez Riley na czacie . Jego rozwiązaniem było:

([])({<{}>{}<([])>}{})

Jeśli znasz Brain-Flak, jest to dość oczywiste. Przesuwa wysokość stosu i zlicza jedną wartość podczas odliczania, a na koniec przesuwa sumę wszystkich przebiegów.

Jest to całkiem niezły golf, ale zeruje oba, {}a ([])jednak będą miały wartości, które różnią się tylko o jeden, więc jeśli zamiast tego usuniemy maski i zrobimy jedną z dwóch ujemnych, prawie powinni się anulować.

([])({[{}]{}([])}{})

Ponieważ zawsze różnią się one o jeden, mamy niefortunną okoliczność, w której nasza odpowiedź zawsze zależy od wysokości stosu. Aby temu zaradzić, wystarczy przesunąć początek pchnięcia, aby objąć pierwszą wysokość stosu.

(([]){[{}]{}([])}{})
Kreator pszenicy
źródło
1
Myślałem o tym, ponieważ ujemny pop anuluje poprzednią wysokość wypchniętą (przed pętlą lub do końca poprzedniego czasu przez), a ostatnia wysokość wynosi 0, więc można ją zignorować.
Riley
8

Python 2, 40 bajtów

import sys;print sum(map(int,sys.stdin))
orlp
źródło
7

R 11 bajtów

sum(scan())

scanpobiera dane wejściowe, po jednym numerze w wierszu. I sumcóż, sumy.

Frédéric
źródło
7

Perl 5 , 9 bajtów

8 bajtów kodu + -pflaga.

$\+=$_}{

Wypróbuj online!

Za pomocą -p, wejście jest odczytywane po jednym wierszu na raz, zapisywane za $_każdym razem. Używamy $\jako akumulatora, ponieważ dzięki -pfladze jest ona domyślnie drukowana na końcu. Niedopasowane }{są używane, więc -pflaga drukuje tylko $\raz na końcu zamiast drukowania, $_a $\przy każdej linii czyta jak zwykle.

Dada
źródło
Nie mogę tego nawet przeanalizować! :) Proszę o wyjaśnienie.
@Lembik Proszę bardzo.
Dada
Niezrównana część w nawiasach jest bardzo niejasna!
@Lembik Są nie parenthesizes ... Są albo francuski lub Curly Szelki zależy od kogo zapytać, ale na pewno nie są)(
CraigR8806
1
@Lembik accolades, najwyraźniej.
Michael Vehrs
7

Pure Bash, 37 36 bajtów

Dzięki @KevinCruijssen za bajt!

while read a;do((b+=a));done;echo $b

Wypróbuj online!

betseg
źródło
3
Bardzo ładnie i czysto.
Nigdy nie programuję w Bash , ale czy nie można usunąć odstępu między nimi do ((? TIO wydaje się działać.
Kevin Cruijssen
@KevinCruijssen Tak, wygląda na to, że działa. Używam zsh jako mojej codziennej powłoki i nie działa w zsh bez spacji, po prostu założyłem, że nie zadziała w Bash, ale najwyraźniej działa.
betseg
6

Haskell, 32 bajty

interact$show.sum.map read.lines

Wypróbuj online! .

interactzbiera całe dane wejściowe ze standardowego wejścia, przekazuje je do funkcji podanej jako argument i wypisuje ciąg znaków, który odzyskuje z tej funkcji. Funkcja to:

            lines   -- split input into list of lines at nl
      map read      -- convert every line to a number (read is polymorphic,
                    -- but as want to sum it later, the type checker knows
                    -- it has to be numbers)
    sum             -- sum the list of numbers
show                -- convert back to string
nimi
źródło
1
To sprawia, że ​​naprawdę lubię Haskella. W Scali muszę to zrobić, lines.map(_.toInt) ponieważ sum oczekuje jakiejś domniemanej konwersji numerycznej z String lub w tym przypadku jawnej.
Stefan Aleksić
6

PHP, 22 bajty

<?=array_sum(file(t));

Zakłada się, że istnieje plik o nazwie „t” z listą liczb całkowitych.

file()otwiera plik i zwraca tablicę z każdą linią zapisaną w tablicy osobnym elementem. array_sum()sumuje wszystkie elementy w tablicy.

Kodos Johnson
źródło
5

Awk, 19 bajtów

{s+=$1}END{print s}

Wyjaśnienie:

{s+=$1}                For all lines in the input, add to s
        END             End loop
           {print s}    Print s
Okx
źródło
1
„Wyjaśnienie już wkrótce ™” To byłoby moje nowe hasło, jeśli nie byłoby znakiem towarowym ...
ETHproductions
2
W języku awk twoja odpowiedź to właściwie tylko 19 bajtów: {s+=$1}END{print s}:)
Cyfrowa trauma
5

dc , 14 bajtów

0[+?z2=a]dsaxp

Wypróbuj online!

Wyjaśnienie:

 [      ] sa   # recursive macro stored in register a, does the following:
  +            # - sum both numbers on stack
               #   (prints to stderr 1st time since there's only 1)
   ?           # - read next line, push to stack as number
    z          # - push size of stack
     2         # - push 2
      =a       # - if stack size = 2, ? yielded something, so recurse
               # - otherwise end macro (implicit)
0              # push 0 (accumulator)
         d     # duplicate macro before storing it
            x  # Call macro
             p # The sum should be on the stack now, so print it
Brian McCutchon
źródło
4

CJam , 5 bajtów

q~]1b

Wypróbuj online!

Jak to działa

q     e# Read all input from STDIN.
 ~    e# Evaluate that input, pushing several integers.
  ]   e# Wrap the entire stack in an array.
   1b e# Convert from base 1 to integer.
      e# :+ (reduce by sum) would work as well, but 1b handles empty arrays.
Dennis
źródło
Jak 1bsumuje się liczby?
Esolanging Fruit
CJam nie wymaga reprezentacji kanonicznej do konwersji cyfr na liczby całkowite; [<x> <y> <z> <w>]<b>bpo prostu oblicza b³x + b²y + bz + w . Gdy b = 1 , daje to x + y + z + w .
Dennis
4

Python, 38 30 bajtów

lambda n:sum(map(int,open(n)))

W Pythonie pliki są otwierane przez open('filename')(oczywiście). Są jednak iterowalne. Za każdym razem, gdy iterujesz przez plik, pojawia się następny wiersz. Tak więc mapa iteruje każdą listę, wywołując intją, a następnie sumuje wynikową listę.

Zadzwoń z nazwą pliku jako wejściem. (tj. f('numbers.txt'))

8 bajtów zapisanych przy użyciu map(int, open(n)) zamiast zrozumienia listy. Oryginalny kod:

lambda n:sum([int(i)for i in open(n)]) 
Rɪᴋᴇʀ
źródło
1
Uważam, że możesz to zrobić również przy użyciu standardowego wejścia, wywołując „open (0)”. Nie jestem pewien, czy można to wykorzystać do skrócenia odpowiedzi.
cole
@Cole dennis ma już takie rozwiązanie, więc zostawię swoją odpowiedź w ten sposób.
Rɪᴋᴇʀ
Mój błąd, przepraszam za to; Nie przeczytałem do końca, zanim dotarłem do twojej odpowiedzi.
cole
@Cole jest w porządku, nie mam nic przeciwko.
Rɪᴋᴇʀ
4

Mathematica, 19 bajtów

Zakłada środowisko notebooka Mathematica.

Tr[#&@@@Import@"a"]

Oczekuje, że dane wejściowe znajdą się w pliku a.

Martin Ender
źródło
To szalony język :)
4
@Lembik normalni ludzie napisaliby to bardzo czytelnie jako, Total @ Flatten @ Import @ "a"a nawet "a" // Import // Flatten // Total. ;)
Martin Ender
Nie byłoby Tr[#&@@@Import@#]&również dozwolone?
ngenisis
4

Galaretka , 9 8 bajtów

ƈFпFỴVS

STDIN tak naprawdę nie jest rzeczą Jelly ...

Wypróbuj online!

Jak to działa

ƈFпFỴVS  Main link. No arguments. Implicit argument: 0

  п      While loop; while the condition returns a truthy value, execute the body
          and set the return value to the result. Collect all results (including 0,
          the initial return value) in an array and return that array.
ƈ           Body: Yield a character from STDIN or [] if the input is exhausted.
 F          Condition: Flatten, mapping 0 to [], '0' to "0", and [] to [] (falsy).
    F     Flatten the result.
     Ỵ    Split at newlines.
      V   Evaluate the resulting strings.
       S  Take the sum.
Dennis
źródło
1
Druga Fmoże być również dla jasności.
Erik the Outgolfer
4

Pure Bash, 30

read -d_ b
echo $[${b//'
'/+}]

Wypróbuj online.

  • reads plik wejściowy za jednym razem przechodzi do zmiennej b. -d_informuje, readże separatorem wiersza jest _zamiastnewline
  • ${b//'newline'/+}zastępuje nowymi liniami w bz+
  • echo $[ ... ] arytmetycznie ocenia wynikowe wyrażenie i wysyła je.
Cyfrowa trauma
źródło
+1 Bardzo miło. Czy czytany jest również znak nowej linii pliku wejściowego? Pytam, ponieważ jeśli zostanie zastąpione przez „+”, $[]sekcja będzie błąd z powodu końcowego „+”.
seshoumara,
@seshoumara Wygląda na to, że readodrzuca końcowe końcowe znaki nowej linii, nawet jeśli ogranicznik linii jest przesłonięty _. Jest to być może zastrzeżenie read, ale działa dobrze w tej sytuacji.
Cyfrowa trauma
Zawsze cieszę się z czystego rozwiązania bash.
3

Vim, 16 bajtów / naciśnięć klawiszy

:%s/\n/+
C<C-r>=<C-r>"<C-h>

Ponieważ V jest wstecznie kompatybilny, możesz wypróbować online!

DJMcMayhem
źródło
Czy to czyta ze standardowego pliku lub z pliku?
Tak, Vim może nie być dozwolony ... :(
CalculatorFeline
3

jq , 5 bajtów

add, plus flaga wiersza poleceń -s .

Na przykład:

% echo "1\n2\n3\n4\n5" | jq -s add
15
Lynn
źródło
6 bajtów . Ponieważ -saddnie zadziała, policz przestrzeń.
agc
@agc Popraw mnie, jeśli się mylę, ale sam kod to add(3 bajty) i musisz dodać 2 bajty dla -sflagi. Spacja nie jest liczona jako kod ani flaga: jest to separator wiersza poleceń używany przez język.
caird coinheringaahing
1
@ ThisGuy, -sflaga jest skrótem od „ --slurp ” (odczytaj cały strumień wejściowy do dużej tablicy i uruchom filtr tylko raz), co zmienia zarówno sposób jqinterpretacji danych wejściowych, jak i sposób uruchamiania kodu. To nie jest tak, że -epo sedprostu mówi, sedże kolejnym ciągiem jest kod. Jest -sto bardziej część samego jqjęzyka, dlatego też byłaby to również przestrzeń 6-bajtowa.
agc
3

Właściwie 2 bajty

Wypróbuj online!

Wyjaśnienie:

kΣ
    (implicit input - read each line, evaluate it, and push it to the stack)
k   pop all stack elements and push them as a list
 Σ  sum
    (implicit output)
Mego
źródło
3

dc, 22

[pq]sq0[?z2>q+lmx]dsmx

Wydaje się to raczej dłuższe niż powinno, ale trudno jest zdecydować, kiedy osiągnięty zostanie koniec pliku. Jedynym sposobem, w jaki mogę to zrobić, jest sprawdzenie długości stosu po ?poleceniu.

Wypróbuj online .

[pq]                    # macro to `p`rint top-of-stack, then `q`uit the program
    sq                  # save the above macro in the `q` register
      0                 # push `0` to the stack.  Each input number is added to this (stack accumulator)
       [         ]      # macro to:
        ?               # - read line of input
         z              # - push stack length to stack
          2             # - push 2 to the stack
           >q           # - if 2 > stack length then invoke macro stored in `q` register
             +          # - add input to stack accumulator
              lmx       # - load macro stored in `m` register and execute it
                  d     # duplicate macro
                   sm   # store in register `m`
                     x  # execute macro

Uwaga: makro mnazywa się rekurencyjnie. Nowoczesne dcimplementują rekurencję ogona dla tego rodzaju rzeczy, więc nie powinno być obaw o przepełnienie stosu.

Cyfrowa trauma
źródło
Witamy w PPCG! Pamiętaj, że jeśli nie ma wystarczających wyjaśnień, przejdzie przez filtr postów niskiej jakości .
Matthew Roh,
@SIGSEGV powitanie nie jest konieczne - jestem tu już od dawna ;-). Tak, pisałem moje wyjaśnienie, kiedy skomentowałeś. Zobacz edycję.
Cyfrowa trauma
1
Jestem ci winien bajt za powielenie makra przed jego zapisaniem.
Brian McCutchon