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