将标准中的数字相加


32

考虑每行一个整数的流/文件。例如:

123
5
99

您的代码应输出这些数字的总和,即227

输入格式严格为每行一个整数。例如,您不能假定输入作为整数数组在一行上。

您可以从STDIN中以文件名或具有您选择的名称的文件形式进行输入。您可以选择哪一个。不允许有其他获取输入的方法。

输入将包含至少一个整数。您可以假设所有整数均为非负数,并且它们的总和小于。232


2
有尾随换行符吗?该换行符是可选的吗?
请在

9
嗨!我之所以反对这个挑战,是因为它具有限制性的输入格式,因此违反了我们关于可接受的输入/输出格式的社区标准
AdmBorkBork

1
@AdmBorkBork和我在聊天室中进行了详细讨论。我们已经同意不同意:)

22
作为避免麻烦的I / O任意重写默认值的作者,我希望以此为理由来捍卫这一挑战。在这里,处理输入是挑战的源头,而不是分散主要挑战的额外工作。这不是具有奇怪的I / O要求的“添加数字”,而是“添加”作为步骤来“执行此I / O”。对于不跨主要任务的捷径的答案,必须推翻标准I / O。
xnor

2
为什么不能使用功能输入?
CalculatorFeline

Answers:


15

05AB1E,2个字节

|O

说明:

|   Get input as array
 O  Sum

在线尝试!


6
这太荒谬了:)

这是从标准中读取的吗?

1
@Lembik它会。
Okx

我相信您的2个字节的答案是第一位的。你是赢家!(除非有人找到一个1字节的答案。)

3
@Lembik还是0字节的答案....
SparklePony同志17年

21

Bash + coreutils,16个字节

xargs|tr \  +|bc

在线尝试!

后面有两个空格 \。这同样适用于负数。

说明:

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

您可能想知道为什么 tr \\n +|bc没有更好,因为它会将换行符直接变成'+'。好吧,这有2个无法预料的错误:

  • 如果输入的末尾有换行符,则将其转换为末尾的“ +”,因此执行加法后没有数字
  • 最奇怪的问题是,在输入之后,bc要求在末尾添加换行符,但是您只是用“ +”替换了所有输入的换行符。

我喜欢这个。很好,很聪明。

您可以使用tr \\ n +而不使用xargs吗?

1
@Lembik你的意思是tr \\n +|bc?如果是这样,请参阅更新的说明。好问题。
seshoumara

paste -s -d+|bc是15个字节
David Conrad

1
@Lembik没有考虑这种情况,但是幸运的是脚本仍然有效。xargs|tr \ +在这种情况下,什么都不做,bc接收到该号码并将其打印回去。
seshoumara

14

MATL,2个字节

Us

这需要在名为的文本文件中输入defin

Gif或它没有发生

enter image description here

在线尝试!感谢Dennis的设置!

说明

运行MATL程序时,如果文件名为 defin找到(名称 “默认输入”),则在执行代码之前,其内容将自动作为文本加载并作为字符串推入堆栈。

函数U评估字符串以将其转换为数字的列向量,并s计算总和,该总和被隐式显示。


13

Japt,2个字节

Nx

说明

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

在线尝试!


12

粘贴+ bc,13个字节

paste -sd+|bc

说明:

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

另一个shell的答案!


1
非常整洁。

哦,我曾经paste -s -d+|bc也没有意识到我可以合并这些交换机。整齐!
David Conrad

12

Perl 6、13个字节

say sum lines

试试吧

说明

  • lines()返回命令行列表$*IN$*ARGFILES“魔术”命令行输入句柄。
  • sum(…)已添加到Perl 6中,以便[+] List针对Positionalals进行优化,可以计算它们的总和而不生成所有值,例如1..100000
    (我只是觉得sum这里太可爱了,无法[+]像往常一样使用)
  • say(…).gist在其输入上调用该方法,并使用附加换行符打印该方法。

Perl 5是什么?

14
这看起来像哈哈代码
Bryan Boettcher'Mar

@Lembik显然被标记为Perl 6,这是Perl 5的姐妹语言。
布拉德·吉尔伯特b2gills '17

有一个错字。我的意思是Perl 5是什么?

1
$a+=$_ for <>;print $a在Perl 5中效果很好,但是可能有更短的方法。
布拉德·吉尔伯特b2gills'17

10

C,53字节

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

C再次显示其凭据:)

2
我觉得应该有一个更短的方法,但我看不到:)
Digital Trauma


9

视网膜11 7字节

-4感谢Martin Ender

.*
$*
1

在线尝试!


转换为一元:

.*
$*

计算1s 的数量:

1

1
有趣的是,作为一种基于正则表达式的语言,视网膜可以比迄今为止发布的最短bash答案用更少的字节来完成总和。+1
seshoumara

这是从标准阅读的吗?

2
@Lembik是的。
莱利

如果一元输入被允许,则只有一个字节。
mbomb007'3

@ mbomb007我已经在sed中尝试过了。
莱利

8

Brain-Flak,20字节

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

在线尝试!

说明

这是赖利在聊天中提出的解决方案。他的解决方案是:

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

如果您熟悉Brain-Flak,这是不言而喻的。它推压堆栈高度并在递减计数时弹出一个值,最后推压所有行程的总和。

这是一个非常不错的高尔夫球场,但是他将两者都设为零{}([])但是它们的值只会相差一个,因此,如果取而代之的是我们取下遮罩并使两个负数之一变为负数,它们应该几乎抵消掉。

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

由于它们总是相差一个,所以在不幸的情况下,我们的答案总是取决于堆高。为了解决这个问题,我们只需要简单地将推动的开始移动到包含第一个堆栈高度的位置即可。

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

1
我认为这是因为负流行音乐取消了之前推入的高度(从循环之前,或者从上一次结束到结束),并且最后一个高度为0,因此可以忽略。
莱利

8

Python 2,40个字节

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

7

R,11字节

sum(scan())

scan接受输入,每行一个数字。而且sum,总和。


7

Perl 5、9个字节

8个字节的代码+ -p标志。

$\+=$_}{

在线尝试!

使用-p,输入$_每次读取一行,每次存储一次。我们将其$\用作累加器,因为多亏了-pflag,它才隐式打印在末尾。不匹配的}{被使用,从而-p标志只打印$\在端而不是打印一次$_$\在每一行读取像通常那样。


我什至无法解析!:)请解释。

@Lembik,你去。
达达

无与伦比的括号部分非常晦涩!

@Lembik这些都不是parenthesizes ......他们要么法国卷毛 括号取决于谁你问,但他们绝对不是)(
CraigR8806

1
@Lembik accolades,显然。
Michael Vehrs

7

纯Bash,37 36字节

感谢@KevinCruijssen一个字节!

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

在线尝试!


3
非常干净。

我从不使用Bash编程,但是是否不可能删除两者之间的空间do ((?该TIO似乎工作。
凯文·克鲁伊森

@KevinCruijssen是的,似乎可行。我将zsh用作我的日常shell,并且它在没有空格的zsh中无法工作,我只是假设它在Bash中不起作用,但显然可以。
betseg

6

Haskell,32个字节

interact$show.sum.map read.lines

在线尝试!

interact从stdin收集整个输入,将其传递给作为其参数给出的函数,并打印从此函数返回的字符串。该函数是:

            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
这让我真的很喜欢Haskell。在Scala中,我必须这样做,lines.map(_.toInt) 因为sum期望从String进行某种形式的数字隐式转换,或者在这种情况下是显式转换。
StefanAleksić17年

6

PHP,22字节

<?=array_sum(file(t));

假设存在一个名为“ t”的文件,其中包含一个整数列表。

file()打开文件并返回一个数组,每行在数组中存储一个单独的元素。array_sum()对数组中的所有元素求和。


5

Awk,19个字节

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

说明:

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

1
“说明即将到来™”,如果它没有商标,那将是我的新口号……
ETHproductions

2
用awk语言,您的答案实际上只有19个字节:{s+=$1}END{print s}:)
Digital Trauma

5

dc,14个字节

0[+?z2=a]dsaxp

在线尝试!

说明:

 [      ] 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个字节

q~]1b

在线尝试!

怎么运行的

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.

1b总和如何计算?
硕果累累

CJam不需要规​​范表示法即可进行数字到整数的转换;[<x> <y> <z> <w>]<b>b只需计算b³x+b²y+ bz + w即可。当b = 1时,得出x + y + z + w
丹尼斯

4

Python,38 30字节

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

在python中,文件由open('filename')(显然)打开。但是,它们是可迭代的。每次您遍历文件时,都会得到下一行。因此map遍历每个列表,调用int,然后对结果列表求和。

以文件名作为输入进行调用。(即f('numbers.txt')

使用map(int, open(n))而不是列表解析来保存8个字节。原始代码:

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

1
我相信您也可以通过调用“ open(0)”使用标准输入来执行此操作。不确定是否可以用来缩短答案。
2015年

@Cole dennis已经有了该解决方案,所以我将这样回答。
Rɪᴋᴇʀ

我的错,对此感到抱歉;在得到您的答案之前,我并没有完整阅读。
科尔

@科尔没关系,我不在乎。
Rɪᴋᴇʀ

4

Mathematica,19个字节

假设Mathematica的笔记本环境。

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

期望输入在文件中a


这是一种疯狂的语言:)

4
@Lembik普通人会很容易地将其写成as Total @ Flatten @ Import @ "a"甚至"a" // Import // Flatten // Total。;)
Martin Ender

会不会Tr[#&@@@Import@#]&也被允许?
ngenisis

4

果冻9 8字节

ƈFпFỴVS

STDIN并不是果冻的事...

在线尝试!

怎么运行的

ƈ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
第二个F可能是一个为好,为清楚起见。
暴民埃里克(Erik the Outgolfer)


4

纯bash 30

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

在线尝试。

  • read将输入文件放入变量中b-d_告诉read行定界符是_而不是newline
  • ${b//'newline'/+}替换换行符b+
  • echo $[ ... ] 对结果表达式进行算术运算并输出。

+1非常好。输入文件的尾随换行符也可以读取吗?我问是因为如果将其替换为“ +”,则该$[]部分将因尾随“ +”而出错。
seshoumara

@seshoumara看来read,即使行定界符被覆盖为,也将丢弃最后的尾随换行符_。这可能是一个警告read,但在这种情况下效果很好。
Digital Trauma'Mar

我总是很高兴看到纯bash解决方案。



3

q,5个字节

add,加上命令行标志 -s

例如:

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

6个字节。由于-sadd不起作用,请计算空间。
agc

@agc如果我错了,请纠正我,但是代码本身是add3个字节,并且您必须为该标志添加 2个字节-s。空格不算作代码或标志:它是语言使用的命令行分隔符。
caird coinheringaahing

1
@ThisGuy,好吧,该-s标记是“ --slurp ”的缩写(将整个输入流读入一个大数组并只运行一次过滤器),这将改变jq解释输入数据的方式以及运行代码的方式。这不是像-esed其中只是告诉sed了随后的字符串代码。该-s更像是一部分jq语言本身,因此这6个字节的空间就太。
gc

3

实际上,2个字节

在线尝试!

说明:

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

直流电,22

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

这似乎比应有的时间更长,但是要决定何时到达文件末尾是很棘手的。我能想到的唯一方法是检查后的堆栈长度?命令。

在线尝试

[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

请注意,该宏m是递归调用的。Modern dc为此类事情实现了尾递归,因此不必担心堆栈溢出。


欢迎来到PPCG!请注意,如果没有足够的解释,它将通过低质量的帖子过滤器
马修·罗

@SIGSEGV不需要欢迎-我已经来了一段时间;-)。是的,当您发表评论时,我正在写我的解释。参见编辑。
Digital Trauma's

1
我欠你一个字节,可以在存储宏之前复制宏。
Brian McCutchon

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.