考虑每行一个整数的流/文件。例如:
123
5
99
您的代码应输出这些数字的总和,即227
。
输入格式严格为每行一个整数。例如,您不能假定输入作为整数数组在一行上。
您可以从STDIN中以文件名或具有您选择的名称的文件形式进行输入。您可以选择哪一个。不允许有其他获取输入的方法。
输入将包含至少一个整数。您可以假设所有整数均为非负数,并且它们的总和小于。232
考虑每行一个整数的流/文件。例如:
123
5
99
您的代码应输出这些数字的总和,即227
。
输入格式严格为每行一个整数。例如,您不能假定输入作为整数数组在一行上。
您可以从STDIN中以文件名或具有您选择的名称的文件形式进行输入。您可以选择哪一个。不允许有其他获取输入的方法。
输入将包含至少一个整数。您可以假设所有整数均为非负数,并且它们的总和小于。232
Answers:
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个无法预料的错误:
tr \\n +|bc
?如果是这样,请参阅更新的说明。好问题。
paste -s -d+|bc
是15个字节
xargs|tr \ +
在这种情况下,什么都不做,bc接收到该号码并将其打印回去。
paste -sd+|bc
说明:
paste -s Take one line at a time from input
d+ Joining by '+'
|bc Pass as expression to bc
另一个shell的答案!
paste -s -d+|bc
也没有意识到我可以合并这些交换机。整齐!
say sum lines
lines()
返回命令行列表$*IN
或$*ARGFILES
“魔术”命令行输入句柄。sum(…)
已添加到Perl 6中,以便[+] List
针对Positionalals进行优化,可以计算它们的总和而不生成所有值,例如1..100000
sum
这里太可爱了,无法[+]
像往常一样使用)say(…)
.gist
在其输入上调用该方法,并使用附加换行符打印该方法。$a+=$_ for <>;print $a
在Perl 5中效果很好,但是可能有更短的方法。
(([]){[{}]{}([])}{})
这是赖利在聊天中提出的解决方案。他的解决方案是:
([])({<{}>{}<([])>}{})
如果您熟悉Brain-Flak,这是不言而喻的。它推压堆栈高度并在递减计数时弹出一个值,最后推压所有行程的总和。
这是一个非常不错的高尔夫球场,但是他将两者都设为零{}
,([])
但是它们的值只会相差一个,因此,如果取而代之的是我们取下遮罩并使两个负数之一变为负数,它们应该几乎抵消掉。
([])({[{}]{}([])}{})
由于它们总是相差一个,所以在不幸的情况下,我们的答案总是取决于堆高。为了解决这个问题,我们只需要简单地将推动的开始移动到包含第一个堆栈高度的位置即可。
(([]){[{}]{}([])}{})
8个字节的代码+ -p
标志。
$\+=$_}{
使用-p
,输入$_
每次读取一行,每次存储一次。我们将其$\
用作累加器,因为多亏了-p
flag,它才隐式打印在末尾。不匹配的}{
被使用,从而-p
标志只打印$\
在端而不是打印一次$_
且$\
在每一行读取像通常那样。
)(
accolades
,显然。
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
lines.map(_.toInt)
因为sum期望从String进行某种形式的数字隐式转换,或者在这种情况下是显式转换。
{s+=$1}END{print s}
说明:
{s+=$1} For all lines in the input, add to s
END End loop
{print s} Print s
{s+=$1}END{print s}
:)
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
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
总和如何计算?
[<x> <y> <z> <w>]<b>b
只需计算b³x+b²y+ bz + w即可。当b = 1时,得出x + y + z + w。
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)])
假设Mathematica的笔记本环境。
Tr[#&@@@Import@"a"]
期望输入在文件中a
。
Total @ Flatten @ Import @ "a"
甚至"a" // Import // Flatten // Total
。;)
Tr[#&@@@Import@#]&
也被允许?
ƈ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.
F
可能是一个Ṗ
为好,为清楚起见。
read -d_ b
echo $[${b//'
'/+}]
read
将输入文件放入变量中b
。-d_
告诉read
行定界符是_
而不是newline${b//'
newline'/+}
替换换行符b
与+
echo $[ ... ]
对结果表达式进行算术运算并输出。$[]
部分将因尾随“ +”而出错。
read
,即使行定界符被覆盖为,也将丢弃最后的尾随换行符_
。这可能是一个警告read
,但在这种情况下效果很好。
-sadd
不起作用,请计算空间。
add
3个字节,并且您必须为该标志添加 2个字节-s
。空格不算作代码或标志:它是语言使用的命令行分隔符。
-s
标记是“ --slurp ”的缩写(将整个输入流读入一个大数组并只运行一次过滤器),这将改变jq
解释输入数据的方式以及运行代码的方式。这不是像-e
在sed
其中只是告诉sed
了随后的字符串代码。该-s
更像是一部分jq
语言本身,因此这6个字节的空间就太。
[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
为此类事情实现了尾递归,因此不必担心堆栈溢出。