Summiere die Zahlen auf Standard in

32

Betrachten Sie einen Stream / eine Datei mit einer Ganzzahl pro Zeile. Beispielsweise:

123
5
99

Ihr Code sollte also die Summe dieser Zahlen ausgeben 227.

Das Eingabeformat ist nur eine Ganzzahl pro Zeile. Sie können beispielsweise nicht davon ausgehen, dass sich die Eingabe in einer Zeile als Array von Ganzzahlen befindet.

Sie können entweder eine Eingabe von STDIN in Form eines Dateinamens oder einer Datei mit einem Namen Ihrer Wahl vornehmen. Sie können wählen, welche. Andere Eingabemethoden sind nicht zulässig.

Die Eingabe enthält mindestens eine Ganzzahl. Sie können davon ausgehen, dass alle Ganzzahlen nicht negativ sind und dass ihre Gesamtsumme kleiner als ist .232

Dennis
quelle
2
Gibt es einen nachgestellten Zeilenumbruch? Ist dieser Zeilenumbruch optional?
Bitte hör auf böse zu sein
9
Hallo! Ich habe diese Herausforderung abgelehnt, weil sie gegen unsere Community-Standards für akzeptable Eingabe- / Ausgabeformate verstößt, da sie ein restriktives Eingabeformat aufweist.
AdmBorkBork
1
@AdmBorkBork und ich haben dies ausführlich im Chatroom besprochen. Wir haben zugestimmt, nicht
22
Als Verfasser der Dinge, die Sie vermeiden sollten, umständliche E / A- Vorgänge durchzuführen und die Standardeinstellungen willkürlich außer Kraft zu setzen , möchte ich diese Herausforderung aus diesen Gründen verteidigen. Hier ist der Verarbeitungsaufwand das Fleisch der Herausforderung, keine zusätzliche Arbeit, die von der Hauptherausforderung ablenkt. Es geht nicht darum, Zahlen mit seltsamen E / A-Anforderungen hinzuzufügen, sondern darum, diese E / A als Schritt hinzuzufügen. Das Überschreiben der Standard-E / A ist erforderlich, damit Antworten die Hauptaufgabe nicht verkürzen.
Xnor
2
Warum kann der Funktionseingang nicht verwendet werden?
CalculatorFeline

Antworten:

15

05AB1E , 2 Bytes

|O

Erläuterung:

|   Get input as array
 O  Sum

Probieren Sie es online!

Okx
quelle
6
Das ist lächerlich :)
Liest das vom Standard ein?
1
@Lembik tut es.
Okx
Ich glaube, Ihre 2-Byte-Antwort war zuerst. Du bist der Sieger! (Es sei denn, jemand findet eine 1-Byte-Antwort.)
3
@Lembik Oder eine 0-Byte-Antwort ....
Genosse SparklePony
21

Bash + Coreutils, 16 Bytes

xargs|tr \  +|bc

Probieren Sie es online!

Nach dem stehen zwei Leerzeichen \. Dies funktioniert auch für negative Zahlen.

Erläuterung:

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

Sie fragen sich vielleicht, warum tr \\n +|bces nicht besser ist, da es Zeilenumbrüche direkt in '+' umwandelt. Nun, das hat 2 unvorhergesehene Fehler:

  • Wenn die Eingabe eine abschließende Newline enthält, wird sie in ein abschließendes '+' konvertiert, sodass nach ihr keine Nummer für die Addition vorhanden ist
  • und das seltsamste Problem ist, dass bc nach der Eingabe einen abschließenden Zeilenumbruch benötigt, aber Sie haben gerade alle Zeilenumbrüche durch '+' ersetzt.
Seshoumara
quelle
Ich mag das. Es ist nett und klug.
Könnten Sie stattdessen tr \\ n + ohne xargs verwenden?
1
@Lembik Meinst du tr \\n +|bc? Wenn ja, lesen Sie bitte die aktualisierte Erklärung. Gute Frage.
Seshoumara
paste -s -d+|bcist 15 Bytes
David Conrad
1
@Lembik Hat diesen Fall nicht berücksichtigt, aber zum Glück funktioniert das Skript immer noch. xargs|tr \ +In diesem Fall geschieht nichts, und bc empfängt die Nummer und druckt sie zurück.
Seshoumara
14

MATL , 2 Bytes

Us

Dies erwartet die Eingabe in eine aufgerufene Textdatei defin.

Gif oder es ist nicht passiert :

Bildbeschreibung hier eingeben

Oder versuchen Sie es online! ( Danke an Dennis für das Setup! )

Erläuterung

Wenn ein MATL-Programm ausgeführt wird und eine aufgerufene Datei defingefunden wird (der Name bezieht sich auf "Standardeingabe"), wird der Inhalt automatisch als Text geladen und als Zeichenfolge in den Stapel geschrieben, bevor der Code ausgeführt wird.

Die Funktion Uwertet den String aus, um ihn in einen Spaltenvektor aus Zahlen zu konvertieren, und sberechnet die implizit angezeigte Summe.

Luis Mendo
quelle
13

Japt , 2 Bytes

Nx

Erläuterung

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

Probieren Sie es online!

ETHproductions
quelle
12

Einfügen + Bc, 13 Bytes

paste -sd+|bc

Erläuterung:

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

Noch eine Shell-Antwort!

Okx
quelle
1
Sehr ordentlich und ordentlich.
Oh, ich hatte paste -s -d+|bcund wusste nicht, dass ich die Schalter konsolidieren konnte. Ordentlich!
David Conrad
12

Perl 6 , 13 Bytes

say sum lines

Versuch es

Erläuterung

  • lines()Gibt eine Liste von Zeilen $*INoder $*ARGFILESein "magisches" Befehlszeilen-Eingabehandle zurück.
  • sum(…)wurde 6 bis Perl hinzugefügt , damit [+] Listfür Positionals optimiert werden , die wie ihre Summe ohne alle ihre Werte zu erzeugen berechnen kann 1..100000
    (ich dachte nur sumeinfach zu nett hier war Gebrauch , [+]wie ich normalerweise tun würde)
  • say(…)Rufen Sie die .gistMethode für ihre Eingabe auf und drucken Sie sie mit einer zusätzlichen Newline.
Brad Gilbert b2gills
quelle
Was ist Perl 5?
14
das liest sich wie lolcode
Bryan Boettcher
@Lembik ist eindeutig als Perl 6 gekennzeichnet , eine Schwestersprache von Perl 5 .
Brad Gilbert b2gills
Es gab einen Tippfehler. Ich meinte, was ist das in Perl 5?
1
Gut $a+=$_ for <>;print $afunktioniert in Perl 5, aber es kann einen kürzeren Weg geben.
Brad Gilbert b2gills
10

C 53 Bytes

r;main(i){for(;~scanf("%d",&i);r+=i);printf("%d",r);}
orlp
quelle
C zeigt seine Anmeldeinformationen wieder :)
2
Ich denke, es sollte einen kürzeren Weg geben, aber ich sehe es nicht :)
Digitales Trauma
9

Python 3 , 28 Bytes

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

Aus diesem Tipp entnommen . Mir wurde gesagt, dass dies unter Windows nicht funktioniert.

Probieren Sie es online!

Dennis
quelle
4
Ich habe etwas Neues gelernt!
9

Retina , 11 7 Bytes

-4 Danke an Martin Ender

.*
$*
1

Probieren Sie es online!


In Unary konvertieren:

.*
$*

Zähle die Anzahl der 1s:

1
Riley
quelle
1
Interessant, wie Retina als Regex-basierte Sprache die Summe in weniger Bytes als die kürzeste Bash-Antwort liefert, die bisher veröffentlicht wurde. +1
seshoumara
Ist das Lesen von Standard in?
2
@Lembik Ja, das ist es.
Riley
Wenn die Eingabe in unary erlaubt wäre, wäre es nur ein Byte.
mbomb007
@ mbomb007 Ich habe das schon in sed ausprobiert.
Riley
8

Brain-Flak , 20 Bytes

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

Probieren Sie es online!

Erläuterung

Dies ist ein Golf aus einer Lösung von Riley im Chat . Seine Lösung war:

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

Wenn Sie mit Brain-Flak vertraut sind, ist dies ziemlich selbsterklärend. Die Stapelhöhe wird verschoben und beim Herunterzählen wird ein Wert eingefügt. Am Ende wird die Summe aller Läufe verschoben.

Es ist ein ziemlich guter Golf, aber er setzt beide Nullen {}und ([])diese Werte unterscheiden sich nur um eins. Wenn wir stattdessen die Masken entfernen und eines der beiden Negative machen, sollten sie sich fast aufheben.

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

Da sie sich immer um eins unterscheiden, haben wir den unglücklichen Umstand, dass unsere Antwort immer von der Stapelhöhe abweicht. Um dem abzuhelfen, verschieben wir einfach den Beginn des Schiebevorgangs, um die erste Stapelhöhe zu erfassen.

(([]){[{}]{}([])}{})
Weizen-Assistent
quelle
1
Ich dachte daran, dass der negative Pop die vorherige Höhe annulliert (von vor der Schleife oder dem Ende der vorherigen Zeit), und die letzte Höhe ist 0, so dass sie ignoriert werden kann.
Riley
8

Python 2, 40 Bytes

import sys;print sum(map(int,sys.stdin))
orlp
quelle
7

R, 11 Bytes

sum(scan())

scanNimmt die Eingabe, eine Nummer pro Zeile. Und sumnaja, Summen.

Frédéric
quelle
7

Perl 5 , 9 Bytes

8 Byte Code + -pFlag.

$\+=$_}{

Probieren Sie es online!

Mit -pwird der Eingang zeilenweise gelesen und jeweils gespeichert $_. Wir verwenden es $\als Akkumulator, weil es dank der -pFlagge implizit am Ende gedruckt wird. Die nicht übereinstimmenden }{werden verwendet, so dass das -pFlag nur $\einmal am Ende gedruckt wird, anstatt zu drucken, $_und $\an jeder Zeile wird es so gelesen, wie es normalerweise der Fall ist.

Dada
quelle
Ich kann es nicht einmal analysieren! :) Erklärung bitte.
@Lembik Hier gehts.
Dada
Der unübertroffene Klammerteil ist sehr dunkel!
@ Lembik Das sind keine Klammern ... Sie sind entweder Französisch oder geschweifte Klammern hängt davon ab, wen Sie fragen, aber sie sind definitiv nicht)(
CraigR8806
1
@Lembik accoladesanscheinend.
Michael Vehrs
7

Pure Bash, 37 36 Bytes

Danke an @KevinCruijssen für ein Byte!

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

Probieren Sie es online!

betseg
quelle
3
Sehr schön und sauber
Ich programmiere nie in Bash , aber ist es nicht möglich, das Leerzeichen dazwischen zu entfernen do ((? Das TIO scheint zu funktionieren.
Kevin Cruijssen
@ KevinCruijssen Ja, es scheint, als ob es funktioniert. Ich verwende zsh als meine tägliche Shell und es funktioniert nicht in zsh ohne Leerzeichen. Ich habe nur angenommen, dass es in Bash nicht funktioniert, aber anscheinend funktioniert es.
betseg
6

Haskell, 32 Bytes

interact$show.sum.map read.lines

Probieren Sie es online! .

interactsammelt die gesamte Eingabe von stdin, übergibt sie an die als Argument angegebene Funktion und gibt die Zeichenfolge aus, die sie von dieser Funktion zurückerhält. Die Funktion ist:

            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
quelle
1
Das macht mich wirklich wie Haskell. In Scala muss ich tun, lines.map(_.toInt) weil sum eine Art implizite numerische Konvertierung von String oder in diesem Fall eine explizite erwartet.
Stefan Aleksić
6

PHP, 22 Bytes

<?=array_sum(file(t));

Dies setzt voraus, dass es eine Datei mit dem Namen "t" mit einer Liste von ganzen Zahlen gibt.

file()öffnet eine Datei und gibt ein Array zurück, wobei jede Zeile ein separates Element im Array enthält. array_sum()summiert alle Elemente in einem Array.

Kodos Johnson
quelle
5

Awk, 19 Bytes

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

Erläuterung:

{s+=$1}                For all lines in the input, add to s
        END             End loop
           {print s}    Print s
Okx
quelle
1
"Erklärung
folgt in
2
In der Sprache von awk ist Ihre Antwort tatsächlich nur 19 Bytes: {s+=$1}END{print s}:)
Digital Trauma
5

Gleichstrom , 14 Bytes

0[+?z2=a]dsaxp

Probieren Sie es online!

Erläuterung:

 [      ] 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
quelle
4

CJam , 5 Bytes

q~]1b

Probieren Sie es online!

Wie es funktioniert

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
quelle
Wie 1bsummiert man Zahlen?
Esolanging Fruit
CJam erfordert keine kanonische Darstellung für die Umwandlung von Ziffern in Ganzzahlen. [<x> <y> <z> <w>]<b>bberechnet einfach b³x + b²y + bz + w . Wenn b = 1 ist , ergibt dies x + y + z + w .
Dennis
4

Python, 38 30 Bytes

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

In Python werden Dateien open('filename')(offensichtlich) von geöffnet . Sie sind jedoch iterables. Jedes Mal, wenn Sie die Datei durchlaufen, wird die nächste Zeile angezeigt. Also iteriert Map über jede Liste, ruft sie intauf und summiert dann die resultierende Liste.

Rufen Sie mit dem Dateinamen als Eingabe auf. (dhf('numbers.txt') )

8 Bytes gespart durch Verwendung map(int, open(n))eines Listenverständnisses. Originalcode:

lambda n:sum([int(i)for i in open(n)]) 
Rɪᴋᴇʀ
quelle
1
Ich glaube, dass Sie dies auch mit der Standardeingabe tun können, indem Sie 'open (0)' aufrufen. Ich bin mir nicht sicher, ob dies zur Verkürzung Ihrer Antwort verwendet werden kann.
Cole
@Cole dennis hat diese Lösung bereits, also lasse ich meine Antwort so.
24.
Mein Fehler, tut mir leid; Ich habe es nicht vollständig durchgelesen, bevor ich zu Ihrer Antwort gekommen bin.
Cole
@Cole es ist okay, es macht mir nichts aus.
24.
4

Mathematica, 19 Bytes

Übernimmt die Notebook-Umgebung von Mathematica.

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

Erwartet, dass sich die Eingabe in einer Datei befindet a.

Martin Ender
quelle
Es ist eine verrückte Sprache :)
4
@Lembik normale Leute würden dies sehr leserlich als Total @ Flatten @ Import @ "a"oder sogar schreiben "a" // Import // Flatten // Total. ;)
Martin Ender
Wäre das nicht Tr[#&@@@Import@#]&auch erlaubt?
Genisis
4

Gelee , 9 8 Bytes

ƈFпFỴVS

STDIN ist nicht wirklich Jellys Sache ...

Probieren Sie es online!

Wie es funktioniert

ƈ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
quelle
1
Die zweite Fkönnte aus Gründen der Klarheit auch eine sein.
Erik der Outgolfer
4

Pure Bash, 30

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

Probieren Sie es online aus.

  • reads die Eingabedatei auf einmal in die Variable b. -d_sagt, readdass der Zeilenbegrenzer _statt istnewline
  • ${b//'newline'/+}ersetzt die Zeilenumbrüche bdurch+
  • echo $[ ... ] wertet den resultierenden Ausdruck arithmetisch aus und gibt ihn aus.
Digitales Trauma
quelle
+1 Sehr schön. Wird auch die abschließende Zeile einer Eingabedatei gelesen? Ich frage, denn wenn es durch "+" ersetzt wird, wird der $[]Abschnitt aufgrund eines nachgestellten "+" fehlerhaft.
Seshoumara
@seshoumara Anscheinend werden readabschließende Zeilenumbrüche verworfen, obwohl der Zeilenbegrenzer auf überschrieben ist _. Dies ist vielleicht eine Einschränkung von read, aber es funktioniert gut für diese Situation.
Digital Trauma
Ich freue mich immer über eine reine Bash-Lösung.
3

Vim, 16 Bytes / Tastenanschläge

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

Da V abwärtskompatibel ist, können Sie es online ausprobieren!

DJMcMayhem
quelle
Liest das entweder von Standard in oder von einer Datei?
Ja, Vim ist möglicherweise nicht erlaubt ... :(
CalculatorFeline
3

jq , 5 Bytes

add, sowie das Kommandozeilen-Flag -s.

Beispielsweise:

% echo "1\n2\n3\n4\n5" | jq -s add
15
Lynn
quelle
6 Bytes . Da -saddnicht funktioniert, zähle den Raum.
agc
@agc Korrigiere mich, wenn ich falsch liege, aber der Code selbst ist add(3 Bytes) und du musst 2 Bytes für das Flag hinzufügen-s . Das Leerzeichen zählt nicht als Code oder Flag: Es ist das von der Sprache verwendete Befehlszeilentrennzeichen.
Caird Coinheringaahing
1
@ThisGuy, Well the -sflag ist die Abkürzung für " --slurp " (liest den gesamten Eingabestream in ein großes Array und führt den Filter nur einmal aus), wodurch sich sowohl die jqInterpretation der Eingabedaten als auch die Ausführung des Codes ändern . Es ist nicht wie das, -ein seddem nur gesagt wird, seddass der nachfolgende String Code ist. Das -sist mehr wie ein Teil der jqSprache selbst, und daher wäre dieser 6. Byte-Raum auch.
agc
3

Eigentlich 2 Bytes

Probieren Sie es online!

Erläuterung:

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
quelle
3

dc, 22

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

Dies scheint etwas länger zu dauern, aber es ist schwierig zu entscheiden, wann das Ende der Datei erreicht ist. Die einzige Möglichkeit, die ich mir vorstellen kann, besteht darin, die Stack-Länge nach dem ?Befehl zu überprüfen .

Probieren Sie es online aus .

[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

Beachten Sie, dass das Makro mrekursiv aufgerufen wird. Modern dcimplementiert die Schwanzrekursion für diese Art von Dingen, daher sollte es keine Sorgen geben, dass der Stapel überfüllt wird.

Digitales Trauma
quelle
Willkommen bei PPCG! Bitte beachte, dass wenn es nicht genug Erklärungen gibt, diese den Filter für Beiträge mit geringer Qualität durchlaufen .
Matthew Roh
@SIGSEGV keine Begrüßung nötig - ich bin schon eine Weile hier ;-). Ja, ich habe meine Erklärung geschrieben, während Sie kommentiert haben. Siehe Bearbeiten.
Digital Trauma
1
Ich schulde Ihnen ein Byte für den Trick, das Makro vor dem Speichern zu duplizieren.
Brian McCutchon