aboutsummaryrefslogtreecommitdiffstats
path: root/day08/main.hs
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2021-12-09 13:27:55 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2021-12-09 21:03:58 +0200
commit48f9acaff1fbea7537edbeb91ce4d35e40314a43 (patch)
tree09c1fed6576a3094f5289a860b451d92d7b524b4 /day08/main.hs
parent6d6b2f27a0bef3a592be29dbb87d2f18c2f0c145 (diff)
Day 08
Diffstat (limited to 'day08/main.hs')
-rw-r--r--day08/main.hs74
1 files changed, 74 insertions, 0 deletions
diff --git a/day08/main.hs b/day08/main.hs
new file mode 100644
index 0000000..cff7299
--- /dev/null
+++ b/day08/main.hs
@@ -0,0 +1,74 @@
+module Main where
+
+import Data.List (find, permutations, sort)
+import Data.Map (Map, (!))
+import qualified Data.Map as Map
+import Data.Maybe (fromJust, isJust)
+import Data.Text (intercalate, pack, replace, split, unpack)
+import Utils
+
+processLine =
+ pack
+ .> replace (pack " | ") (pack " ")
+ .> unpack
+ .> words
+ .> (\lst -> (slice 0 9 lst, slice 10 13 lst))
+
+e1 :: [([String], [String])] -> Int
+e1 input =
+ let outputs = map snd input
+ outputsFlat = concat outputs
+ easyOutputs = filter (\s -> length s `elem` [2, 4, 3, 7]) outputsFlat
+ in length easyOutputs
+
+symbols = "abcdefg"
+
+allSolutions :: [Map Char Char]
+allSolutions = permutations symbols $> map (zip symbols) .> map Map.fromList
+
+segmentsToDigit :: [Char] -> Maybe Char
+segmentsToDigit "abcefg" = Just '0'
+segmentsToDigit "cf" = Just '1'
+segmentsToDigit "acdeg" = Just '2'
+segmentsToDigit "acdfg" = Just '3'
+segmentsToDigit "bcdf" = Just '4'
+segmentsToDigit "abdfg" = Just '5'
+segmentsToDigit "abdefg" = Just '6'
+segmentsToDigit "acf" = Just '7'
+segmentsToDigit "abcdefg" = Just '8'
+segmentsToDigit "abcdfg" = Just '9'
+segmentsToDigit other = Nothing
+
+toSegments :: Map Char Char -> [Char] -> [Char]
+toSegments hmap signal = signal $> map (hmap !)
+
+isSignalValidDigit :: Map Char Char -> [Char] -> Bool
+isSignalValidDigit hmap signal =
+ let segs = toSegments hmap signal $> sort
+ in segmentsToDigit segs $> isJust
+
+isValid :: Map Char Char -> [String] -> Bool
+isValid hmap = all (isSignalValidDigit hmap)
+
+processRow :: ([String], [String]) -> Int
+processRow row =
+ let signals = fst row
+ outputs = snd row
+ solutionM = find (`isValid` signals) allSolutions
+ solution = fromJust solutionM
+ outputDigits = outputs $> map (toSegments solution .> sort .> segmentsToDigit .> fromJust)
+ in read outputDigits
+
+e2 rows =
+ let outputNums = map processRow rows
+ in sum outputNums
+
+main :: IO ()
+main =
+ do
+ contents <- getContents
+
+ let input = contents $> lines .> map processLine
+
+ e1 input $> print
+ e2 input $> print