import Data.List
. filter (isPandigital
. toRoman
) $ [1..2000]
toRoman = toRoman'
[ (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
toRoman' _ 0 = ""
toRoman' [] _ = error "Empty roman numerals" toRoman' ((y,r):ys) x
| x < y = toRoman' ys x
| otherwise = r
++ toRoman
' ((y,r):ys) (x - y)
isPandigital :: String -> Bool
isPandigital = (== "CDILMVX") . sort
aW1wb3J0IERhdGEuTGlzdAoKbWFpbiA6OiBJTyAoKQptYWluID0gcHV0U3RyCiAgICAgLiB1bmxpbmVzCiAgICAgLiBtYXAgc2hvdwogICAgIC4gZmlsdGVyIChpc1BhbmRpZ2l0YWwgLiB0b1JvbWFuKQogICAgICQgWzEuLjIwMDBdCgp0b1JvbWFuIDo6IEludCAtPiBTdHJpbmcKdG9Sb21hbiA9IHRvUm9tYW4nCiAgWyAoMTAwMCwgIk0iKSwgKDkwMCwgIkNNIiksICg1MDAsICJEIiksICg0MDAsICJDRCIpCiAgLCAoMTAwLCAiQyIpLCAoOTAsICJYQyIpLCAoNTAsICJMIiksICg0MCwgIlhMIikKICAsICgxMCwgIlgiKSwgKDksICJJWCIpLCAoNSwgIlYiKSwgKDQsICJJViIpLCAoMSwgIkkiKQogIF0KICB3aGVyZQogICAgdG9Sb21hbicgOjogWyhJbnQsIFN0cmluZyldIC0+IEludCAtPiBTdHJpbmcKICAgIHRvUm9tYW4nIF8gICAgICAgICAgMCA9ICIiCiAgICB0b1JvbWFuJyBbXSAgICAgICAgIF8gPSBlcnJvciAiRW1wdHkgcm9tYW4gbnVtZXJhbHMiCiAgICB0b1JvbWFuJyAoKHkscik6eXMpIHgKICAgICAgfCB4IDwgeSAgICAgICAgICAgICA9IHRvUm9tYW4nIHlzIHgKICAgICAgfCBvdGhlcndpc2UgICAgICAgICA9IHIgKysgdG9Sb21hbicgKCh5LHIpOnlzKSAoeCAtIHkpCgppc1BhbmRpZ2l0YWwgOjogU3RyaW5nIC0+IEJvb2wKaXNQYW5kaWdpdGFsID0gKD09ICJDRElMTVZYIikgLiBzb3J0