{-# LANGUAGE OverloadedStrings #-}
import Data
.Maybe (fromMaybe
) import Data.Word (Word8)
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as C
import Data.ByteString
unhexDigit :: Word8 -> Word8
unhexDigit x
| (x >= 48 && x <= 57) = x - 48
| (x >= 65 && x <= 71) = x + 10 - 65
| (x >= 97 && x <= 102) = x + 10 - 97
unhexImpl
:: [Word8
] -> Maybe [Word8
] -> Maybe [Word8
]unhexImpl (x:y:xs) (Just state) =
unhexImpl xs $ Just $ a * 16 + b:state
where
a = unhexDigit x
b = unhexDigit y
unhexImpl bytes state = Nothing
unhex
:: B
.ByteString
-> Maybe B
.ByteString
unhex bytes
= fmap B
.pack
$ unhexImpl
(B
.unpack bytes
) (Just
[])
input :: B.ByteString
input = "49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d"
main
= C
.putStrLn $ fromMaybe
"invalid input" $ unhex input
ey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQoKaW1wb3J0IERhdGEuTWF5YmUgKGZyb21NYXliZSkKaW1wb3J0IERhdGEuV29yZCAoV29yZDgpCmltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nIGFzIEIKaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuQ2hhcjggYXMgQwppbXBvcnQgRGF0YS5CeXRlU3RyaW5nCgp1bmhleERpZ2l0IDo6IFdvcmQ4IC0+IFdvcmQ4CnVuaGV4RGlnaXQgeAoJfCAoeCA+PSA0OCAmJiB4IDw9IDU3KSA9IHggLSA0OAoJfCAoeCA+PSA2NSAmJiB4IDw9IDcxKSA9IHggKyAxMCAtIDY1Cgl8ICh4ID49IDk3ICYmIHggPD0gMTAyKSA9IHggKyAxMCAtIDk3Cgl8IG90aGVyd2lzZSA9IGVycm9yICJmdWNrIgoKdW5oZXhJbXBsIDo6IFtXb3JkOF0gLT4gTWF5YmUgW1dvcmQ4XSAtPiBNYXliZSBbV29yZDhdCnVuaGV4SW1wbCBbXSAoSnVzdCBzdGF0ZSkgPSBKdXN0ICQgUHJlbHVkZS5yZXZlcnNlIHN0YXRlCnVuaGV4SW1wbCAoeDp5OnhzKSAoSnVzdCBzdGF0ZSkgPQoJdW5oZXhJbXBsIHhzICQgSnVzdCAkIGEgKiAxNiArIGI6c3RhdGUKCXdoZXJlCgkJYSA9IHVuaGV4RGlnaXQgeAoJCWIgPSB1bmhleERpZ2l0IHkKCnVuaGV4SW1wbCBieXRlcyBzdGF0ZSA9IE5vdGhpbmcKCnVuaGV4IDo6IEIuQnl0ZVN0cmluZyAtPiBNYXliZSBCLkJ5dGVTdHJpbmcKdW5oZXggYnl0ZXMgPSBmbWFwIEIucGFjayAkIHVuaGV4SW1wbCAoQi51bnBhY2sgYnl0ZXMpIChKdXN0IFtdKQoKaW5wdXQgOjogQi5CeXRlU3RyaW5nCmlucHV0ID0gIjQ5Mjc2ZDIwNmI2OTZjNmM2OTZlNjcyMDc5NmY3NTcyMjA2MjcyNjE2OTZlMjA2YzY5NmI2NTIwNjEyMDcwNmY2OTczNmY2ZTZmNzU3MzIwNmQ3NTczNjg3MjZmNmY2ZCIKCm1haW4gOjogSU8gKCkKbWFpbiA9IEMucHV0U3RyTG4gJCBmcm9tTWF5YmUgImludmFsaWQgaW5wdXQiICQgdW5oZXggaW5wdXQ=