-
Notifications
You must be signed in to change notification settings - Fork 0
/
falsesecurity.hs
66 lines (58 loc) · 1.56 KB
/
falsesecurity.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import Data.List
import Data.Maybe
codeMap :: [(Char, String)]
codeMap =
[ ('A', ".-")
, ('B', "-...")
, ('C', "-.-.")
, ('D', "-..")
, ('E', ".")
, ('F', "..-.")
, ('G', "--.")
, ('H', "....")
, ('I', "..")
, ('J', ".---")
, ('K', "-.-")
, ('L', ".-..")
, ('M', "--")
, ('N', "-.")
, ('O', "---")
, ('P', ".--.")
, ('Q', "--.-")
, ('R', ".-.")
, ('S', "...")
, ('T', "-")
, ('U', "..-")
, ('V', "...-")
, ('W', ".--")
, ('X', "-..-")
, ('Y', "-.--")
, ('Z', "--..")
, ('_', "..--")
, (',', ".-.-")
, ('.', "---.")
, ('?', "----")
]
reverseLookup :: Eq b => b -> [(a, b)] -> Maybe a
reverseLookup elem = foldl (\acc (k, v) ->
if v == elem then
Just k
else
acc
) Nothing
convert :: String -> (String, [Int])
convert alpha = foldr (\c (morse, nums) ->
let morseChar = fromJust $ lookup c codeMap in
(morseChar ++ morse, (length morseChar) : nums)
) ("", []) alpha
reverseLengths :: (String, [Int]) -> (String, [Int])
reverseLengths (morse, lengths) = (morse, reverse lengths)
unconvert :: (String, [Int]) -> String
unconvert (morse, revLengths) = fst $ foldl (\(acc, morse) length_ ->
let (morseChar, tail_) = splitAt length_ morse in
((fromJust $ reverseLookup morseChar codeMap) : acc, tail_)
) ("", morse) revLengths
codec :: String -> String
codec = unconvert . reverseLengths . convert
main :: IO ()
main = interact (intercalate "\n" . map (reverse . codec) . lines)