Initial commit
This commit is contained in:
commit
ddc6306d53
1 changed files with 55 additions and 0 deletions
55
maths
Executable file
55
maths
Executable file
|
@ -0,0 +1,55 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import operator
|
||||||
|
from functools import reduce as fold
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
|
||||||
|
mul = lambda xs: fold(operator.mul, xs)
|
||||||
|
operators = {
|
||||||
|
"sum": sum, "+": sum,
|
||||||
|
"mul": mul, "*": mul,
|
||||||
|
"max": max,
|
||||||
|
"min": min
|
||||||
|
}
|
||||||
|
default_operator = "+"
|
||||||
|
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description="Do maths on stdin")
|
||||||
|
parser.add_argument(
|
||||||
|
"operator",
|
||||||
|
metavar="op",
|
||||||
|
nargs='?',
|
||||||
|
choices=list(operators.keys()),
|
||||||
|
default=default_operator,
|
||||||
|
help="Action to take (one of: {}; default: {})".format(
|
||||||
|
", ".join(operators.keys()),
|
||||||
|
default_operator
|
||||||
|
)
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--int",
|
||||||
|
dest="datatype",
|
||||||
|
action="store_const",
|
||||||
|
const=(int, "integer"),
|
||||||
|
default=(float, "decimal number"),
|
||||||
|
help="use integers (default: float)"
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
op = operators[args.operator]
|
||||||
|
parse_func, datatype_name = args.datatype
|
||||||
|
|
||||||
|
data = []
|
||||||
|
for i, line in enumerate(sys.stdin, start=1):
|
||||||
|
if line == "\n":
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
data.append(parse_func(line))
|
||||||
|
except ValueError:
|
||||||
|
print("Line {} could not be interpreted as a {}: {:r}".format(i, datatype_name, line.rstrip("\n")))
|
||||||
|
sys.exit(3)
|
||||||
|
|
||||||
|
print(op(data))
|
Loading…
Reference in a new issue