Sparkline in unicode: Difference between revisions

Content added Content deleted
(Add SenseTalk implementation)
(→‎{{header|Haskell}}: Tidied, obtained max and min values in one pass rather than two)
Line 1,073: Line 1,073:
Or, stripping back a little:
Or, stripping back a little:
{{Trans|Python}}
{{Trans|Python}}
<lang haskell>import Data.List.Split (splitOneOf)
<lang haskell>import Data.Bifunctor (bimap)
import Data.List (findIndex)
import Data.List (findIndex)
import Data.List.Split (splitOneOf)
import Data.Maybe (maybe)
import Data.Maybe (maybe)

------------------------ SPARK LINE ----------------------


sparkLine :: [Float] -> String
sparkLine :: [Float] -> String
sparkLine xs =
sparkLine [] = ""
sparkLine xxs@(x : xs) =
maybe '█' ("▁▂▃▄▅▆▇" !!) . flip findIndex lbounds . flip (>) <$> xs
fmap
( maybe '█' ("▁▂▃▄▅▆▇" !!)
. flip findIndex lbounds
. (<)
)
xxs
where
where
(mn, mx) = ((,) . minimum <*> maximum) xs
(mn, mx) = foldr (bimap . min <*> max) (x, x) xs
w = (mx - mn) / 8
w = (mx - mn) / 8
lbounds = (mn +) . (w *) <$> [1 .. 7]
lbounds = (mn +) . (w *) <$> [1 .. 7]


--------------------------- TEST -------------------------
parseFloats :: String -> [Float]
parseFloats = fmap read . filter (not . null) . splitOneOf " ,"

main :: IO ()
main :: IO ()
main =
main =
mapM_ putStrLn $
mapM_ putStrLn $
sparkLine . parseFloats <$>
sparkLine . parseFloats
[ "0, 1, 19, 20"
<$> [ "0, 1, 19, 20",
, "0, 999, 4000, 4999, 7000, 7999"
"0, 999, 4000, 4999, 7000, 7999",
, "1 2 3 4 5 6 7 8 7 6 5 4 3 2 1"
"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"
"1.5, 0.5 3.5, 2.5 5.5, 4.5 7.5, 6.5"
]
]</lang>

parseFloats :: String -> [Float]
parseFloats =
fmap read
. filter (not . null)
. splitOneOf " ,"</lang>
{{Out}}
{{Out}}
<pre>▁▁██
<pre>▁▁██