Copyright | (c) Eric Mertens 2021 |
---|---|
License | ISC |
Maintainer | emertens@gmail.com |
Safe Haskell | None |
Language | Haskell2010 |
https://adventofcode.com/2021/day/16
Decode an expression from a bit stream.
This solution uses the ReadP parser combinator module.
Since ReadP only operates on String
parsing bits is
simulated by parsing strings of the characters '0'
and '1'
.
ReadP's gather
operation is useful for computing
the bit size of a packet which comes up in some of the
operator packets.
Examples
>>>
vers <$> parse (decodeHex "8A004A801A8002F478")
Just 16
>>>
vers <$> parse (decodeHex "620080001611562C8802118E34")
Just 12
>>>
vers <$> parse (decodeHex "C0015000016115A2E0802F182340")
Just 23
>>>
vers <$> parse (decodeHex "A0016C880162017C3686B18A3D4780")
Just 31
>>>
eval <$> parse (decodeHex "C200B40A82")
Just 3
>>>
eval <$> parse (decodeHex "04005AC33890")
Just 54
>>>
eval <$> parse (decodeHex "880086C3E88112")
Just 7
>>>
eval <$> parse (decodeHex "CE00C43D881120")
Just 9
>>>
eval <$> parse (decodeHex "D8005AC2A8F0")
Just 1
>>>
eval <$> parse (decodeHex "F600BC2D8F")
Just 0
>>>
eval <$> parse (decodeHex "9C005AC2F8F0")
Just 0
>>>
eval <$> parse (decodeHex "9C0141080250320F1802104A08")
Just 1