Browse Source

Ugly day 6 solution

main
Jens Kadenbach 1 year ago
parent
commit
3209fa9493
5 changed files with 78 additions and 0 deletions
  1. 2
    0
      aoc2022.cabal
  2. 1
    0
      ressources/day06-input
  3. 37
    0
      src/Day6.hs
  4. 3
    0
      src/Lib.hs
  5. 35
    0
      test/Day6Spec.hs

+ 2
- 0
aoc2022.cabal View File

@@ -43,6 +43,7 @@ library
43 43
       Day5.Part1
44 44
       Day5.Part2
45 45
       Day5.Shared
46
+      Day6
46 47
       Lib
47 48
   other-modules:
48 49
       Paths_aoc2022
@@ -88,6 +89,7 @@ test-suite aoc2022-test
88 89
       Day3Spec
89 90
       Day4Spec
90 91
       Day5Spec
92
+      Day6Spec
91 93
       Paths_aoc2022
92 94
   hs-source-dirs:
93 95
       test

+ 1
- 0
ressources/day06-input View File

@@ -0,0 +1 @@
1
+lrgrvgvttzmtmtgglmgmccpclppvdvtvvllvggvrggbwwlzlmzzbppnvpnvppcjjzhjhthnhjnhhhndhnnnsbnnhzzvhhplplzlrzzgpzpwzpwwsvsjvjfvvphpspwswrswscwscwsscffspsbbjjcjwjrwwtgwwgswswwzbzddqnnpqnpnqppwzwszsnsjjpddhvvcbbhhpzzlpzlzppfpvvmcmvvflfttrltrlldlglbgblltqtffrtrwrzwwzmzwmwwlzzhttwzzwnnmrrcdrdjrjqjvqvvjzzgccrllhmhzzfnfwwtzwzwpwhhdjhhmzzbbvggzdzccbzbbpcpqccjbcbppsttdjdnjnppjjnmmszmzgzddtctvctcvttgtbbzqqggnmmdllvdvmvzzhfffzvfvtfvtvwwcnwnvwwbccggjcjqcqcbcrrppdqppdzpzqppttjhjdjqjppzgzjjpllwrrbttrvvzzbhzzqppndppwqppnrpnnttfwttsrrgprggmtmhmzhzczwzmwzwrwqwrrrdqrrvssnlngnppfqqgbgjjcttbgtbtmtctmcmcmgmsgsffhghqhbbvtbbtltmltlnlpnngcnggbngbnnzgzccgcpgcpcjppnnzjzdjdggzjzljjhnncgcjcscfctcvttvqtqmqjjsqjqpqfqhqmmlvvmppfrfjjngnnfllrlhhppcjcbjcctgcgtcgcvgvffqfcfpcpdpffrbrvbvnnphpqpfqqtnttmtgtlgtgzttnvvpwvwvcwcfwcwmccwlclqlflpflplwpllndlltlqtlqqmqnqmnqnvqvrrtddqndnrdnnpzprrqnnggvqvhvpvptvvvzwzrwwscsqqmcmttbgtgpptzptzzvszvzdvvtsscbbrpptssltssztszttlvlqljlgljlhhwvhwvvqhvqhqrhqqcnqccnbcbppbffzqfqsfspsqsjjrhjjchcmhmnhmmzjmjmfjmmsbsvvgcggtdgghchrrpnnrttnthtdtmmhmdmppmgpgllrwlrwlwvvlmlglppzttsvsbsnbncnjnffddzcddbzzbzgbghhhtltwtggljjggsdswwpmmfhfsfvfrrgmrgrfggvzzbnbttwqqdcdppqcqpcpqpjqpjpbbgjbgjjfwfwpfpgpzgzmzgzdzzpwzwqqjqfqllgrgjjfvvqnvncntngnhgnhgnnzvvbsbmbqmqwmqwwhbwhhsccvhcclncnqccnvnzvvdgvgnvnttmbbhccwgwttlwtwqttqcqmcqcdcmmjpmmjsjhhprrnnqddjwdjjvvhvgvssthhnfhnnntfthhtggthhbrbrjbbjfbjjrgrsrjrqqqfwflfclflnnnnvggfqgqzzbbvttfcfvcvsswvssnzndndvnvqqznnrjnnsmmptmppncpchcctwtbbgbqqjqtqsqfsfvfvnvmvzzpgzppdzdvdqdjdnjnttvvjbbzrzqrqwrqrbqrqsqpspjssnqnpqqnjndjjzmmvbbrqrccrffhwhggbttpnpphwhhmrrndrnddzqzzfbfwbwnwtwjjwjmjsjcjgcjjfcftcffvpvwwbffgzgnnlfffnddtdbdlbbcjbjmmfpfzfbbwbdwwfmfpmmfjfffvzvdvvhrvrcvcscjjpfjjnfnzzrtrpphtppzrppwhhphthltlllttghgwwvlwlflhldlzzmbzzjppnwppvlplqqbtbwwccswccqzzjhjbbhbnhnshnsslmmlqqjfjrjjmvvhpjqhzqffhsdsbwpjvgpvmbfqltrmpnwfcptpfmtjcpbzfldbhcmzchshrlbjgggrfjcqhzqqvbzsczmbgqmzqmltlrtlbnsfvmlhbbcqbbltjpdrpznrglshvgdnqwlhthghvtbffddcjwgdzfswzbppjtdhstcqqmvzmjrvfjbhmrznwqczdjjclnhbmtdvvzwttwnrlfqwpglpcppdwdcvfqpqfnmbvzvmqlmnlgnrsqdjvtsftgnlrtzsrcqhltmhzhpmzqqfqrjwhqfnqdtnshwgfhcpjrlplnqczdlntnhsczrgfhflsfbmftsbptflqbpwblrfnfzvqtpblftmscpzgdhhsbdbjhqclnptwtmhbbfglmvwnbqgvqhmmswwjpfwqjbvznmcpdzcvbzjmfqnwstvvtdnlvnpznnblfqzjjrjgnsbtmmbjzsvmgwddtnzcvhvtdrmjgtcrjzznrssscrzcfbfpgpnpppsqcqpccnbdjnwrbvhrcwgqncjrzbdhzqpfhqbnvbfrzmlfbfvtpggrtdswnvlsvpjsmfchhpbbszbnqqfrmhpqzdjhmhmnnmplbtrpgphvvqdfbcfnrfrbfbtshlmlfltjnbmggqntvhdnlvtcvlhmlrlfzfrqmlwqzrdghvdvtsqvmpdjrjclmlmgjqwzzldnzvfmwmrrnfghsvpcwjdtlnrhpjczwpgfbhpnmcbpthsndfflbjhnlwdbbmlttfqcmswvppslptgzbvfgppvpnhjccrpgrpwtngmmccjghhcwddmnglschnpjwqtrtsvggnpzvsqshfvcnhptphtlmqmpznfzwvbnhwpsfwvpflsdjcjgfzjprbbfzgdbmrjgwrgfdphghrhnpvfncrdzcwtthmqtdwlhjsdthqpzhbjpgggndtrmwvcsqhzrzwbhtqsqthvqncprvnpsrlpvlvcjrcflhbdhrfthlfnqbzbmvlvhmbjnbbjhpjwlfflfhpfwcwnnsljthvzwprqjmgpldlzjnjtjfjrgnrpzpvzfcsrprbjhwnmccwhppjrlnndjdjzqwpcwnvqwgmnwbrjqqvbplvsncnmdfrbhrrhghfllhrghzmlnltgdsqlgbvnlchgcbqlpqptdwmsjpqrprlhqmstzjfnzgbgvlfshwpcrgzcqmmfwvhwlsdvplmdgrtfrjwpfvhnjqdbwsfcqhchstlzfpdljgvcqsfcnqccnpmvsqbmwjtzwhpglhbjwzmvgqwjhvwfhnlbtsgljzmlldcpjwdcfppmnmphdmhpmdqwwtjtrdhlrjlvzgpbcgvwcmtclgpqwhtpbdtdbdscfzbrzmgjlbppcnvphphfnvzdzzlvfsvsgbgqcnlqwmtcrpwzcvnmnvtmcdsstvqpqzdpvtdsbvtwhdvgzqmzvwlspgbwmlnsrqdqnjwrllncflqsrzdqtjqvpnpjlqfwqtlqfqwlltszcwtpmjtldjgvmvptpmzqhwmlvjgnntpvcslmhlhdbjtjjnvsbnzwtdclwbzrvlqzjljtbdjvwgbwcltvnbhfvtgqrbmzbbfvldhmdvfvtlqglnblfmmpjqmzlnfjltsqdrgmlhbhngrrmhnjndggsdcfmtssmmtmzvhzrmwjsqjcvbsgqgtvdmvqlvlrvglrtlshfdmfrmljjggwjbcsztsjmjftcbbjwrmgqvssrvtgzcgthtlgsjspfmdgwptjdrbswqlpfsbtjlnhllmjpbfhgpfcprpdnqqvqdmcbqhbcqtstvnjdzwzwvhhwmcvcfbdwczpwpdhvnstjnbblbprzsccmwrzgfhmrpvzfztvsrtncdhzhptpfqtnqwvqtwdpvcqztgjgrcbdnvqftphtfbtqdhrffdrdmwsbpvhshzvjbvsrljnzddmmfgcnfdssvzdbsfwmfjsdnslbrqsqfwfqbqszjwvgcjbhrfjcnlfhzvhcbbbpmhhvjdtgrqlcchqtvnhlrgtssllvgcdjrlzlzfbrrrvwvvcgfjdlpscsqljmmwmvwnvrgdmgcbvmwmgprbfrbgptlfjbhrmczwrzwbdhdvtgvldnzfgcngdfhbgqsfzlrbwbvdflrrsrcwthjzvgmdtndgtsjtswfbdqvcjtsdvrvqpmmdlghsdbzplgpfnstplpjdvttgzmnhssftqcqjvdvvdrmltbrpsjvqwbljrqrtqldzbwzznsdstvmdzbrvvtgrrphmbrzwnjbmqvfhljcdlbzqtcbjsfqdqcr

+ 37
- 0
src/Day6.hs View File

@@ -0,0 +1,37 @@
1
+module Day6 (
2
+  findMarker,
3
+  findMarker',
4
+  findStart,
5
+  isUnique,
6
+  day6
7
+) where
8
+
9
+findMarker :: String -> Maybe Int
10
+findMarker = findMarker' 4 0 ""
11
+
12
+findStart :: String -> Maybe Int
13
+findStart = findMarker' 14 0 ""
14
+
15
+findMarker' :: Int -> Int -> String -> String -> Maybe Int
16
+findMarker' windowSize offset window  []
17
+  | isUnique window && length window == windowSize = Just offset
18
+  | otherwise = Nothing
19
+findMarker' windowSize offset window (c:cs)
20
+  | length window < windowSize = findMarker' windowSize (offset + 1) (c:window) cs
21
+  | not (isUnique window) = findMarker' windowSize (offset + 1) (c:init window) cs
22
+  | isUnique window = Just offset
23
+  | otherwise = Nothing
24
+
25
+
26
+isUnique :: (Eq a) => [a] -> Bool
27
+isUnique [] = True
28
+isUnique (c:cs) = c `notElem` cs && isUnique cs
29
+
30
+day6 :: IO ()
31
+day6 = do
32
+   input <- readFile "ressources/day06-input"
33
+   putStrLn "Day6"
34
+   let offset = findMarker input
35
+   putStrLn ("Found end marker at " ++ show offset)
36
+   let startOffset = findStart input
37
+   putStrLn ("Found start marker at " ++ show startOffset)

+ 3
- 0
src/Lib.hs View File

@@ -7,6 +7,7 @@ import Day2
7 7
 import Day3
8 8
 import Day4
9 9
 import Day5
10
+import Day6
10 11
 
11 12
 someFunc :: IO ()
12 13
 someFunc = do
@@ -19,5 +20,7 @@ someFunc = do
19 20
   day4
20 21
   putStrLn "-----------"
21 22
   day5
23
+  putStrLn "-----------"
24
+  day6
22 25
   
23 26
 

+ 35
- 0
test/Day6Spec.hs View File

@@ -0,0 +1,35 @@
1
+module Day6Spec (spec) where
2
+
3
+import Test.Hspec
4
+import Day6
5
+
6
+spec :: Spec
7
+spec =
8
+  describe "Day6" $ do
9
+    describe "Part1" $ do
10
+      it "finds unique lists" $ do
11
+        isUnique "abc" `shouldBe` True
12
+        isUnique "abca" `shouldBe` False
13
+        isUnique "cabc" `shouldBe` False
14
+      it "finds the marker in the next iteration" $ do
15
+        findMarker' 4 3 "abc" "d" `shouldBe` Just 4
16
+        findMarker' 4 4 "bcd" "e" `shouldBe` Just 5
17
+      it "finds nothing if nothing is there" $ do
18
+        findMarker "abcb" `shouldBe` Nothing
19
+        findMarker "abcabcb" `shouldBe` Nothing
20
+      it "finds the marker in the beginning" $ do
21
+        findMarker "abcd" `shouldBe` Just 4
22
+        findMarker "aabcd" `shouldBe` Just 5
23
+      it "finds a marker" $ do
24
+        findMarker "mjqjpqmgbljsphdztnvjfqwrcgsmlb"`shouldBe` Just 7
25
+        findMarker "bvwbjplbgvbhsrlpgdmjqwftvncz" `shouldBe` Just 5
26
+        findMarker "nppdvjthqldpwncqszvftbrmjlhg" `shouldBe` Just 6
27
+        findMarker "nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg" `shouldBe` Just 10
28
+        findMarker "zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw" `shouldBe` Just 11
29
+    describe "Part 2" $ do
30
+      it "finds start of message marker" $ do
31
+        findStart "mjqjpqmgbljsphdztnvjfqwrcgsmlb"`shouldBe` Just 19
32
+        findStart "bvwbjplbgvbhsrlpgdmjqwftvncz" `shouldBe` Just 23
33
+        findStart "nppdvjthqldpwncqszvftbrmjlhg" `shouldBe` Just 23
34
+        findStart "nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg" `shouldBe` Just 29
35
+        findStart "zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw" `shouldBe` Just 26

Loading…
Cancel
Save