Ugly day 6 solution
This commit is contained in:
@@ -43,6 +43,7 @@ library
|
|||||||
Day5.Part1
|
Day5.Part1
|
||||||
Day5.Part2
|
Day5.Part2
|
||||||
Day5.Shared
|
Day5.Shared
|
||||||
|
Day6
|
||||||
Lib
|
Lib
|
||||||
other-modules:
|
other-modules:
|
||||||
Paths_aoc2022
|
Paths_aoc2022
|
||||||
@@ -88,6 +89,7 @@ test-suite aoc2022-test
|
|||||||
Day3Spec
|
Day3Spec
|
||||||
Day4Spec
|
Day4Spec
|
||||||
Day5Spec
|
Day5Spec
|
||||||
|
Day6Spec
|
||||||
Paths_aoc2022
|
Paths_aoc2022
|
||||||
hs-source-dirs:
|
hs-source-dirs:
|
||||||
test
|
test
|
||||||
|
|||||||
1
ressources/day06-input
Normal file
1
ressources/day06-input
Normal file
@@ -0,0 +1 @@
|
|||||||
|
lrgrvgvttzmtmtgglmgmccpclppvdvtvvllvggvrggbwwlzlmzzbppnvpnvppcjjzhjhthnhjnhhhndhnnnsbnnhzzvhhplplzlrzzgpzpwzpwwsvsjvjfvvphpspwswrswscwscwsscffspsbbjjcjwjrwwtgwwgswswwzbzddqnnpqnpnqppwzwszsnsjjpddhvvcbbhhpzzlpzlzppfpvvmcmvvflfttrltrlldlglbgblltqtffrtrwrzwwzmzwmwwlzzhttwzzwnnmrrcdrdjrjqjvqvvjzzgccrllhmhzzfnfwwtzwzwpwhhdjhhmzzbbvggzdzccbzbbpcpqccjbcbppsttdjdnjnppjjnmmszmzgzddtctvctcvttgtbbzqqggnmmdllvdvmvzzhfffzvfvtfvtvwwcnwnvwwbccggjcjqcqcbcrrppdqppdzpzqppttjhjdjqjppzgzjjpllwrrbttrvvzzbhzzqppndppwqppnrpnnttfwttsrrgprggmtmhmzhzczwzmwzwrwqwrrrdqrrvssnlngnppfqqgbgjjcttbgtbtmtctmcmcmgmsgsffhghqhbbvtbbtltmltlnlpnngcnggbngbnnzgzccgcpgcpcjppnnzjzdjdggzjzljjhnncgcjcscfctcvttvqtqmqjjsqjqpqfqhqmmlvvmppfrfjjngnnfllrlhhppcjcbjcctgcgtcgcvgvffqfcfpcpdpffrbrvbvnnphpqpfqqtnttmtgtlgtgzttnvvpwvwvcwcfwcwmccwlclqlflpflplwpllndlltlqtlqqmqnqmnqnvqvrrtddqndnrdnnpzprrqnnggvqvhvpvptvvvzwzrwwscsqqmcmttbgtgpptzptzzvszvzdvvtsscbbrpptssltssztszttlvlqljlgljlhhwvhwvvqhvqhqrhqqcnqccnbcbppbffzqfqsfspsqsjjrhjjchcmhmnhmmzjmjmfjmmsbsvvgcggtdgghchrrpnnrttnthtdtmmhmdmppmgpgllrwlrwlwvvlmlglppzttsvsbsnbncnjnffddzcddbzzbzgbghhhtltwtggljjggsdswwpmmfhfsfvfrrgmrgrfggvzzbnbttwqqdcdppqcqpcpqpjqpjpbbgjbgjjfwfwpfpgpzgzmzgzdzzpwzwqqjqfqllgrgjjfvvqnvncntngnhgnhgnnzvvbsbmbqmqwmqwwhbwhhsccvhcclncnqccnvnzvvdgvgnvnttmbbhccwgwttlwtwqttqcqmcqcdcmmjpmmjsjhhprrnnqddjwdjjvvhvgvssthhnfhnnntfthhtggthhbrbrjbbjfbjjrgrsrjrqqqfwflfclflnnnnvggfqgqzzbbvttfcfvcvsswvssnzndndvnvqqznnrjnnsmmptmppncpchcctwtbbgbqqjqtqsqfsfvfvnvmvzzpgzppdzdvdqdjdnjnttvvjbbzrzqrqwrqrbqrqsqpspjssnqnpqqnjndjjzmmvbbrqrccrffhwhggbttpnpphwhhmrrndrnddzqzzfbfwbwnwtwjjwjmjsjcjgcjjfcftcffvpvwwbffgzgnnlfffnddtdbdlbbcjbjmmfpfzfbbwbdwwfmfpmmfjfffvzvdvvhrvrcvcscjjpfjjnfnzzrtrpphtppzrppwhhphthltlllttghgwwvlwlflhldlzzmbzzjppnwppvlplqqbtbwwccswccqzzjhjbbhbnhnshnsslmmlqqjfjrjjmvvhpjqhzqffhsdsbwpjvgpvmbfqltrmpnwfcptpfmtjcpbzfldbhcmzchshrlbjgggrfjcqhzqqvbzsczmbgqmzqmltlrtlbnsfvmlhbbcqbbltjpdrpznrglshvgdnqwlhthghvtbffddcjwgdzfswzbppjtdhstcqqmvzmjrvfjbhmrznwqczdjjclnhbmtdvvzwttwnrlfqwpglpcppdwdcvfqpqfnmbvzvmqlmnlgnrsqdjvtsftgnlrtzsrcqhltmhzhpmzqqfqrjwhqfnqdtnshwgfhcpjrlplnqczdlntnhsczrgfhflsfbmftsbptflqbpwblrfnfzvqtpblftmscpzgdhhsbdbjhqclnptwtmhbbfglmvwnbqgvqhmmswwjpfwqjbvznmcpdzcvbzjmfqnwstvvtdnlvnpznnblfqzjjrjgnsbtmmbjzsvmgwddtnzcvhvtdrmjgtcrjzznrssscrzcfbfpgpnpppsqcqpccnbdjnwrbvhrcwgqncjrzbdhzqpfhqbnvbfrzmlfbfvtpggrtdswnvlsvpjsmfchhpbbszbnqqfrmhpqzdjhmhmnnmplbtrpgphvvqdfbcfnrfrbfbtshlmlfltjnbmggqntvhdnlvtcvlhmlrlfzfrqmlwqzrdghvdvtsqvmpdjrjclmlmgjqwzzldnzvfmwmrrnfghsvpcwjdtlnrhpjczwpgfbhpnmcbpthsndfflbjhnlwdbbmlttfqcmswvppslptgzbvfgppvpnhjccrpgrpwtngmmccjghhcwddmnglschnpjwqtrtsvggnpzvsqshfvcnhptphtlmqmpznfzwvbnhwpsfwvpflsdjcjgfzjprbbfzgdbmrjgwrgfdphghrhnpvfncrdzcwtthmqtdwlhjsdthqpzhbjpgggndtrmwvcsqhzrzwbhtqsqthvqncprvnpsrlpvlvcjrcflhbdhrfthlfnqbzbmvlvhmbjnbbjhpjwlfflfhpfwcwnnsljthvzwprqjmgpldlzjnjtjfjrgnrpzpvzfcsrprbjhwnmccwhppjrlnndjdjzqwpcwnvqwgmnwbrjqqvbplvsncnmdfrbhrrhghfllhrghzmlnltgdsqlgbvnlchgcbqlpqptdwmsjpqrprlhqmstzjfnzgbgvlfshwpcrgzcqmmfwvhwlsdvplmdgrtfrjwpfvhnjqdbwsfcqhchstlzfpdljgvcqsfcnqccnpmvsqbmwjtzwhpglhbjwzmvgqwjhvwfhnlbtsgljzmlldcpjwdcfppmnmphdmhpmdqwwtjtrdhlrjlvzgpbcgvwcmtclgpqwhtpbdtdbdscfzbrzmgjlbppcnvphphfnvzdzzlvfsvsgbgqcnlqwmtcrpwzcvnmnvtmcdsstvqpqzdpvtdsbvtwhdvgzqmzvwlspgbwmlnsrqdqnjwrllncflqsrzdqtjqvpnpjlqfwqtlqfqwlltszcwtpmjtldjgvmvptpmzqhwmlvjgnntpvcslmhlhdbjtjjnvsbnzwtdclwbzrvlqzjljtbdjvwgbwcltvnbhfvtgqrbmzbbfvldhmdvfvtlqglnblfmmpjqmzlnfjltsqdrgmlhbhngrrmhnjndggsdcfmtssmmtmzvhzrmwjsqjcvbsgqgtvdmvqlvlrvglrtlshfdmfrmljjggwjbcsztsjmjftcbbjwrmgqvssrvtgzcgthtlgsjspfmdgwptjdrbswqlpfsbtjlnhllmjpbfhgpfcprpdnqqvqdmcbqhbcqtstvnjdzwzwvhhwmcvcfbdwczpwpdhvnstjnbblbprzsccmwrzgfhmrpvzfztvsrtncdhzhptpfqtnqwvqtwdpvcqztgjgrcbdnvqftphtfbtqdhrffdrdmwsbpvhshzvjbvsrljnzddmmfgcnfdssvzdbsfwmfjsdnslbrqsqfwfqbqszjwvgcjbhrfjcnlfhzvhcbbbpmhhvjdtgrqlcchqtvnhlrgtssllvgcdjrlzlzfbrrrvwvvcgfjdlpscsqljmmwmvwnvrgdmgcbvmwmgprbfrbgptlfjbhrmczwrzwbdhdvtgvldnzfgcngdfhbgqsfzlrbwbvdflrrsrcwthjzvgmdtndgtsjtswfbdqvcjtsdvrvqpmmdlghsdbzplgpfnstplpjdvttgzmnhssftqcqjvdvvdrmltbrpsjvqwbljrqrtqldzbwzznsdstvmdzbrvvtgrrphmbrzwnjbmqvfhljcdlbzqtcbjsfqdqcr
|
||||||
37
src/Day6.hs
Normal file
37
src/Day6.hs
Normal file
@@ -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)
|
||||||
@@ -7,6 +7,7 @@ import Day2
|
|||||||
import Day3
|
import Day3
|
||||||
import Day4
|
import Day4
|
||||||
import Day5
|
import Day5
|
||||||
|
import Day6
|
||||||
|
|
||||||
someFunc :: IO ()
|
someFunc :: IO ()
|
||||||
someFunc = do
|
someFunc = do
|
||||||
@@ -19,5 +20,7 @@ someFunc = do
|
|||||||
day4
|
day4
|
||||||
putStrLn "-----------"
|
putStrLn "-----------"
|
||||||
day5
|
day5
|
||||||
|
putStrLn "-----------"
|
||||||
|
day6
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
35
test/Day6Spec.hs
Normal file
35
test/Day6Spec.hs
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user