Sparkline in unicode: Difference between revisions
→{{header|Python}}: Redraft of second Python version.
(→{{header|Python}}: Redraft of second Python version.) |
|||
Line 1,629:
Or, by
with type comments for the reader, rather than the compiler:
<lang python>import re
# sparkLine :: [
def sparkLine(xs):
mn, mx = ys[0], ys[-1]
w = (mx - mn) / 8
lbounds = list(map(lambda i: mn + (w * i), range(1, 8)))
return [
''.join(map(
lambda x: maybe('█')(
lambda i: '▁▂▃▄▅▆▇'[i]
)(findIndex(lambda b: b > x)(lbounds)),
xs
)),
' '.join(map(str, xs)),
'\t'.join([
'Min ' + str(mn),
'Mean ' + str(round(mean(xs), 2)),
'Median ' + str(
(ys[mid - 1] + ys[mid]) / 2 if even(n) else (
ys[mid]
)
),
'Max ' + str(mx)
]),
''
]
return go(xs) if xs else []
# main :: IO ()
def main():
for x in map(
lambda s: sparkLine(readFloats(s)),
[
"0, 1, 19, 20",
"0, 999, 4000, 4999, 7000, 7999",
"1 2 3 4 5 6 7 8 7 6 5 4 3 2 1",
"1.5, 0.5 3.5, 2.5 5.5, 4.5 7.5, 6.5"
]
):
print ('\n'.join(x))
# GENERIC -------------------------------------------------
# Just :: a -> Maybe a
def Just(x):
return {'type': 'Maybe', 'Nothing': False, 'Just': x}
# Nothing :: Maybe a
def Nothing():
return {'type': 'Maybe', 'Nothing': True}
# even :: Int -> Bool
def even(x):
return
# findIndex :: (a -> Bool) -> [a] -> Maybe Int
def findIndex(p):
def go(xs):
try:
return Just(next(
i for i, v in enumerate(xs) if p(v)
))
except StopIteration:
return Nothing()
return lambda xs: go(xs)
# maybe :: b -> (a -> b) -> Maybe a -> b
def maybe(v):
return lambda f: lambda m: v if m.get('Nothing') else (
f(m.get('Just'))
)
# mean :: [Num] -> Float
def mean(xs):
return sum(xs) / float(len(xs))
Line 1,689 ⟶ 1,731:
# TEST -------------------------------------------------
if __name__ == '__main__':
main()</lang>
{{Out}}
<pre>▁▁██
0.0 1.0 19.0 20.0
Min 0.0 Mean 10.0 Median 10.0 Max 20.0
▁▁▅▅██
0.0 999.0 4000.0 4999.0 7000.0 7999.0
Min 0.0 Mean 4166.17 Median 4499.5 Max 7999.0
▁▂▃▄▅▆▇█▇▆▅▄▃▂▁
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 7.0 6.0 5.0 4.0 3.0 2.0 1.0
Min 1.0 Mean 4.27 Median 4.0 Max 8.0
▂▁▄▃▆▅█▇
1.5 0.5 3.5 2.5 5.5 4.5 7.5 6.5
Min 0.5 Mean 4.0 Median 4.0 Max 7.5</pre>
=={{header|REXX}}==
|