September 2017 Update
This commit is contained in:
parent
bba7bfd280
commit
ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions
|
|
@ -1,25 +1,70 @@
|
|||
import Data.Char
|
||||
import Data.Maybe
|
||||
import Text.Printf
|
||||
import Data.Char (toUpper)
|
||||
|
||||
dirs = ["N", "NbE", "N-NE", "NEbN", "NE", "NEbE", "E-NE", "EbN",
|
||||
"E", "EbS", "E-SE", "SEbE", "SE", "SEbS", "S-SE", "SbE",
|
||||
"S", "SbW", "S-SW", "SWbS", "SW", "SWbW", "W-SW", "WbS",
|
||||
"W", "WbN", "W-NW", "NWbW", "NW", "NWbN", "N-NW", "NbW"]
|
||||
import Data.Maybe (fromMaybe)
|
||||
|
||||
-- Given an index between 0 and 31 return the corresponding compass point name.
|
||||
import Text.Printf (PrintfType, printf)
|
||||
|
||||
dirs :: [String]
|
||||
dirs =
|
||||
[ "N"
|
||||
, "NbE"
|
||||
, "N-NE"
|
||||
, "NEbN"
|
||||
, "NE"
|
||||
, "NEbE"
|
||||
, "E-NE"
|
||||
, "EbN"
|
||||
, "E"
|
||||
, "EbS"
|
||||
, "E-SE"
|
||||
, "SEbE"
|
||||
, "SE"
|
||||
, "SEbS"
|
||||
, "S-SE"
|
||||
, "SbE"
|
||||
, "S"
|
||||
, "SbW"
|
||||
, "S-SW"
|
||||
, "SWbS"
|
||||
, "SW"
|
||||
, "SWbW"
|
||||
, "W-SW"
|
||||
, "WbS"
|
||||
, "W"
|
||||
, "WbN"
|
||||
, "W-NW"
|
||||
, "NWbW"
|
||||
, "NW"
|
||||
, "NWbN"
|
||||
, "N-NW"
|
||||
, "NbW"
|
||||
]
|
||||
|
||||
-- Index between 0 and 31 -> the corresponding compass point name.
|
||||
pointName :: Int -> String
|
||||
pointName = capitalize . concatMap (fromMaybe "?" . fromChar) . (dirs !!)
|
||||
where fromChar c = lookup c [('N', "north"), ('S', "south"), ('E', "east"),
|
||||
('W', "west"), ('b', " by "), ('-', "-")]
|
||||
capitalize (c:cs) = toUpper c : cs
|
||||
where
|
||||
fromChar c =
|
||||
lookup
|
||||
c
|
||||
[ ('N', "north")
|
||||
, ('S', "south")
|
||||
, ('E', "east")
|
||||
, ('W', "west")
|
||||
, ('b', " by ")
|
||||
, ('-', "-")
|
||||
]
|
||||
capitalize (c:cs) = toUpper c : cs
|
||||
|
||||
-- Convert degrees to a compass point index between 0 and 31.
|
||||
pointIndex d = (round (d*1000) + 5625) `mod` 360000 `div` 11250
|
||||
-- Degrees -> compass point index between 0 and 31.
|
||||
pointIndex :: Double -> Int
|
||||
pointIndex d = (round (d * 1000) + 5625) `mod` 360000 `div` 11250
|
||||
|
||||
printPointName d = let deg = read d :: Double
|
||||
idx = pointIndex deg
|
||||
in printf "%2d %-18s %6.2f°\n" (idx+1) (pointName idx) deg
|
||||
printPointName :: PrintfType t => String -> t
|
||||
printPointName d =
|
||||
let deg = read d :: Double
|
||||
idx = pointIndex deg
|
||||
in printf "%2d %-18s %6.2f°\n" (idx + 1) (pointName idx) deg
|
||||
|
||||
main = do
|
||||
input <- getContents
|
||||
mapM_ printPointName $ lines input
|
||||
main :: IO ()
|
||||
main = mapM_ (printPointName . show) [0 .. 31]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue