Tổng các số trên tiêu chuẩn trong


32

Xem xét một luồng / tệp với một số nguyên trên mỗi dòng. Ví dụ:

123
5
99

Mã của bạn sẽ xuất tổng của các số này, đó là 227.

Định dạng đầu vào đúng là một số nguyên trên mỗi dòng. Ví dụ, bạn không thể giả sử đầu vào nằm trên một dòng dưới dạng một mảng các số nguyên.

Bạn có thể lấy đầu vào từ STDIN, dưới dạng tên tệp hoặc tệp có tên bạn chọn; bạn có thể chọn cái nào Không có cách nào khác để có được đầu vào được cho phép.

Đầu vào sẽ chứa ít nhất một số nguyên. Bạn có thể giả sử tất cả các số nguyên là không âm và tổng tổng của chúng nhỏ hơn .232


2
Có một dòng mới? Là dòng mới tùy chọn?
Làm ơn đừng trở nên xấu xa vào

9
Chào! Tôi đánh giá thấp thách thức này vì nó đi ngược lại các tiêu chuẩn cộng đồng của chúng tôi đối với các định dạng đầu vào / đầu ra chấp nhận được bằng cách có định dạng đầu vào hạn chế.
admBorkBork

1
@AdmBorkBork và tôi đã thảo luận về vấn đề này trong phòng chat. Chúng tôi đã đồng ý không đồng ý :)

22
Là tác giả của những điều cần tránh của I / O cồng kềnhtự ý ghi đè mặc định , tôi muốn bảo vệ thách thức này trên cơ sở đó. Ở đây, đầu vào xử lý là phần cốt lõi của thử thách, không phải là công việc phụ làm phân tâm khỏi thử thách chính. Đó không phải là "thêm số" với các yêu cầu I / O kỳ lạ, đó là "thực hiện I / O này" bằng cách thêm như một bước. Việc ghi đè I / O tiêu chuẩn là cần thiết để câu trả lời không bị tắt trong nhiệm vụ chính.
xnor

2
Tại sao chức năng đầu vào không thể được sử dụng?
Máy

Câu trả lời:


15

05AB1E , 2 byte

|O

Giải trình:

|   Get input as array
 O  Sum

Hãy thử trực tuyến!


6
Điều đó thật nực cười :)

Điều này có đọc từ tiêu chuẩn trong?

1
@Lembik nó làm.
Okx

Tôi tin rằng câu trả lời 2 byte của bạn là đầu tiên. Bạn là người chiến thắng! (Trừ khi ai đó tìm thấy câu trả lời 1 byte.)

3
@Lembik Hoặc câu trả lời 0 byte ....
Đồng chí SparklePony

21

Bash + coreutils, 16 byte

xargs|tr \  +|bc

Hãy thử trực tuyến!

Có hai không gian sau \. Điều này làm việc cho số âm là tốt.

Giải trình:

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

Bạn có thể tự hỏi tại sao tr \\n +|bckhông tốt hơn, vì nó biến dòng mới trực tiếp thành '+'. Chà, có 2 lỗi không lường trước được:

  • nếu đầu vào có một dòng mới, thì nó được chuyển thành dấu '+', do đó không có số nào sau nó để thực hiện phép cộng
  • và vấn đề kỳ lạ nhất là bc yêu cầu một dòng mới sau đầu vào, nhưng bạn chỉ cần thay thế tất cả các dòng mới đầu vào bằng '+' s.

Tôi thích điều này. Thật đẹp và thông minh.

Bạn có thể sử dụng tr \\ n + Thay vào đó mà không có xargs không?

1
@Lembik Ý bạn là tr \\n +|bcsao? Nếu vậy, xin vui lòng xem giải thích cập nhật. Câu hỏi hay.
seshoumara

paste -s -d+|bclà 15 byte
David Conrad

1
@Lembik Không xem xét trường hợp đó, nhưng may mắn là kịch bản vẫn hoạt động. xargs|tr \ +trong trường hợp này không làm gì cả, và bc nhận số và in lại.
seshoumara

14

MATL , 2 byte

Us

Điều này mong đợi đầu vào trong một tệp văn bản được gọi là defin.

Gif hoặc nó đã không xảy ra :

nhập mô tả hình ảnh ở đây

Hoặc thử trực tuyến! ( cảm ơn Dennis vì đã thiết lập! )

Giải trình

Khi một chương trình MATL được chạy, nếu defintìm thấy một tệp được gọi (tên gọi là "đầu vào mặc định"), nội dung của nó sẽ được tự động tải dưới dạng văn bản và được đẩy vào ngăn xếp dưới dạng chuỗi trước khi thực thi mã.

Hàm Uđánh giá chuỗi để chuyển đổi nó thành một vectơ cột của các số và stính tổng, được hiển thị ngầm.



12

Dán + bc, 13 byte

paste -sd+|bc

Giải trình:

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

Một câu trả lời vỏ khác!


1
Rất gọn gàng và ngăn nắp.

Ồ, tôi đã có paste -s -d+|bcvà không nhận ra mình có thể hợp nhất các thiết bị chuyển mạch. Khéo léo!
David Conrad

12

Perl 6 , 13 byte

say sum lines

Thử nó

Giải trình

  • lines()trả về một danh sách các dòng từ $*INhoặc $*ARGFILESmột tay cầm đầu vào dòng lệnh ma thuật của Viking.
  • sum(…)đã được thêm vào Perl 6 để cho phép [+] Listđược tối ưu hóa cho các Vị trí có thể tính tổng của chúng mà không tạo ra tất cả các giá trị của chúng như 1..100000
    (tôi chỉ nghĩ rằng sumở đây quá dễ thương để sử dụng [+]như tôi thường làm)
  • say(…)gọi .gistphương thức trên đầu vào của nó và in nó với một dòng mới bổ sung.

Nó là gì perl 5?

14
cái này đọc như lolcode
Bryan Boettcher

@Lembik nó được dán nhãn rõ ràng là Perl 6 , đây là ngôn ngữ chị em với Perl 5 .
Brad Gilbert b2gills

Có một lỗi đánh máy. Ý tôi là nó là gì trong Perl 5?

1
Cũng $a+=$_ for <>;print $ahoạt động trong Perl 5, nhưng có thể có một cách ngắn hơn.
Brad Gilbert b2gills

10

C, 53 byte

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

C hiển thị lại thông tin đăng nhập :)

2
Tôi cảm thấy nên có một cách ngắn hơn, nhưng tôi không thấy nó :)
Chấn thương kỹ thuật số


9

Võng mạc , 11 7 byte

-4 cảm ơn Martin Ender

.*
$*
1

Hãy thử trực tuyến!


Chuyển đổi sang đơn nguyên:

.*
$*

Đếm số 1s:

1

1
Thật thú vị khi Retina, như một ngôn ngữ dựa trên regex, có thể thực hiện tổng số lượng byte ít hơn so với câu trả lời bash ngắn nhất được đăng cho đến nay. +1
seshoumara

Đây có phải là đọc từ tiêu chuẩn trong?

2
@Lembik Đúng vậy.
Riley

Nếu đầu vào trong unary được cho phép, nó sẽ chỉ là một byte.
mbomb007

@ mbomb007 Tôi đã thử nó trong sed.
Riley

8

Brain-Flak , 20 byte

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

Hãy thử trực tuyến!

Giải trình

Đây là một giải đấu được thực hiện bởi Riley trong trò chuyện . Giải pháp của ông là:

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

Nếu bạn quen thuộc với Brain-Flak thì điều này khá tự giải thích. Nó đẩy chiều cao ngăn xếp và bật một giá trị khi nó đếm ngược, cuối cùng, nó đẩy tổng của tất cả các lần chạy.

Đây là một môn đánh gôn khá tốt nhưng anh ta đánh bại cả hai {}([])tuy nhiên những điều này sẽ có một giá trị chỉ khác nhau một vì vậy nếu thay vào đó chúng ta gỡ mặt nạ ra và làm một trong hai tiêu cực thì họ gần như sẽ hủy bỏ.

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

Vì chúng luôn khác nhau bởi một nên chúng ta có một trường hợp không may là câu trả lời của chúng ta luôn bị tắt bởi chiều cao ngăn xếp. Để khắc phục điều này, chúng tôi chỉ cần di chuyển điểm bắt đầu của cú đẩy để bao gồm chiều cao ngăn xếp đầu tiên.

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

1
Tôi nghĩ về nó khi pop tiêu cực hủy bỏ chiều cao trước đó được đẩy (từ trước vòng lặp hoặc hết thời gian trước đó) và chiều cao cuối cùng là 0 để có thể bỏ qua.
Riley

8

Python 2, 40 byte

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

7

R, 11 byte

sum(scan())

scanlấy đầu vào, một số trên mỗi dòng. Và sum, tốt, số tiền.


7

Perl 5 , 9 byte

8 byte mã + -pcờ.

$\+=$_}{

Hãy thử trực tuyến!

Với -p, đầu vào được đọc một dòng tại một thời điểm, được lưu trữ $_mỗi lần. Chúng tôi sử dụng $\như bộ tích lũy, vì nhờ -pcờ, nó được in ngầm ở cuối. Không thể so sánh }{được sử dụng để -pcờ chỉ in $\một lần ở cuối thay vì in $_$\ở mỗi dòng, nó đọc như bình thường.


Tôi thậm chí không thể phân tích nó! :) Giải thích xin vui lòng.

@Lembik Ở đây bạn đi.
Dada

Phần ngoặc đơn chưa từng có là rất tối nghĩa!

@Lembik Những người không có dấu ngoặc đơn ... Họ là người Pháp hoặc Niềng răng xoăn tùy thuộc vào người bạn hỏi, nhưng họ chắc chắn không phải)(
CraigR8806

1
@Lembik accolades, rõ ràng.
Michael Vehrs

7

Pure Bash, 37 36 byte

Cảm ơn @KevinCruijssen cho một byte!

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

Hãy thử trực tuyến!


3
Rất đẹp và sạch sẽ.

Tôi không bao giờ lập trình ở Bash , nhưng không thể xóa khoảng trống giữa do ((? Các TIO dường như làm việc.
Kevin Cruijssen

@KevinCruijssen Vâng, có vẻ như nó hoạt động. Tôi sử dụng zsh làm vỏ hàng ngày của mình và nó không hoạt động trong zsh mà không có khoảng trắng, tôi chỉ cho rằng nó sẽ không hoạt động ở Bash nhưng rõ ràng là nó hoạt động.
betseg

6

Haskell, 32 byte

interact$show.sum.map read.lines

Hãy thử trực tuyến! .

interactthu thập toàn bộ đầu vào từ stdin, chuyển nó đến hàm được đưa ra làm đối số của nó và in chuỗi nó lấy lại từ hàm này. Chức năng là:

            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
Điều này làm cho tôi thực sự thích Haskell. Trong Scala, tôi phải làm lines.map(_.toInt) bởi vì sum mong đợi một số loại chuyển đổi ngầm định số từ Chuỗi hoặc trong trường hợp này là một chuyển đổi rõ ràng.
Stefan Aleksić

6

PHP, 22 byte

<?=array_sum(file(t));

Giả định này có một tệp có tên "t" với danh sách các số nguyên.

file()mở một tệp và trả về một mảng với mỗi dòng được lưu trữ một phần tử riêng trong mảng. array_sum()tổng hợp tất cả các yếu tố trong một mảng.


5

Awk, 19 byte

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

Giải trình:

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

1
"Giải thích sắp ra mắt ™" Đó sẽ là câu khẩu hiệu mới của tôi nếu nó không được đăng ký nhãn hiệu ...
ETHproductions

2
Trong ngôn ngữ của awk, câu trả lời của bạn thực sự chỉ có 19 byte: {s+=$1}END{print s}:)
Chấn thương kỹ thuật số

5

dc , 14 byte

0[+?z2=a]dsaxp

Hãy thử trực tuyến!

Giải trình:

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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.

Làm thế nào để 1btổng số?
Esolanging Fruit

CJam không yêu cầu biểu diễn chính tắc để chuyển đổi chữ số sang số nguyên; [<x> <y> <z> <w>]<b>bchỉ cần tính b³x + b²y + bz + w . Khi b = 1 , điều này cho x + y + z + w .
Dennis

4

Python, 38 30 byte

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

Trong python, các tập tin được mở bằng open('filename')(rõ ràng). Họ, tuy nhiên, lặp đi lặp lại. Mỗi lần bạn lặp qua tệp, bạn sẽ nhận được dòng tiếp theo. Vì vậy, bản đồ lặp đi lặp lại qua từng danh sách, gọiint nó và sau đó tổng hợp danh sách kết quả.

Gọi với tên tệp là đầu vào. (I Ef('numbers.txt') )

8 byte được lưu bằng cách sử dụng map(int, open(n))thay vì hiểu danh sách. Mã gốc:

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

1
Tôi tin rằng bạn cũng có thể làm điều này với đầu vào tiêu chuẩn bằng cách gọi 'open (0)'. Không chắc chắn nếu điều đó có thể được sử dụng để rút ngắn câu trả lời của bạn.
cole

@Cole dennis đã có giải pháp đó, vì vậy tôi sẽ để lại câu trả lời của mình như thế này.
R

Sai lầm của tôi, xin lỗi về điều đó; Tôi đã không đọc tất cả các cách thông qua trước khi đi đến câu trả lời của bạn.
cole

@Cole không sao đâu, tôi không phiền đâu.
R

4

Toán học, 19 byte

Giả sử môi trường máy tính xách tay của Mathicala.

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

Dự kiến ​​đầu vào là trong một tập tin a.


Đó là một ngôn ngữ điên :)

4
@Lembik người bình thường sẽ viết điều này rất dễ đọc Total @ Flatten @ Import @ "a"hoặc thậm chí "a" // Import // Flatten // Total. ;)
Martin Ender

Sẽ không Tr[#&@@@Import@#]&được phép?
ngenisis

4

Thạch , 9 8 byte

ƈFпFỴVS

STDIN không thực sự là thứ của Jelly ...

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ƈ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
Thứ hai Fcó thể là tốt, cho rõ ràng.
Erik the Outgolfer


4

Bash tinh khiết, 30

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

Hãy thử trực tuyến.

  • reads tập tin đầu vào trong một đi vào biến b. -d_nói readrằng dấu phân cách dòng _thay vìnewline
  • ${b//'newline'/+}thay thế các dòng mới trong bbằng+
  • echo $[ ... ] đánh giá một cách hợp lý biểu thức kết quả và đưa ra nó.

+1 Rất đẹp. Là dòng mới cuối của một tập tin đầu vào là đọc? Tôi hỏi bởi vì nếu nó được thay thế bằng '+', $[]phần đó sẽ bị lỗi do dấu '+'.
seshoumara

@seshoumara Dường như readloại bỏ các dòng mới cuối cùng, mặc dù dấu phân cách dòng bị ghi đè _. Đây có lẽ là một cảnh báo read, nhưng nó hoạt động tốt cho tình huống này.
Chấn thương kỹ thuật số

Tôi luôn vui khi thấy một giải pháp bash tinh khiết.

3

Vim, 16 byte / tổ hợp phím

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

Vì V tương thích ngược, bạn có thể dùng thử trực tuyến!


Đây có phải là đọc từ tiêu chuẩn trong hoặc từ một tập tin?

Vâng, Vim có thể không được phép ... :(
CalculatorFeline


3

jq , 5 byte

add, cộng với cờ dòng lệnh -s.

Ví dụ:

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

6 byte . Vì -saddsẽ không làm việc, đếm không gian.
agc

@agc Sửa lỗi cho tôi nếu tôi sai nhưng bản thân mã là add(3 byte) và bạn phải thêm 2 byte cho -scờ. Không gian không được tính là mã hoặc cờ: đó là dấu phân cách dòng lệnh được sử dụng bởi ngôn ngữ.
caird coinheringaahing

1
@ ThisGuy, -scờ này là viết tắt của " --slurp ", (đọc toàn bộ luồng đầu vào thành một mảng lớn và chạy bộ lọc chỉ một lần), thay đổi cả cách jqdiễn giải dữ liệu đầu vào và cách nó chạy mã. Nó không giống như -etrong sedđó chỉ đơn thuần nói sedrằng chuỗi tiếp theo là mã. Các -slà giống như một phần của jqngôn ngữ riêng của mình, và do đó không gian byte thứ 6 sẽ là quá.
agc


3

đc, 22

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

Điều này có vẻ khá dài hơn nó nên, nhưng thật khó để quyết định khi nào kết thúc tập tin. Cách duy nhất tôi có thể nghĩ để làm điều này là kiểm tra độ dài ngăn xếp sau ?lệnh.

Hãy thử trực tuyến .

[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

Lưu ý macro mđược gọi đệ quy. Hiện đại dcthực hiện đệ quy đuôi cho loại điều này, vì vậy không có lo lắng về việc tràn chồng.


Chào mừng đến với PPCG! Xin lưu ý rằng nếu không có đủ lời giải thích, nó sẽ chuyển qua bộ lọc bài viết chất lượng thấp .
Matthew Roh

@SIGSEGV không cần chào đón - Tôi đã ở đây một thời gian ;-). Đúng, tôi đã viết lời giải thích của tôi trong khi bạn nhận xét. Xem chỉnh sửa.
Chấn thương kỹ thuật số

1
Tôi nợ bạn một byte cho thủ thuật sao chép macro trước khi lưu trữ nó.
Brian McCutchon

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.