diff --git a/aoc2022.cabal b/aoc2022.cabal index c0cadb8..204904c 100644 --- a/aoc2022.cabal +++ b/aoc2022.cabal @@ -30,6 +30,7 @@ library Day3Lib Day4Lib Day5Lib + Day6Lib other-modules: Paths_aoc2022 hs-source-dirs: @@ -150,6 +151,28 @@ executable Day5Part2 , split default-language: Haskell2010 +executable Day6Part1 + main-is: Day6Part1.hs + hs-source-dirs: + day6 + ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N -main-is Day6Part1 + build-depends: + aoc2022 + , base >=4.7 && <5 + , split + default-language: Haskell2010 + +executable Day6Part2 + main-is: Day6Part2.hs + hs-source-dirs: + day6 + ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N -main-is Day6Part2 + build-depends: + aoc2022 + , base >=4.7 && <5 + , split + default-language: Haskell2010 + test-suite Day1-test type: exitcode-stdio-1.0 main-is: Day1.hs diff --git a/day5/Day5Part1.hs b/day5/Day5Part1.hs index d3cb656..868669d 100644 --- a/day5/Day5Part1.hs +++ b/day5/Day5Part1.hs @@ -2,9 +2,6 @@ module Day5Part1 (main) where import Day5Lib -convertToString :: Int -> String -convertToString = show - main :: IO () main = do input <- getContents diff --git a/day6/Day6Part1.hs b/day6/Day6Part1.hs new file mode 100644 index 0000000..0010b97 --- /dev/null +++ b/day6/Day6Part1.hs @@ -0,0 +1,12 @@ +module Day6Part1 (main) where + +import Day6Lib + + +convertToString :: Int -> String +convertToString = show + +main :: IO () +main = do + input <- getContents + putStrLn $ convertToString $ day6 input diff --git a/day6/Day6Part2.hs b/day6/Day6Part2.hs new file mode 100644 index 0000000..bf178eb --- /dev/null +++ b/day6/Day6Part2.hs @@ -0,0 +1,12 @@ +module Day6Part2 (main) where + +import Day6Lib + + +convertToString :: Int -> String +convertToString = show + +main :: IO () +main = do + input <- getContents + putStrLn $ convertToString $ day6' input diff --git a/day6/input b/day6/input new file mode 100644 index 0000000..648830c --- /dev/null +++ b/day6/input @@ -0,0 +1 @@ +zdrrgvvntvtzzssgcgqqbvqqzmqmrrprjjpmpwpvpqpwppfqqnvvjbjcbbrnnvwnvnqnncvvqnvqvmmdzdrzzjmmfzmztzczzjpjllgzgnzgznzpzhhvppmjjtbjbjgbjjpfphfhthpprbbzzhbzzvjjsttjwtjwjllzplzlhlqlfqfvflfvlvqvqsshccgffvzzqllpjllcqcpqcpqccbgcccvwvlldclcppcggjhhtbhbrbwbllldndhnnmnmcccvfvtftrfttlhttgltlflgflfrrftrtrgrmggbccnvccvssbmsmnsmszmmsbshbhpbhhtccnmngmnnntznttwnnmffdccrhrshhzhszslzlqqqsqhhrrvmrrhrmhrrdppshpssjhhhtzhzpzzzbrrqqhhtltgltgghlhpphmmbllczcgcrgcrcmmdjdvdssdbsshqqrprhrfrqrlldggpglplqlgqqvfqqwhqqclcwwbrbwbzzmcczqqpzpzhpzprrsbsfsgscsvsdsnntssgzsgzzdpdmmvnnnnfgngnqntnqnhqnhnrrdvrdvvhcvhcvvmffmccdndhhpghgwwdpwwsbwwwcpchcmmznnvtvfffzgffmfdmdsdrrsjjblbglgrrnllzrlrnnrzztnnnqlnlhnllnflllvjjdpdnngfnnlzlrzllrnlnznszzhhvggbqqcmqqvhqhhzfznnhthlhfllqwwghwgwnnnrcchffqnqjjmhjmjsjrjjrwjrrhbhfbhffprprhrddscddbbrzrvrcclttppvrvrlrplpffdwffwrwvvmssgjjbttpgpfplffgfwfnnmhhwghhpfptprtrzzwlwnwmwzzbmbrrdjrjzjpzpggftffglgzzdgzgbbzwzrrdzdhdbhhfppvrvrrrshrrzwwhjwwtjjhbhgbbhjhmmcvvchcfczfcffgttzbzssdqqjwjbbhthgthghthghmhlmmjwmwccfftnnddlffntnhtnhhnnldlhlthhqvhqvhhcgclcmmcnnwnqqzgzczccftfzfrrnhnjhhnlljdjhjghhchvchvchcphpnnnznhnjjlmjlmlbmmsbmbnnmqmvmhhcrcvvqffjpjzpjzjnnhsnhsslqlqvqzzmffdtfdffjrfjrjcjzjnjfjdfjfvjvddtntcttcwcqwqlqjqlqrrzccsgsgffwddrldrrhlllgppghphddqttdwtwnwlnlccmwwfnngvnvddwvwttjjsgghcchjjnvnccjljcljcljjjrttdstsmsggdbdbnddqpddbqqpbpdpgdpdnpnbnffcfrfrfhfcfgcfgcffvjvccgscshhvthvthtbhtbbmppjjrjqrjqjmjzjjjvffmbbfppndngnrnsnnmbbcmcddfzdfzdffqssfwsfwwpzpfpmpqpjqjwqqzwqwvvsddvrrdsrszrrrjqrjjqtqftthhmpmhpmhphggjsggjpppmhmzzdllcscpsswsqqjsqsvvlffmwgtmbthswfqqppsdflzhmdbcnzgdrlzccsdtptgmhfhwtbwqdhptvsvgdfdsmvsrtjjthchmbrjpmrwhgrdllphnfhrfdlgqmbrtdwcmcbphrzthflcswnhqmfhwprbgczbmsmjvbwjftgfqhbhqgzsvcpplzgctzggfljbmhsmwcwltllqgqtvhlbnpzpccbsbhpvhttdjvcnbqhlccdcclwfvcqnttlzzhqpltnnzzlnwtgppwfvmjhtmlzbzdrgbpbbmwlczdwmfhsvpnhpcqwzlnzslncdcqblvlpqfzhhszzrssvhglsllbbmjngfjlpjjvjbzbrlrmwfvzbgtzvcrshtsswhjrjvtwwbrqvtqnndndthfgfcnprpwwtffcvmllngsftrnwnjmwfljjtwnqqmphdlctvdpnsmbrhmljzmfvhcpblmwjjgqvslgslpbjzqzgzpwgssljztmztbwbqlfwrwgvwrjzvpvncqpdspgpzsjnvcrtzpnspvmnvssbgmsbpdsmcvjmtczczzsjcqcfhvcmsbsjfsssvzpvrtmmgptpcsrjslgvclflhjdpwtsmrgjjcftjmjrzrpwqlqvrqjpflbgrfhswbpcnvrrwpzqtzmqjspqqpwlcwgwgclpnwhhrrmzvvnjrjgjfqftlwjrggjgsdfvqhghmshczbbcvrmsgfdqhhmpfzqtbqwsmwfnwfwndjtlntzbbhlzlhrlzgljlmlbcwcdzbctlbqjmfpdwfcfnrbztvlwjhgmfvjcclcrwwwwvqshnfthtcccnswnfzlznlfcmcfrrsjqfvrwjvtbrwggzmdglcbzfdflrdqsjhzcjpghdmwhzrshnqqtsrccbhnlqcsclwmnvjpfqjszwrqnvbgmcdsvhntqmmnrdpbtpqwvhztmtjfvdplgzhhgsrnbwggnwzbtzwcsbrftzhvwtrwvcqrbcnqnrcmbmsvlcfbmzfcvqpwsmmfdgssnhghwjlsslmgnrqgpmbhpqzfnvztsjzjqgrzbbdpvtprwdzdszlhpcgwvdfvhtbtpfjnqnpzwplrwnfdpdclwgnrjlzzshhcchswtzrcmrfpgwjvttqfbbsdnctrtnmwqsmnfsgfgplphcrhglcrnrbzvcfrdfhdtsjmnvfwslcntttqzvhhbljzmpmlsrsblhvmvphppdmjfzwfmflcfwwtdfcndqzgsbrcppsngqfnnjtccnmfjqzhdpnnrqvhrmnrwntqrvmlzfrdszhctzjjdwqrrldtqgrztrvdfrpgprqhqrbnmpfzzlprrpqgtqmzshpcdbwgmrqhrvvgwvspqzmsrvprvsclffwhzlvgfgcsjtmnmthwfmdnfccvlbwbcrlsghhpzcvcnffvccsqjtnhhnbwgfjmqczbrfmjtmmbznspmvtcvdllbgrcvtdzpgzcjzqdjpglhbbnbvwztrdhcrcvrpbshwlmdbmpdgzzflglwgfhvngcgpwshfhzsbrmnhrftmcfqdhnmfmdzbzfgggrzchtzrhgtjpqhdglgdhdqzqpmqmtsbbjjgvtrngdvghwdmgnmdlwsvpmldlsjrtwhltfpbmqlngncwspcptphdppdmjfvtnmdrpbwzrdzcqjdnprpcddjqjhpllsrqzdpcpnplmnmwfqjtnfmnwljbsfgwlgjpwdbbqblvsqcvvgmbrhsqjcscsflcfdzbnrflmrpzhzdhzqhgvmtfjpwtfqnclplgwrjtfvrncjlqtqlrrnjsrvpwbrdcppvnjfzdrzhcltpdfgfndvqtqzvvztgzssdsvvvjwrtjmqcchbjmppqzmgwqdvmmdqbcpbmcnjsvjlwmmnvmnlzdsnsjpldgpjgsbqmpcdsvhdfhgpbggqmrdhbhvvpnzdpqtmldmfqdfchzdfgddzgvcdzgcwjlhnzjwhpwlfwhgjthjshqtzbblhflmsfvtwplfpmpndgjmhndqlhcvfhmjmmqgnjstrzqvshzbbsfqwszwccmrcjnmlsplqzwrgrcwqbmrfwljmlqtqztscrhgjdqzhvmhncvssfznpgrbrjvchsgnjjnnqqrqwsqsrgmltvgtjvpztwmsspjtqdwrbftzrbcmdthmztmnqtmmnffqjjzbvwghrsdmbbjsnnhbdcbqsbcdmwqqppcvsndzbfnsgtpptdftrfthdclqrqvmhnddmjzlnfgscfdwjljjgjnddcrzvclfqbdhprttwpmsnzvdgzwmnzznpqhlhhslwgzlczlgvbjbgqdczztzjnswphllncbsqdmbsbqqsltzmmhmhfnngbttvdsmfrpgthwpfdhsstrjssghlrrlhbmgdsvhzvlhhfvtcrrhlndgrjjcgmjwgnjtlmpmzgqgpnpsvlnthgrvsdfcnmzmthqzfpjdqjbhgmjqsqvvdldrgqwlghdlwqdbfmffgvzmptqhnvbrdbqtcjmsdnjljpbrtcvvnffvztbwfnmtvdbnshlbgvbnljntlrldbwqvqmblnvhwtw diff --git a/package.yaml b/package.yaml index 393d3b5..3e3de03 100644 --- a/package.yaml +++ b/package.yaml @@ -158,6 +158,30 @@ executables: dependencies: - aoc2022 + Day6Part1: + main: Day6Part1.hs + other-modules: [] + source-dirs: day6 + ghc-options: + - -threaded + - -rtsopts + - -with-rtsopts=-N + - -main-is Day6Part1 + dependencies: + - aoc2022 + + Day6Part2: + main: Day6Part2.hs + other-modules: [] + source-dirs: day6 + ghc-options: + - -threaded + - -rtsopts + - -with-rtsopts=-N + - -main-is Day6Part2 + dependencies: + - aoc2022 + tests: Day1-test: main: Day1.hs diff --git a/src/Day5Lib.hs b/src/Day5Lib.hs index 3032f49..bab668c 100644 --- a/src/Day5Lib.hs +++ b/src/Day5Lib.hs @@ -1,4 +1,7 @@ -module Day5Lib where +module Day5Lib + ( day5, + day5Alternate + ) where import Data.List (transpose) import Data.List.Split diff --git a/src/Day6Lib.hs b/src/Day6Lib.hs new file mode 100644 index 0000000..a9221eb --- /dev/null +++ b/src/Day6Lib.hs @@ -0,0 +1,49 @@ +module Day6Lib where + -- ( day6, + -- day6' + -- ) where + +import Data.List (nub, elemIndex) +import Data.Maybe (fromJust) + +-- Using windows of 4 characters to solve this problem +type Window = [Char] + +-- For start of packet markers +splitStringIntoWindows :: String -> [Window] +splitStringIntoWindows "" = [] +splitStringIntoWindows (a:[]) = [] +splitStringIntoWindows (a:b:[]) = [] +splitStringIntoWindows (a:b:c:[]) = [] +splitStringIntoWindows (a:b:c:d:[]) = [[a,b,c,d]] +splitStringIntoWindows string@(a:b:c:d:rest) = [a,b,c,d] : (splitStringIntoWindows $ tail string) + +-- For start of message markers +-- This is non-exhaustive but there is no need to write all this out :/ +splitStringIntoWindows' :: String -> [Window] +splitStringIntoWindows' "" = [] +splitStringIntoWindows' (a:b:c:d:e:f:g:h:i:j:k:l:m:n:[]) = [[a,b,c,d,e,f,g,h,i,j,k,l,m,n]] +splitStringIntoWindows' string@(a:b:c:d:e:f:g:h:i:j:k:l:m:n:rest) = + [a,b,c,d,e,f,g,h,i,j,k,l,m,n] : (splitStringIntoWindows' $ tail string) + +-- Use the nub function to eliminate duplicate elements and check lenght before/after +findAllUniqueWindow :: Window -> Bool +findAllUniqueWindow w = (length w) == (length $ nub w) + +day6 :: String -> Int +day6 input = indexAdjustedForOffset + where + windows = splitStringIntoWindows input + uniqueWindows = filter findAllUniqueWindow windows + firstUniqueWindow = head uniqueWindows + index = fromJust $ elemIndex firstUniqueWindow windows + indexAdjustedForOffset = index + 4 + +day6' :: String -> Int +day6' input = indexAdjustedForOffset + where + windows = splitStringIntoWindows' input + uniqueWindows = filter findAllUniqueWindow windows + firstUniqueWindow = head uniqueWindows + index = fromJust $ elemIndex firstUniqueWindow windows + indexAdjustedForOffset = index + 14