Somma i numeri sullo standard in


32

Prendi in considerazione un flusso / file con un numero intero per riga. Per esempio:

123
5
99

Il tuo codice dovrebbe generare la somma di questi numeri, cioè 227.

Il formato di input è rigorosamente un numero intero per riga. Ad esempio, non si può supporre che l'input sia su una riga come un array di numeri interi.

Puoi prendere input da STDIN, sotto forma di un nome file, o un file con un nome a tua scelta; puoi scegliere quale. Non sono consentiti altri modi per ottenere input.

L'input conterrà almeno un numero intero. Puoi presumere che tutti i numeri interi siano non negativi e che la loro somma totale sia inferiore a .232


2
C'è una nuova riga finale? Quella newline è opzionale?
Per favore, smetti di essere malvagio il

9
Ciao! Ho votato in negativo questa sfida perché va contro gli standard della nostra comunità per formati di input / output accettabili con un formato di input restrittivo.
AdmBorkBork

1
@AdmBorkBork e ne abbiamo discusso a lungo nella chat room. Abbiamo deciso di non essere d'accordo :)

22
Come autore delle cose da evitare di ingombranti operazioni di I / O e di default arbitrariamente prioritari , voglio difendere questa sfida per questi motivi. Qui, l'input di elaborazione è la carne della sfida, non un lavoro extra che distrae dalla sfida principale. Non è "aggiungi numeri" con strani requisiti I / O, è "fai questo I / O" con l'aggiunta come passaggio. È necessario ignorare l'I / O standard affinché le risposte non scorciatoia attraverso l'attività principale.
xnor

2
Perché non è possibile utilizzare l'ingresso di funzione?
CalculatorFeline

Risposte:


15

05AB1E , 2 byte

|O

Spiegazione:

|   Get input as array
 O  Sum

Provalo online!


7
È ridicolo :)

Questo legge dallo standard in?

1
@Lembik lo fa.
Okx,

Credo che la tua risposta a 2 byte sia stata la prima. Sei il vincitore! (A meno che qualcuno non trovi una risposta da 1 byte.)

4
@Lembik O una risposta a 0 byte ....
Compagno SparklePony,

21

Bash + coreutils, 16 byte

xargs|tr \  +|bc

Provalo online!

Ci sono due spazi dopo il \. Questo funziona anche per numeri negativi.

Spiegazione:

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

Potresti chiederti perché tr \\n +|bcnon è meglio, poiché trasforma le nuove righe direttamente in "+". Bene, questo ha 2 errori imprevisti:

  • se l'input ha una nuova riga finale, viene convertito in un '+' finale, quindi non c'è nessun numero dopo di esso per eseguire l'aggiunta
  • e il problema più strano è che bc richiede una nuova riga finale dopo l'input, ma hai appena sostituito tutte le nuove righe di input con '+'.

1
Mi piace questo. È carino e intelligente.

Potresti usare tr \\ n + Invece senza xargs?

1
@Lembik Intendi tr \\n +|bc? In tal caso, consulta la spiegazione aggiornata. Buona domanda.
seshoumara,

paste -s -d+|bcè di 15 byte
David Conrad,

1
@Lembik Non ha considerato questo caso, ma per fortuna la sceneggiatura funziona ancora. xargs|tr \ +in questo caso non fa nulla e bc riceve il numero e lo stampa di nuovo.
seshoumara,

14

MATL , 2 byte

Us

Ciò prevede l'input in un file di testo chiamato defin.

GIF o non è successo :

inserisci qui la descrizione dell'immagine

Oppure provalo online! ( grazie a Dennis per l'allestimento! )

Spiegazione

Quando viene eseguito un programma MATL, se definviene trovato un file chiamato (il nome si riferisce a "input predefinito"), il suo contenuto viene automaticamente caricato come testo e inserito nello stack come stringa prima di eseguire il codice.

La funzione Uvaluta la stringa per convertirla in un vettore di numeri di colonna e scalcola la somma, che viene implicitamente visualizzata.


13

Japt , 2 byte

Nx

Spiegazione

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

Provalo online!


12

Incolla + bc, 13 byte

paste -sd+|bc

Spiegazione:

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

Un'altra risposta da shell!


1
Molto pulito e ordinato.

Ooh, avevo paste -s -d+|bce non mi rendevo conto di poter consolidare gli interruttori. ! Neat
David Conrad,

12

Perl 6 , 13 byte

say sum lines

Provalo

Spiegazione

  • lines()restituisce un elenco di righe da $*INo $*ARGFILESun handle di input della riga di comando "magico".
  • sum(…)è stato aggiunto a Perl 6 per consentire [+] Listdi essere ottimizzato per i posizionali che possono calcolare la loro somma senza generare tutti i loro valori come 1..100000
    (pensavo che sumfosse troppo carino qui per usarlo [+]come farei normalmente)
  • say(…)chiama il .gistmetodo sul suo input e lo stampa con una nuova riga aggiuntiva.

Che cos'è perl 5?

15
questo sembra lolcode
Bryan Boettcher il

@Lembik è chiaramente etichettato come Perl 6 , che è una lingua sorella di Perl 5 .
Brad Gilbert b2gills

C'è stato un errore di battitura. Intendevo cosa c'è in Perl 5?

1
$a+=$_ for <>;print $aFunziona bene in Perl 5, ma potrebbe esserci un modo più breve.
Brad Gilbert b2gills

10

C, 53 byte

r;main(i){for(;~scanf("%d",&i);r+=i);printf("%d",r);}

C mostrando di nuovo le sue credenziali :)

2
Sento che dovrebbe esserci un modo più breve, ma non lo vedo :)
Digital Trauma


9

Retina , 11 7 byte

-4 grazie a Martin Ender

.*
$*
1

Provalo online!


Converti in unario:

.*
$*

Conta il numero di 1s:

1

1
Interessante come Retina, come linguaggio basato su regex, può fare la somma in meno byte rispetto alla risposta bash più breve pubblicata finora. +1
seshoumara,

Questa lettura è dallo standard in?

2
@Lembik Sì, lo è.
Riley,

Se fosse consentito l'input in unario, sarebbe solo un byte.
mbomb007,

@ mbomb007 L'ho già provato su sed.
Riley,

8

Brain-Flak , 20 byte

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

Provalo online!

Spiegazione

Questo è il golf di una soluzione fatta da Riley in chat . La sua soluzione era:

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

Se hai familiarità con Brain-Flak questo è abbastanza autoesplicativo. Spinge l'altezza dello stack e apre un valore mentre conta alla rovescia, alla fine spinge la somma di tutte le corse.

È un golf abbastanza buono ma ha entrambi zeri {}e ([])comunque questi avranno valori che differiscono solo per uno, quindi se invece rimuoviamo le maschere e rendiamo uno dei due negativi, dovrebbero quasi annullarsi.

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

Dato che differiscono sempre per uno, abbiamo la sfortunata circostanza in cui la nostra risposta è sempre fuori dall'altezza della pila. Per ovviare a questo, spostiamo semplicemente l'inizio della spinta per includere l'altezza del primo stack.

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

1
Ci ho pensato mentre il pop negativo annullava l'altezza precedente spinta (da prima del loop o la fine del tempo precedente) e l'ultima altezza è 0, quindi può essere ignorata.
Riley,

8

Python 2, 40 byte

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

7

R, 11 byte

sum(scan())

scanaccetta l'input, un numero per riga. E sum, beh, somme.


7

Perl 5 , 9 byte

8 byte di codice + -pflag.

$\+=$_}{

Provalo online!

Con -p, l'ingresso viene letto una riga alla volta, memorizzato in $_ogni volta. Usiamo $\come accumulatore, perché grazie alla -pbandiera, è implicitamente stampato alla fine. Gli ineguagliati }{vengono utilizzati in modo che la -pbandiera venga $\stampata una sola volta alla fine invece di essere stampata $_e $\su ogni riga si legge normalmente.


Non riesco nemmeno ad analizzarlo! :) Spiegazione per favore.

@Lembik Ecco qua.
Dada,

La parte in parentesi senza pari è molto oscura!

@Lembik Quelle non sono tra parentesi ... Sono o parentesi graffe francesi o ricci dipende da chi chiedi, ma sicuramente non lo sono)(
CraigR8806

1
@Lembik accolades, a quanto pare.
Michael Vehrs,

7

Pure Bash, 37 36 byte

Grazie a @KevinCruijssen per un byte!

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

Provalo online!


3
Molto bello e pulito.

Non programma mai in Bash , ma non è possibile rimuovere lo spazio tra do ((? Il TIO sembra funzionare.
Kevin Cruijssen,

@KevinCruijssen Sì, sembra che funzioni. Uso zsh come shell quotidiana e non funziona in zsh senza uno spazio, ho solo pensato che non avrebbe funzionato in Bash ma a quanto pare funziona.
Betseg,

6

Haskell, 32 byte

interact$show.sum.map read.lines

Provalo online! .

interactraccoglie l'intero input dallo stdin, lo passa alla funzione fornita come argomento e stampa la stringa che ottiene da questa funzione. La funzione è:

            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
Questo mi rende davvero Haskell. In Scala, devo farlo lines.map(_.toInt) perché sum si aspetta una sorta di conversione numerica implicita da String o in questo caso esplicita.
Stefan Aleksić,

6

PHP, 22 byte

<?=array_sum(file(t));

Ciò presuppone l'esistenza di un file denominato "t" con un elenco di numeri interi.

file()apre un file e restituisce un array con ogni riga memorizzata un elemento separato nell'array. array_sum()somma tutti gli elementi in un array.


5

Awk, 19 byte

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

Spiegazione:

{s+=$1}                For all lines in the input, add to s
        END             End loop
           {print s}    Print s

1
"Explanation coming soon ™" Sarebbe il mio nuovo slogan se non fosse un marchio ...
ETHproductions

2
Nella lingua di awk, la tua risposta è in realtà solo 19 byte: {s+=$1}END{print s}:)
Digital Trauma

5

dc , 14 byte

0[+?z2=a]dsaxp

Provalo online!

Spiegazione:

 [      ] 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 byte

q~]1b

Provalo online!

Come funziona

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.

Come fa la 1bsomma dei numeri?
Esolanging Fruit,

CJam non richiede una rappresentazione canonica per la conversione da cifre in numeri interi; [<x> <y> <z> <w>]<b>bcalcola semplicemente b³x + b²y + bz + w . Quando b = 1 , questo dà x + y + z + w .
Dennis,

4

Python, 38 30 byte

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

In Python, i file vengono aperti da open('filename')(ovviamente). Sono, tuttavia, iterabili. Ogni volta che si scorre il file, si ottiene la riga successiva. Quindi la mappa scorre su ogni elenco, chiamandolo inte quindi somma l'elenco risultante.

Chiama con il nome file come input. (ie f('numbers.txt'))

8 byte salvati utilizzando map(int, open(n))anziché una comprensione dell'elenco. Codice originale:

lambda n:sum([int(i)for i in open(n)]) 

1
Credo che puoi farlo anche con input standard chiamando 'open (0)'. Non sono sicuro che possa essere usato per abbreviare la tua risposta.
Cole

@Cole dennis ha già quella soluzione, quindi lascerò la mia risposta in questo modo.
Rɪᴋᴇʀ

Il mio errore, mi dispiace per quello; Non ho letto fino in fondo prima di arrivare alla tua risposta.
Cole

@Cole va bene, non mi dispiace.
Rɪᴋᴇʀ

4

Mathematica, 19 byte

Presuppone l'ambiente notebook di Mathematica.

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

Si aspetta che l'input sia in un file a.


È un linguaggio folle :)

4
Le persone normali di @Lembik lo scriverebbero molto facilmente Total @ Flatten @ Import @ "a"o addirittura "a" // Import // Flatten // Total. ;)
Martin Ender,

Non sarebbe Tr[#&@@@Import@#]&anche permesso?
ngenisi,

4

Gelatina , 9 8 byte

ƈFпFỴVS

STDIN non è davvero una cosa di Jelly ...

Provalo online!

Come funziona

ƈ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
Il secondo Fpotrebbe essere anche un , per chiarezza.
Erik the Outgolfer,


4

Bash puro, 30

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

Provalo online.

  • reads il file di input in una volta entra nella variabile b. -d_indica readche il delimitatore di riga è _invece dinewline
  • ${b//'newline'/+}sostituisce le nuove righe bcon+
  • echo $[ ... ] valuta aritmeticamente l'espressione risultante e la genera.

+1 Molto bello. Viene letta anche la nuova riga finale di un file di input? Chiedo perché se viene sostituito da '+', la $[]sezione si guasterà a causa di un '+' finale.
seshoumara,

@seshoumara Sembra che readscarti le nuove righe finali finali, anche se il delimitatore di riga viene ignorato _. Questo è forse un avvertimento read, ma funziona bene per questa situazione.
Trauma digitale

Sono sempre felice di vedere una soluzione bash pura.



3

jq , 5 byte

add, oltre al flag della riga di comando -s.

Per esempio:

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

6 byte . Dal momento -saddche non funzionerà, conta lo spazio.
agc,

@agc Correggimi se sbaglio ma il codice stesso è add(3 byte) e devi aggiungere 2 byte per il -sflag. Lo spazio non conta come il codice o il flag: è il separatore della riga di comando utilizzato dalla lingua.
caird coinheringaahing

1
@ThisGuy, Beh, il -sflag è l'abbreviazione di " --slurp ", (leggi l'intero flusso di input in un array di grandi dimensioni ed esegui il filtro solo una volta), che cambia sia il modo in cui jqinterpreta i dati di input, sia il modo in cui esegue il codice. Non è come il -ein sedcui dice semplicemente sedche la stringa successiva è il codice. Il -sè più simile a una parte del jqlinguaggio stesso, e quindi che lo spazio di byte 6 sarebbe troppo.
agc

3

In realtà , 2 byte

Provalo online!

Spiegazione:

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

Questo sembra piuttosto più lungo di quanto dovrebbe essere, ma è difficile decidere quando viene raggiunta la fine del file. L'unico modo in cui mi viene in mente di farlo è controllare la lunghezza dello stack dopo il ?comando.

Provalo 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

Nota la macro msi chiama ricorsivamente. Il moderno dcimplementa la ricorsione della coda per questo genere di cose, quindi non dovresti preoccuparti di traboccare lo stack.


Benvenuti in PPCG! Nota che se non ci sono abbastanza spiegazioni passerà attraverso il filtro dei post di bassa qualità .
Matthew Roh,

@SIGSEGV nessun benvenuto necessario - Sono qui da un po ';-). Sì, stavo scrivendo la mia spiegazione mentre commentavi. Vedi modifica.
Trauma digitale

1
Ti devo un byte per il trucco di duplicare la macro prima di memorizzarla.
Brian McCutchon,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.