Jumlahkan angka pada standar dalam

32

Pertimbangkan aliran / file dengan satu bilangan bulat per baris. Sebagai contoh:

123
5
99

Kode Anda harus menampilkan jumlah angka-angka ini, yaitu 227.

Format input hanya satu integer per baris. Anda tidak dapat, misalnya, menganggap input berada pada satu baris sebagai array bilangan bulat.

Anda dapat mengambil input dari STDIN, dalam bentuk nama file, atau file dengan nama pilihan Anda; Anda bisa memilih yang mana. Tidak ada cara lain untuk mendapatkan input yang diizinkan.

Input akan mengandung setidaknya satu bilangan bulat. Anda dapat menganggap semua bilangan bulat adalah non-negatif dan jumlah totalnya kurang dari .232

Dennis
sumber
2
Apakah ada baris baru yang tertinggal? Apakah itu baris baru opsional?
Tolong berhenti menjadi jahat
9
Hai! Saya menurunkan tantangan ini karena bertentangan dengan standar komunitas kami untuk format input / output yang dapat diterima dengan memiliki format input yang terbatas.
AdmBorkBork
1
@ AdmBorkBork dan saya mendiskusikan ini secara panjang lebar di ruang obrolan. Kami telah sepakat untuk tidak setuju :)
22
Sebagai penulis hal-hal yang harus dihindari dari I / O yang rumit dan mengabaikan default secara sewenang - wenang , saya ingin mempertahankan tantangan ini dengan alasan itu. Di sini, input pemrosesan adalah daging tantangan, bukan pekerjaan tambahan yang mengalihkan perhatian dari tantangan utama. Ini bukan "menambah angka" dengan persyaratan I / O yang aneh, ini "lakukan ini I / O" dengan menambahkan sebagai langkah. Mengesampingkan standar I / O diperlukan untuk jawaban agar tidak melewati jalan pintas di tugas utama.
xnor
2
Mengapa input fungsi tidak dapat digunakan?
CalculatorFeline

Jawaban:

15

05AB1E , 2 byte

|O

Penjelasan:

|   Get input as array
 O  Sum

Cobalah online!

Okx
sumber
7
Itu konyol :)
Apakah ini dibaca dari standar?
1
@Lembik ya.
Okx
Saya yakin jawaban 2 byte Anda adalah yang pertama. Anda adalah pemenangnya! (Kecuali jika seseorang menemukan jawaban 1 byte.)
4
@ Lembik Atau jawaban 0 byte ....
Kamerad SparklePony
21

Bash + coreutils, 16 byte

xargs|tr \  +|bc

Cobalah online!

Ada dua ruang setelah \. Ini juga berfungsi untuk angka negatif.

Penjelasan:

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

Anda mungkin bertanya-tanya mengapa tr \\n +|bc tidak lebih baik, karena langsung mengubah baris baru menjadi '+. Ya, itu memiliki 2 kesalahan tak terduga:

  • jika input memiliki trailing newline, maka ia dikonversi ke trailing '+', maka tidak ada angka setelahnya untuk melakukan penambahan
  • dan masalah yang paling aneh adalah bahwa bc membutuhkan baris baru setelah input, tetapi Anda baru saja mengganti semua baris baru input dengan '+'.
seshoumara
sumber
1
Saya suka ini. Bagus dan pintar.
Bisakah Anda menggunakan tr \\ n + Sebaliknya tanpa xargs?
1
@Lembik Maksud Anda tr \\n +|bc? Jika demikian, silakan lihat penjelasan yang diperbarui. Pertanyaan bagus.
seshoumara
paste -s -d+|bcadalah 15 byte
David Conrad
1
@Lembik Tidak mempertimbangkan hal itu, tapi untungnya skripnya masih berfungsi. xargs|tr \ +dalam hal ini tidak melakukan apa-apa, dan bc menerima nomor dan mencetaknya kembali.
seshoumara
14

MATL , 2 byte

Us

Ini mengharapkan input dalam file teks bernama defin.

Gif atau tidak terjadi :

masukkan deskripsi gambar di sini

Atau coba online! ( terima kasih kepada Dennis untuk pengaturannya! )

Penjelasan

Ketika program MATL dijalankan, jika file yang dipanggil definditemukan (namanya mengacu pada "input default"), isinya secara otomatis dimuat sebagai teks dan didorong ke tumpukan sebagai string sebelum menjalankan kode.

Fungsi Umengevaluasi string untuk mengubahnya menjadi vektor kolom angka, dan smenghitung jumlahnya, yang secara implisit ditampilkan.

Luis Mendo
sumber
13

Japt , 2 byte

Nx

Penjelasan

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

Cobalah online!

Produksi ETH
sumber
12

Tempel + bc, 13 byte

paste -sd+|bc

Penjelasan:

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

Jawaban shell lain!

Okx
sumber
1
Sangat rapi dan rapi.
Ooh, saya telah paste -s -d+|bcdan tidak menyadari bahwa saya dapat mengkonsolidasikan sakelar. Rapi!
David Conrad
12

Perl 6 , 13 byte

say sum lines

Cobalah

Penjelasan

  • lines()mengembalikan daftar garis dari $*INatau $*ARGFILESpegangan input baris perintah "ajaib".
  • sum(…)telah ditambahkan ke Perl 6 untuk memungkinkan [+] Listdioptimalkan untuk Posisi yang dapat menghitung jumlah mereka tanpa menghasilkan semua nilai mereka seperti 1..100000
    (saya hanya berpikir sumterlalu lucu di sini untuk digunakan[+] seperti biasanya)
  • say(…)panggil .gistmetode pada inputnya, dan cetak dengan baris baru tambahan.
Brad Gilbert b2gills
sumber
Apa perl 5?
15
ini berbunyi seperti lolcode
Bryan Boettcher
@Lembik itu jelas diberi label sebagai Perl 6 , yang merupakan bahasa saudara untuk Perl 5 .
Brad Gilbert b2gills
Ada kesalahan ketik. Maksud saya apa yang ada di Perl 5?
1
$a+=$_ for <>;print $aBekerja dengan baik di Perl 5, tetapi mungkin ada cara yang lebih pendek.
Brad Gilbert b2gills
10

C, 53 byte

r;main(i){for(;~scanf("%d",&i);r+=i);printf("%d",r);}
orlp
sumber
C menunjukkan kredensial lagi :)
2
Saya merasa harus ada cara yang lebih pendek, tetapi saya tidak melihatnya :)
Digital Trauma
10

Python 3 , 28 byte

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

Diambil dari tip ini . Saya telah diberitahu ini tidak akan berfungsi pada Windows.

Cobalah online!

Dennis
sumber
5
Saya belajar sesuatu yang baru!
9

Retina , 11 7 byte

-4 Terima kasih kepada Martin Ender

.*
$*
1

Cobalah online!


Konversikan ke unary:

.*
$*

Hitung jumlah 1s:

1
Riley
sumber
1
Menarik bagaimana Retina, sebagai bahasa berbasis regex, dapat melakukan penjumlahan dalam byte lebih sedikit daripada jawaban bash terpendek yang diposting sejauh ini. +1
seshoumara
Apakah ini membaca dari standar?
2
@Lembik Ya itu.
Riley
Jika input unary diizinkan, itu hanya satu byte.
mbomb007
@ mbomb007 Saya sudah mencobanya di sed.
Riley
8

Brain-Flak , 20 byte

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

Cobalah online!

Penjelasan

Ini adalah golf dari solusi yang dibuat oleh Riley dalam obrolan . Solusinya adalah:

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

Jika Anda terbiasa dengan Brain-Flak ini cukup jelas. Itu mendorong ketinggian tumpukan dan muncul satu nilai saat menghitung mundur, pada akhirnya mendorong jumlah semua berjalan.

Ini adalah golf yang cukup bagus tetapi dia nol keduanya {}dan ([])namun ini akan memiliki nilai yang hanya berbeda satu jadi jika kita menghapus topeng dan membuat salah satu dari dua negatif mereka harus hampir dibatalkan.

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

Karena mereka selalu berbeda satu sama lain, kami memiliki keadaan yang tidak menguntungkan di mana jawaban kami selalu tidak sesuai dengan ketinggian tumpukan. Untuk memperbaiki ini, kami hanya memindahkan awal dari push untuk mencakup ketinggian tumpukan pertama.

(([]){[{}]{}([])}{})
Wisaya Gandum
sumber
1
Saya menganggapnya sebagai pop negatif membatalkan ketinggian sebelumnya didorong (dari sebelum loop, atau akhir waktu sebelumnya), dan ketinggian terakhir adalah 0 sehingga dapat diabaikan.
Riley
8

Python 2, 40 byte

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

R, 11 byte

sum(scan())

scanmengambil input, satu nomor per baris. Dan sum, baiklah, jumlah.

Frédéric
sumber
7

Perl 5 , 9 byte

8 byte kode + -pbendera.

$\+=$_}{

Cobalah online!

Dengan -p, input dibaca satu baris pada satu waktu, disimpan di $_setiap waktu. Kami menggunakan $\sebagai akumulator, karena berkat -pflag, itu dicetak secara implisit pada akhirnya. Yang tak tertandingi }{digunakan sehingga -pflag hanya mencetak $\sekali di akhir alih-alih mencetak $_dan $\pada setiap baris berbunyi seperti biasanya.

Dada
sumber
Aku bahkan tidak bisa menguraikannya! :) Mohon penjelasannya.
@Lembik Ini dia.
Dada
Bagian tanda kurung yang tidak cocok sangat tidak jelas!
@Lembik Itu bukan tanda kurung ... Mereka baik Perancis atau Curly Braces tergantung pada siapa Anda bertanya, tetapi mereka pasti tidak)(
CraigR8806
1
@Lembik accolades, rupanya.
Michael Vehrs
7

Pure Bash, 37 36 byte

Terima kasih kepada @KevinCruijssen untuk satu byte!

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

Cobalah online!

betseg
sumber
3
Sangat bagus dan bersih.
Saya tidak pernah memprogram di Bash , tetapi tidak mungkinkah untuk menghapus ruang antara do ((? The TIO tampaknya bekerja.
Kevin Cruijssen
@KevinCruijssen Ya, sepertinya itu berfungsi. Saya menggunakan zsh sebagai shell harian saya dan itu tidak berfungsi di zsh tanpa spasi, saya hanya berasumsi itu tidak akan berfungsi di Bash tetapi ternyata itu berfungsi.
betseg
6

Haskell, 32 byte

interact$show.sum.map read.lines

Cobalah online!.

interactmengumpulkan seluruh input dari stdin, meneruskannya ke fungsi yang diberikan sebagai argumennya dan mencetak string yang didapatnya dari fungsi ini. Fungsinya adalah:

            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
sumber
1
Ini membuat saya sangat menyukai Haskell. Dalam Scala, saya harus melakukan lines.map(_.toInt) karena jumlah mengharapkan semacam konversi implisit numerik dari String atau dalam hal ini yang eksplisit.
Stefan Aleksić
6

PHP, 22 byte

<?=array_sum(file(t));

Ini mengasumsikan ada file bernama "t" dengan daftar bilangan bulat.

file()membuka file dan mengembalikan array dengan setiap baris menyimpan elemen terpisah dalam array. array_sum()menjumlahkan semua elemen dalam array.

Kodos Johnson
sumber
5

Awk, 19 byte

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

Penjelasan:

{s+=$1}                For all lines in the input, add to s
        END             End loop
           {print s}    Print s
Okx
sumber
1
"Penjelasan segera hadir ™" Itu akan menjadi slogan baru saya jika tidak bermerek dagang ...
ETHproduk
2
Dalam bahasa awk, jawaban Anda sebenarnya hanya 19 byte: {s+=$1}END{print s}:)
Digital Trauma
5

dc , 14 byte

0[+?z2=a]dsaxp

Cobalah online!

Penjelasan:

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

CJam , 5 byte

q~]1b

Cobalah online!

Bagaimana itu bekerja

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
sumber
Bagaimana cara 1bmenjumlahkan angka?
Buah Esolanging
CJam tidak memerlukan representasi kanonik untuk konversi digit-ke-integer; [<x> <y> <z> <w>]<b>bcukup menghitung b³x + b²y + bz + w . Ketika b = 1 , ini menghasilkan x + y + z + w .
Dennis
4

Python, 38 30 byte

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

Dengan python, file dibuka oleh open('filename')(jelas). Mereka, bagaimanapun, iterables. Setiap kali Anda mengulang-ulang file tersebut, Anda mendapatkan baris berikutnya. Jadi peta iterate atas setiap daftar, memanggilnya int, dan kemudian menjumlahkan daftar yang dihasilkan.

Panggil dengan nama file sebagai input. (yaitu f('numbers.txt'))

8 byte disimpan dengan menggunakan map(int, open(n))alih-alih pemahaman daftar. Kode asli:

lambda n:sum([int(i)for i in open(n)]) 
Rɪᴋᴇʀ
sumber
1
Saya percaya bahwa Anda juga dapat melakukan ini dengan input standar dengan memanggil 'open (0)'. Tidak yakin apakah itu dapat digunakan untuk mempersingkat jawaban Anda.
cole
@Cole dennis sudah memiliki solusi itu, jadi saya akan meninggalkan jawaban saya seperti ini.
R
Kesalahan saya, maaf soal itu; Saya tidak membaca sampai selesai sebelum datang ke jawaban Anda.
cole
@Cole tidak apa-apa, saya tidak keberatan.
Rɪᴋᴇʀ
4

Mathematica, 19 byte

Diasumsikan lingkungan notebook Mathematica.

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

Mengharapkan input berada dalam file a.

Martin Ender
sumber
Ini adalah bahasa yang gila :)
4
@Lembik orang normal akan menulis ini sangat mudah dibaca Total @ Flatten @ Import @ "a"atau bahkan "a" // Import // Flatten // Total. ;)
Martin Ender
Bukankah Tr[#&@@@Import@#]&juga diizinkan?
ngenisis
4

Jelly , 9 8 byte

ƈFпFỴVS

STDIN bukan benar-benar Jelly ...

Cobalah online!

Bagaimana itu bekerja

ƈ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
sumber
1
Yang kedua Fbisa menjadi juga, untuk kejelasan.
Erik the Outgolfer
4

Bash murni, 30

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

Cobalah online.

  • reads file input dalam satu masuk ke variabel b. -d_memberitahu readbahwa garis pembatas _bukannewline
  • ${b//'newline'/+}menggantikan baris baru bdengan+
  • echo $[ ... ] secara aritmatika mengevaluasi ekspresi yang dihasilkan dan mengeluarkannya.
Trauma Digital
sumber
+1 Sangat bagus. Apakah baris baru dari file input juga dibaca? Saya bertanya karena jika diganti dengan '+', $[]bagian itu akan error karena trailing '+'.
seshoumara
@seshoumara Tampaknya readmembuang baris akhir yang terakhir, meskipun pembatas baris ditimpa _. Ini mungkin peringatan read, tetapi berfungsi dengan baik untuk situasi ini.
Digital Trauma
Saya selalu senang melihat solusi bash murni.
3

Vim, 16 byte / penekanan tombol

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

Karena V kompatibel dari belakang, Anda dapat mencobanya secara online!

DJMcMayhem
sumber
Apakah ini membaca dari standar di atau dari file?
Ya, Vim mungkin tidak diizinkan ... :(
CalculatorFeline
3

jq , 5 byte

add, ditambah bendera baris perintah -s.

Sebagai contoh:

% echo "1\n2\n3\n4\n5" | jq -s add
15
Lynn
sumber
6 byte . Karena -saddtidak akan berfungsi, hitung ruangnya.
agc
@agc Perbaiki saya jika saya salah tetapi kodenya sendiri add(3 byte) dan Anda harus menambahkan 2 byte untuk -sflag. Spasi tidak dihitung sebagai kode atau bendera: pemisah baris perintah yang digunakan oleh bahasa.
caird coinheringaahing
1
@ ThisGuy, Ya, -sbenderanya adalah kependekan dari " --slurp ", (baca seluruh aliran input ke dalam array besar dan jalankan filter hanya sekali), yang mengubah baik bagaimana jqmenginterpretasikan data input, dan bagaimana menjalankan kode. Ini tidak seperti -edi sedmana hanya mengatakan sedbahwa string selanjutnya adalah kode. Ini -slebih seperti bagian dari jqbahasa itu sendiri, dan karena itu ruang byte ke-6 juga akan.
agc
3

Sebenarnya , 2 byte

Cobalah online!

Penjelasan:

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

dc, 22

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

Ini sepertinya lebih lama dari yang seharusnya, tetapi sulit untuk memutuskan kapan akhir file tercapai. Satu-satunya cara saya bisa memikirkan untuk melakukan ini adalah memeriksa panjang tumpukan setelah ?perintah.

Cobalah 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

Perhatikan makro mdisebut secara rekursif. Modern dcmenerapkan rekursi ekor untuk hal semacam ini, jadi seharusnya tidak ada kekhawatiran meluap tumpukan.

Trauma Digital
sumber
Selamat datang di PPCG! Harap dicatat bahwa jika tidak ada penjelasan yang cukup, maka akan melalui filter posting berkualitas rendah .
Matius Roh
@SIGSEGV tidak perlu disambut - Saya sudah di sini sebentar ;-). Yap, saya menulis penjelasan saya ketika Anda berkomentar. Lihat edit.
Digital Trauma
1
Saya berhutang bita untuk trik menduplikasi makro sebelum menyimpannya.
Brian McCutchon