September 2017 Update
This commit is contained in:
parent
bba7bfd280
commit
ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions
|
|
@ -1,13 +1,23 @@
|
|||
digit :: Char -> Char -> Char -> Integer -> String
|
||||
digit x y z k =
|
||||
[[x],[x,x],[x,x,x],[x,y],[y],[y,x],[y,x,x],[y,x,x,x],[x,z]] !!
|
||||
[[x], [x, x], [x, x, x], [x, y], [y], [y, x], [y, x, x], [y, x, x, x], [x, z]] !!
|
||||
(fromInteger k - 1)
|
||||
|
||||
toRoman :: Integer -> String
|
||||
toRoman 0 = ""
|
||||
toRoman x | x < 0 = error "Negative roman numeral"
|
||||
toRoman x | x >= 1000 = 'M' : toRoman (x - 1000)
|
||||
toRoman x | x >= 100 = digit 'C' 'D' 'M' q ++ toRoman r where
|
||||
(q,r) = x `divMod` 100
|
||||
toRoman x | x >= 10 = digit 'X' 'L' 'C' q ++ toRoman r where
|
||||
(q,r) = x `divMod` 10
|
||||
toRoman x = digit 'I' 'V' 'X' x
|
||||
toRoman x
|
||||
| x < 0 = error "Negative roman numeral"
|
||||
toRoman x
|
||||
| x >= 1000 = 'M' : toRoman (x - 1000)
|
||||
toRoman x
|
||||
| x >= 100 = digit 'C' 'D' 'M' q ++ toRoman r
|
||||
where
|
||||
(q, r) = x `divMod` 100
|
||||
toRoman x
|
||||
| x >= 10 = digit 'X' 'L' 'C' q ++ toRoman r
|
||||
where
|
||||
(q, r) = x `divMod` 10
|
||||
toRoman x = digit 'I' 'V' 'X' x
|
||||
|
||||
main :: IO ()
|
||||
main = print $ toRoman <$> [1999, 25, 944]
|
||||
|
|
|
|||
|
|
@ -1,15 +1,28 @@
|
|||
import Data.List (mapAccumL)
|
||||
|
||||
roman :: Int -> String
|
||||
roman n = concatMap concat . snd $ mapAccumL tr n
|
||||
[(1000, "M"), (900, "CM"), (500, "D") ,( 400, "CD"),
|
||||
( 100, "C"), ( 90, "XC") ,( 50, "L"), ( 40, "XL"),
|
||||
( 10, "X"), ( 9, "IX"), ( 5, "V"), ( 4, "IV"),
|
||||
( 1, "I")]
|
||||
where
|
||||
tr a (m, s) = (r, replicate q s)
|
||||
where
|
||||
(q, r) = quotRem a m
|
||||
roman n =
|
||||
concat
|
||||
(snd
|
||||
(mapAccumL
|
||||
(\a (m, s) ->
|
||||
let (q, r) = quotRem a m
|
||||
in (r, [1 .. q] >> s))
|
||||
n
|
||||
[ (1000, "M")
|
||||
, (900, "CM")
|
||||
, (500, "D")
|
||||
, (400, "CD")
|
||||
, (100, "C")
|
||||
, (90, "XC")
|
||||
, (50, "L")
|
||||
, (40, "XL")
|
||||
, (10, "X")
|
||||
, (9, "IX")
|
||||
, (5, "V")
|
||||
, (4, "IV")
|
||||
, (1, "I")
|
||||
]))
|
||||
|
||||
main :: IO ()
|
||||
main = mapM_ (putStrLn . roman) [1666, 1990, 2008, 2016, 2017]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue