From 1a0e96e2a82d8d0a7d595f37d68a67f81206d46b Mon Sep 17 00:00:00 2001 From: Felix Valentini <felixvalentini@Felixs-MBP.fritz.box> Date: Tue, 6 Dec 2022 22:43:46 +0100 Subject: [PATCH] solved part 2 of day 6 --- 6/solve.hs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/6/solve.hs b/6/solve.hs index d414bed..14656fd 100644 --- a/6/solve.hs +++ b/6/solve.hs @@ -5,6 +5,9 @@ type EnumeratedChar = (Int, Char) sample :: String sample = "mjqjpqmgbljsphdztnvjfqwrcgsmlb" +sample1 :: String +sample1 = "nppdvjthqldpwncqszvftbrmjlhg" + allDifferent :: (Eq a) => [a] -> Bool allDifferent [] = True allDifferent (x:xs) = x `notElem` xs && allDifferent xs @@ -13,23 +16,37 @@ takeLeftRight :: Int -> [a] -> ([a], [a]) takeLeftRight n = taking . splitAt n where taking (left, right) = (take 4 $ reverse left, take 4 right) +takeLeftRight' :: Int -> [a] -> ([a], [a]) +takeLeftRight' n = taking . splitAt n + where taking (left, right) = (take 14 $ reverse left, take 14 right) + checkForMarker :: [EnumeratedChar] -> Int checkForMarker l = if (length $ getString l) < 4 then 0 else if allDifferent $ getString l then fst $ head l - else 0 + else + if allDifferent $ getString $ reverse l + then fst $ head $ reverse l + else 0 evalTuple :: ([EnumeratedChar], [EnumeratedChar]) -> (Int, Int) -evalTuple (x1, x2) = (checkForMarker $ reverse x1, checkForMarker x2) -- need to reverse it back somehow +evalTuple (x1, x2) = (checkForMarker x1, checkForMarker x2) getString :: [(Int, Char)] -> String getString = snd . unzip -solve :: String -> Int -solve s = fst $ head $ filter (\(x, y) -> x > 0 && y > 0) $ map (\x -> evalTuple $ takeLeftRight x i) [1..(length s)-1] +solve1 :: String -> Int +solve1 s = fst $ head $ filter (\(x, _) -> x > 0) $ map (\x -> evalTuple $ takeLeftRight x i) [1..(length s)-1] + where i = zip [1..] s + +solve2 :: String -> Int +solve2 s = fst $ head $ filter (\(x, _) -> x > 0) $ map (\x -> evalTuple $ takeLeftRight' x i) [1..(length s)-1] where i = zip [1..] s main :: IO () -main = readFile "./input.txt" >>= print . solve . head . lines +main = do + input <- head <$> lines <$> readFile "./input.txt" + print $ solve1 input + print $ solve2 input -- GitLab