From 3209fa949305d9fd8f8a6a0b3326b84c04158864 Mon Sep 17 00:00:00 2001 From: Jens Kadenbach Date: Tue, 6 Dec 2022 10:54:58 +0100 Subject: [PATCH] Ugly day 6 solution --- aoc2022.cabal | 2 ++ ressources/day06-input | 1 + src/Day6.hs | 37 +++++++++++++++++++++++++++++++++++++ src/Lib.hs | 3 +++ test/Day6Spec.hs | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 78 insertions(+) create mode 100644 ressources/day06-input create mode 100644 src/Day6.hs create mode 100644 test/Day6Spec.hs diff --git a/aoc2022.cabal b/aoc2022.cabal index cf122c0..59ef8cc 100644 --- a/aoc2022.cabal +++ b/aoc2022.cabal @@ -43,6 +43,7 @@ library Day5.Part1 Day5.Part2 Day5.Shared + Day6 Lib other-modules: Paths_aoc2022 @@ -88,6 +89,7 @@ test-suite aoc2022-test Day3Spec Day4Spec Day5Spec + Day6Spec Paths_aoc2022 hs-source-dirs: test diff --git a/ressources/day06-input b/ressources/day06-input new file mode 100644 index 0000000..dc46669 --- /dev/null +++ b/ressources/day06-input @@ -0,0 +1 @@ +lrgrvgvttzmtmtgglmgmccpclppvdvtvvllvggvrggbwwlzlmzzbppnvpnvppcjjzhjhthnhjnhhhndhnnnsbnnhzzvhhplplzlrzzgpzpwzpwwsvsjvjfvvphpspwswrswscwscwsscffspsbbjjcjwjrwwtgwwgswswwzbzddqnnpqnpnqppwzwszsnsjjpddhvvcbbhhpzzlpzlzppfpvvmcmvvflfttrltrlldlglbgblltqtffrtrwrzwwzmzwmwwlzzhttwzzwnnmrrcdrdjrjqjvqvvjzzgccrllhmhzzfnfwwtzwzwpwhhdjhhmzzbbvggzdzccbzbbpcpqccjbcbppsttdjdnjnppjjnmmszmzgzddtctvctcvttgtbbzqqggnmmdllvdvmvzzhfffzvfvtfvtvwwcnwnvwwbccggjcjqcqcbcrrppdqppdzpzqppttjhjdjqjppzgzjjpllwrrbttrvvzzbhzzqppndppwqppnrpnnttfwttsrrgprggmtmhmzhzczwzmwzwrwqwrrrdqrrvssnlngnppfqqgbgjjcttbgtbtmtctmcmcmgmsgsffhghqhbbvtbbtltmltlnlpnngcnggbngbnnzgzccgcpgcpcjppnnzjzdjdggzjzljjhnncgcjcscfctcvttvqtqmqjjsqjqpqfqhqmmlvvmppfrfjjngnnfllrlhhppcjcbjcctgcgtcgcvgvffqfcfpcpdpffrbrvbvnnphpqpfqqtnttmtgtlgtgzttnvvpwvwvcwcfwcwmccwlclqlflpflplwpllndlltlqtlqqmqnqmnqnvqvrrtddqndnrdnnpzprrqnnggvqvhvpvptvvvzwzrwwscsqqmcmttbgtgpptzptzzvszvzdvvtsscbbrpptssltssztszttlvlqljlgljlhhwvhwvvqhvqhqrhqqcnqccnbcbppbffzqfqsfspsqsjjrhjjchcmhmnhmmzjmjmfjmmsbsvvgcggtdgghchrrpnnrttnthtdtmmhmdmppmgpgllrwlrwlwvvlmlglppzttsvsbsnbncnjnffddzcddbzzbzgbghhhtltwtggljjggsdswwpmmfhfsfvfrrgmrgrfggvzzbnbttwqqdcdppqcqpcpqpjqpjpbbgjbgjjfwfwpfpgpzgzmzgzdzzpwzwqqjqfqllgrgjjfvvqnvncntngnhgnhgnnzvvbsbmbqmqwmqwwhbwhhsccvhcclncnqccnvnzvvdgvgnvnttmbbhccwgwttlwtwqttqcqmcqcdcmmjpmmjsjhhprrnnqddjwdjjvvhvgvssthhnfhnnntfthhtggthhbrbrjbbjfbjjrgrsrjrqqqfwflfclflnnnnvggfqgqzzbbvttfcfvcvsswvssnzndndvnvqqznnrjnnsmmptmppncpchcctwtbbgbqqjqtqsqfsfvfvnvmvzzpgzppdzdvdqdjdnjnttvvjbbzrzqrqwrqrbqrqsqpspjssnqnpqqnjndjjzmmvbbrqrccrffhwhggbttpnpphwhhmrrndrnddzqzzfbfwbwnwtwjjwjmjsjcjgcjjfcftcffvpvwwbffgzgnnlfffnddtdbdlbbcjbjmmfpfzfbbwbdwwfmfpmmfjfffvzvdvvhrvrcvcscjjpfjjnfnzzrtrpphtppzrppwhhphthltlllttghgwwvlwlflhldlzzmbzzjppnwppvlplqqbtbwwccswccqzzjhjbbhbnhnshnsslmmlqqjfjrjjmvvhpjqhzqffhsdsbwpjvgpvmbfqltrmpnwfcptpfmtjcpbzfldbhcmzchshrlbjgggrfjcqhzqqvbzsczmbgqmzqmltlrtlbnsfvmlhbbcqbbltjpdrpznrglshvgdnqwlhthghvtbffddcjwgdzfswzbppjtdhstcqqmvzmjrvfjbhmrznwqczdjjclnhbmtdvvzwttwnrlfqwpglpcppdwdcvfqpqfnmbvzvmqlmnlgnrsqdjvtsftgnlrtzsrcqhltmhzhpmzqqfqrjwhqfnqdtnshwgfhcpjrlplnqczdlntnhsczrgfhflsfbmftsbptflqbpwblrfnfzvqtpblftmscpzgdhhsbdbjhqclnptwtmhbbfglmvwnbqgvqhmmswwjpfwqjbvznmcpdzcvbzjmfqnwstvvtdnlvnpznnblfqzjjrjgnsbtmmbjzsvmgwddtnzcvhvtdrmjgtcrjzznrssscrzcfbfpgpnpppsqcqpccnbdjnwrbvhrcwgqncjrzbdhzqpfhqbnvbfrzmlfbfvtpggrtdswnvlsvpjsmfchhpbbszbnqqfrmhpqzdjhmhmnnmplbtrpgphvvqdfbcfnrfrbfbtshlmlfltjnbmggqntvhdnlvtcvlhmlrlfzfrqmlwqzrdghvdvtsqvmpdjrjclmlmgjqwzzldnzvfmwmrrnfghsvpcwjdtlnrhpjczwpgfbhpnmcbpthsndfflbjhnlwdbbmlttfqcmswvppslptgzbvfgppvpnhjccrpgrpwtngmmccjghhcwddmnglschnpjwqtrtsvggnpzvsqshfvcnhptphtlmqmpznfzwvbnhwpsfwvpflsdjcjgfzjprbbfzgdbmrjgwrgfdphghrhnpvfncrdzcwtthmqtdwlhjsdthqpzhbjpgggndtrmwvcsqhzrzwbhtqsqthvqncprvnpsrlpvlvcjrcflhbdhrfthlfnqbzbmvlvhmbjnbbjhpjwlfflfhpfwcwnnsljthvzwprqjmgpldlzjnjtjfjrgnrpzpvzfcsrprbjhwnmccwhppjrlnndjdjzqwpcwnvqwgmnwbrjqqvbplvsncnmdfrbhrrhghfllhrghzmlnltgdsqlgbvnlchgcbqlpqptdwmsjpqrprlhqmstzjfnzgbgvlfshwpcrgzcqmmfwvhwlsdvplmdgrtfrjwpfvhnjqdbwsfcqhchstlzfpdljgvcqsfcnqccnpmvsqbmwjtzwhpglhbjwzmvgqwjhvwfhnlbtsgljzmlldcpjwdcfppmnmphdmhpmdqwwtjtrdhlrjlvzgpbcgvwcmtclgpqwhtpbdtdbdscfzbrzmgjlbppcnvphphfnvzdzzlvfsvsgbgqcnlqwmtcrpwzcvnmnvtmcdsstvqpqzdpvtdsbvtwhdvgzqmzvwlspgbwmlnsrqdqnjwrllncflqsrzdqtjqvpnpjlqfwqtlqfqwlltszcwtpmjtldjgvmvptpmzqhwmlvjgnntpvcslmhlhdbjtjjnvsbnzwtdclwbzrvlqzjljtbdjvwgbwcltvnbhfvtgqrbmzbbfvldhmdvfvtlqglnblfmmpjqmzlnfjltsqdrgmlhbhngrrmhnjndggsdcfmtssmmtmzvhzrmwjsqjcvbsgqgtvdmvqlvlrvglrtlshfdmfrmljjggwjbcsztsjmjftcbbjwrmgqvssrvtgzcgthtlgsjspfmdgwptjdrbswqlpfsbtjlnhllmjpbfhgpfcprpdnqqvqdmcbqhbcqtstvnjdzwzwvhhwmcvcfbdwczpwpdhvnstjnbblbprzsccmwrzgfhmrpvzfztvsrtncdhzhptpfqtnqwvqtwdpvcqztgjgrcbdnvqftphtfbtqdhrffdrdmwsbpvhshzvjbvsrljnzddmmfgcnfdssvzdbsfwmfjsdnslbrqsqfwfqbqszjwvgcjbhrfjcnlfhzvhcbbbpmhhvjdtgrqlcchqtvnhlrgtssllvgcdjrlzlzfbrrrvwvvcgfjdlpscsqljmmwmvwnvrgdmgcbvmwmgprbfrbgptlfjbhrmczwrzwbdhdvtgvldnzfgcngdfhbgqsfzlrbwbvdflrrsrcwthjzvgmdtndgtsjtswfbdqvcjtsdvrvqpmmdlghsdbzplgpfnstplpjdvttgzmnhssftqcqjvdvvdrmltbrpsjvqwbljrqrtqldzbwzznsdstvmdzbrvvtgrrphmbrzwnjbmqvfhljcdlbzqtcbjsfqdqcr diff --git a/src/Day6.hs b/src/Day6.hs new file mode 100644 index 0000000..532a93b --- /dev/null +++ b/src/Day6.hs @@ -0,0 +1,37 @@ +module Day6 ( + findMarker, + findMarker', + findStart, + isUnique, + day6 +) where + +findMarker :: String -> Maybe Int +findMarker = findMarker' 4 0 "" + +findStart :: String -> Maybe Int +findStart = findMarker' 14 0 "" + +findMarker' :: Int -> Int -> String -> String -> Maybe Int +findMarker' windowSize offset window [] + | isUnique window && length window == windowSize = Just offset + | otherwise = Nothing +findMarker' windowSize offset window (c:cs) + | length window < windowSize = findMarker' windowSize (offset + 1) (c:window) cs + | not (isUnique window) = findMarker' windowSize (offset + 1) (c:init window) cs + | isUnique window = Just offset + | otherwise = Nothing + + +isUnique :: (Eq a) => [a] -> Bool +isUnique [] = True +isUnique (c:cs) = c `notElem` cs && isUnique cs + +day6 :: IO () +day6 = do + input <- readFile "ressources/day06-input" + putStrLn "Day6" + let offset = findMarker input + putStrLn ("Found end marker at " ++ show offset) + let startOffset = findStart input + putStrLn ("Found start marker at " ++ show startOffset) diff --git a/src/Lib.hs b/src/Lib.hs index 354a2f8..5cd6ee7 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -7,6 +7,7 @@ import Day2 import Day3 import Day4 import Day5 +import Day6 someFunc :: IO () someFunc = do @@ -19,5 +20,7 @@ someFunc = do day4 putStrLn "-----------" day5 + putStrLn "-----------" + day6 diff --git a/test/Day6Spec.hs b/test/Day6Spec.hs new file mode 100644 index 0000000..cfcda00 --- /dev/null +++ b/test/Day6Spec.hs @@ -0,0 +1,35 @@ +module Day6Spec (spec) where + +import Test.Hspec +import Day6 + +spec :: Spec +spec = + describe "Day6" $ do + describe "Part1" $ do + it "finds unique lists" $ do + isUnique "abc" `shouldBe` True + isUnique "abca" `shouldBe` False + isUnique "cabc" `shouldBe` False + it "finds the marker in the next iteration" $ do + findMarker' 4 3 "abc" "d" `shouldBe` Just 4 + findMarker' 4 4 "bcd" "e" `shouldBe` Just 5 + it "finds nothing if nothing is there" $ do + findMarker "abcb" `shouldBe` Nothing + findMarker "abcabcb" `shouldBe` Nothing + it "finds the marker in the beginning" $ do + findMarker "abcd" `shouldBe` Just 4 + findMarker "aabcd" `shouldBe` Just 5 + it "finds a marker" $ do + findMarker "mjqjpqmgbljsphdztnvjfqwrcgsmlb"`shouldBe` Just 7 + findMarker "bvwbjplbgvbhsrlpgdmjqwftvncz" `shouldBe` Just 5 + findMarker "nppdvjthqldpwncqszvftbrmjlhg" `shouldBe` Just 6 + findMarker "nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg" `shouldBe` Just 10 + findMarker "zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw" `shouldBe` Just 11 + describe "Part 2" $ do + it "finds start of message marker" $ do + findStart "mjqjpqmgbljsphdztnvjfqwrcgsmlb"`shouldBe` Just 19 + findStart "bvwbjplbgvbhsrlpgdmjqwftvncz" `shouldBe` Just 23 + findStart "nppdvjthqldpwncqszvftbrmjlhg" `shouldBe` Just 23 + findStart "nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg" `shouldBe` Just 29 + findStart "zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw" `shouldBe` Just 26