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


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!


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 „+”.

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.


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!


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!


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ą.

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

C ponownie pokazuje swoje dane uwierzytelniające :)

2
Wydaje mi się, że powinna istnieć krótsza droga, ale jej nie widzę :)
Digital Trauma


9

Siatkówka , 11 7 bajtów

-4 dzięki Martinowi Enderowi

.*
$*
1

Wypróbuj online!


Konwertuj na unary:

.*
$*

Policz liczbę 1s:

1

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.

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

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

7

R 11 bajtów

sum(scan())

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


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.


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!


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

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.


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

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

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.

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

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.


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.

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.

+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

jq , 5 bajtów

add, plus flaga wiersza poleceń -s .

Na przykład:

% echo "1\n2\n3\n4\n5" | jq -s add
15

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)

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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.