X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=advent08%2FMain.hs;h=1addbe3130e4e8d05fd266108788931b6122b8a9;hb=5906e1d8d0723d8c7e3d97c3a29988723efe2f71;hp=6e5c4195adfcd92d9482fec441d4a31c62ba52e2;hpb=44f075be0a9e6b637d93d35b5cea705ca2e1b1f4;p=advent-of-code-21.git diff --git a/advent08/Main.hs b/advent08/Main.hs index 6e5c419..1addbe3 100644 --- a/advent08/Main.hs +++ b/advent08/Main.hs @@ -1,4 +1,5 @@ --- Writeup at https://work.njae.me.uk/2021/12/04/advent-of-code-2021-day-4/ +-- Writeup at https://work.njae.me.uk/2021/12/09/advent-of-code-2021-day-8/ + import Data.Text () import qualified Data.Text.IO as TIO @@ -14,12 +15,33 @@ import qualified Data.Set as S data Display = Display [String] [String] -- patterns, output deriving (Eq, Show) +data Segment = Seg1 | Seg2 | Seg3 | Seg4 | Seg5 | Seg6 | Seg7 + deriving (Eq, Ord, Show, Enum, Bounded) + type Encoding = M.Map Char Segment type DigitSegments = M.Map (S.Set Segment) Char -data Segment = Seg1 | Seg2 | Seg3 | Seg4 | Seg5 | Seg6 | Seg7 - deriving (Eq, Ord, Show, Enum, Bounded) - +-- some constants +segmentNames :: [Char] +segmentNames = "abcdefg" + +segments :: [Segment] +segments = [Seg1 .. Seg7] + +digitSegments :: DigitSegments +digitSegments = M.fromList + [ (S.fromList [Seg1, Seg2, Seg3, Seg5, Seg6, Seg7], '0') + , (S.fromList [Seg3, Seg6], '1') + , (S.fromList [Seg1, Seg3, Seg4, Seg5, Seg7], '2') + , (S.fromList [Seg1, Seg3, Seg4, Seg6, Seg7], '3') + , (S.fromList [Seg2, Seg3, Seg4, Seg6], '4') + , (S.fromList [Seg1, Seg2, Seg4, Seg6, Seg7], '5') + , (S.fromList [Seg1, Seg2, Seg4, Seg5, Seg6, Seg7], '6') + , (S.fromList [Seg1, Seg3, Seg6], '7') + , (S.fromList [Seg1, Seg2, Seg3, Seg4, Seg5, Seg6, Seg7], '8') + , (S.fromList [Seg1, Seg2, Seg3, Seg4, Seg6, Seg7], '9') + ] + main :: IO () main = @@ -46,25 +68,7 @@ decodeOneDisplay :: Display -> Int decodeOneDisplay display = findCode allocation display where allocation = allocate display -segmentNames :: [Char] -segmentNames = "abcdefg" -segments :: [Segment] -segments = [Seg1 .. Seg7] - -digitSegments :: DigitSegments -digitSegments = M.fromList - [ (S.fromList [Seg1, Seg2, Seg3, Seg5, Seg6, Seg7], '0') - , (S.fromList [Seg3, Seg6], '1') - , (S.fromList [Seg1, Seg3, Seg4, Seg5, Seg7], '2') - , (S.fromList [Seg1, Seg3, Seg4, Seg6, Seg7], '3') - , (S.fromList [Seg2, Seg3, Seg4, Seg6], '4') - , (S.fromList [Seg1, Seg2, Seg4, Seg6, Seg7], '5') - , (S.fromList [Seg1, Seg2, Seg4, Seg5, Seg6, Seg7], '6') - , (S.fromList [Seg1, Seg3, Seg6], '7') - , (S.fromList [Seg1, Seg2, Seg3, Seg4, Seg5, Seg6, Seg7], '8') - , (S.fromList [Seg1, Seg2, Seg3, Seg4, Seg6, Seg7], '9') - ] allocate :: Display -> Encoding allocate (Display examples _) = head $ validEncodings @@ -90,8 +94,6 @@ findDigits encoding codes = map (findDigit encoding) codes findCode :: Encoding -> Display -> Int findCode encoding (Display _ codes) = read $ findDigits encoding codes - - -- Parse the input file displaysP = displayP `sepBy` endOfLine