From 74f24e0dfb754ddb86d044261a0b572141dcde78 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 3 Dec 2020 11:29:19 +0100 Subject: [PATCH] Move 2015 to haskellAoC & change Days listing --- .gitignore | 1 - haskellAoC/.gitignore | 1 - haskellAoC/package.yaml | 2 ++ haskellAoC/src/Lib.hs | 20 +++--------- .../day1.hs => haskellAoC/src/Y2015/Day01.hs | 7 ++++ .../day2.hs => haskellAoC/src/Y2015/Day02.hs | 22 ++++--------- .../day3.hs => haskellAoC/src/Y2015/Day03.hs | 7 ++++ haskellAoC/src/Y2015/Day04.hs | 17 ++++++++++ haskellAoC/src/Y2015/Days.hs | 13 ++++++++ haskellAoC/src/Y2019/Days.hs | 32 +++++++++---------- haskellAoC/src/Y2020/Days.hs | 8 ++++- 11 files changed, 79 insertions(+), 51 deletions(-) rename scalaAoC/2015/day1.hs => haskellAoC/src/Y2015/Day01.hs (62%) rename scalaAoC/2015/day2.hs => haskellAoC/src/Y2015/Day02.hs (70%) rename scalaAoC/2015/day3.hs => haskellAoC/src/Y2015/Day03.hs (83%) create mode 100644 haskellAoC/src/Y2015/Day04.hs create mode 100644 haskellAoC/src/Y2015/Days.hs diff --git a/.gitignore b/.gitignore index 8da470a..e69de29 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +0,0 @@ -*input* \ No newline at end of file diff --git a/haskellAoC/.gitignore b/haskellAoC/.gitignore index d22cd58..6f23a71 100644 --- a/haskellAoC/.gitignore +++ b/haskellAoC/.gitignore @@ -1,4 +1,3 @@ .stack-work/ *~ -inputs/ *.cabal diff --git a/haskellAoC/package.yaml b/haskellAoC/package.yaml index 1fa9742..94fd828 100644 --- a/haskellAoC/package.yaml +++ b/haskellAoC/package.yaml @@ -25,6 +25,8 @@ dependencies: - sort - split - directory +- pureMD5 +- utf8-string library: source-dirs: src diff --git a/haskellAoC/src/Lib.hs b/haskellAoC/src/Lib.hs index cca2d46..c33c6b5 100644 --- a/haskellAoC/src/Lib.hs +++ b/haskellAoC/src/Lib.hs @@ -1,5 +1,6 @@ module Lib (pickYear) where +import Y2015.Days import Y2019.Days import Y2020.Days @@ -11,22 +12,9 @@ import System.Environment type DayFun = [String] -> (String, String) getDayFun :: String -> String -> DayFun -getDayFun "2019" "01" = y19day01 -getDayFun "2019" "02" = y19day02 -getDayFun "2019" "03" = y19day03 -getDayFun "2019" "04" = y19day04 -getDayFun "2019" "05" = y19day05 -getDayFun "2019" "06" = y19day06 -getDayFun "2019" "07" = y19day07 -getDayFun "2019" "08" = y19day08 -getDayFun "2019" "09" = y19day09 -getDayFun "2019" "10" = y19day10 -getDayFun "2019" "11" = y19day11 -getDayFun "2019" "12" = y19day12 -getDayFun "2019" "13" = y19day13 -getDayFun "2020" "01" = y20day01 -getDayFun "2020" "02" = y20day02 -getDayFun "2020" "03" = y20day03 +getDayFun "2015" = year2015 +getDayFun "2019" = year2019 +getDayFun "2020" = year2020 callDailyFun :: String -> DayFun -> String -> IO () callDailyFun year fn name = do diff --git a/scalaAoC/2015/day1.hs b/haskellAoC/src/Y2015/Day01.hs similarity index 62% rename from scalaAoC/2015/day1.hs rename to haskellAoC/src/Y2015/Day01.hs index 60a85f7..2b0e276 100644 --- a/scalaAoC/2015/day1.hs +++ b/haskellAoC/src/Y2015/Day01.hs @@ -1,3 +1,5 @@ +module Y2015.Day01 (y15day01) where + import Data.List day1steps :: [Char] -> [Int] @@ -10,3 +12,8 @@ day1p2 :: [Char] -> Maybe Int day1p2 xs = findIndex (== entrance) steps where steps = scanl (\acc x -> acc + x) 0 (day1steps xs) entrance = -1 + +y15day01 :: [String] -> (String, String) +y15day01 (input:_) = (part1, part2) + where part1 = show $ day1p1 input + part2 = show $ day1p2 input diff --git a/scalaAoC/2015/day2.hs b/haskellAoC/src/Y2015/Day02.hs similarity index 70% rename from scalaAoC/2015/day2.hs rename to haskellAoC/src/Y2015/Day02.hs index fe06de9..2c6d7a6 100644 --- a/scalaAoC/2015/day2.hs +++ b/haskellAoC/src/Y2015/Day02.hs @@ -1,3 +1,5 @@ +module Y2015.Day02 (y15day02) where + import Data.List.Split computeSides :: [Int] -> [Int] @@ -30,18 +32,8 @@ part1computation dims = computeWrapping dims + computeSlack dims part2computation :: [Int] -> Int part2computation dims = computeRibbonWrap dims + computeRibbonBow dims -day2 :: ([Int] -> Int) -> String -> Int -day2 fn input = sum paper - where entries = lines input - dims = map parseDims entries - paper = map fn dims - -main :: IO () -main = do - input <- getContents - putStr "Part1: " - print (day2 part1computation input) - putStrLn "" - putStr "Part2: " - print (day2 part2computation input) - putStrLn "" +y15day02 :: [String] -> (String, String) +y15day02 input = (part1, part2) + where part1 = show $ compute part1computation + part2 = show $ compute part2computation + compute fn = sum $ map fn $ map parseDims input diff --git a/scalaAoC/2015/day3.hs b/haskellAoC/src/Y2015/Day03.hs similarity index 83% rename from scalaAoC/2015/day3.hs rename to haskellAoC/src/Y2015/Day03.hs index 6d91597..037bdcf 100644 --- a/scalaAoC/2015/day3.hs +++ b/haskellAoC/src/Y2015/Day03.hs @@ -1,3 +1,5 @@ +module Y2015.Day03 (y15day03) where + import Data.List move :: [(Int, Int)] -> Char -> [(Int, Int)] @@ -26,3 +28,8 @@ day3part1 input = length (uniqueHouses (houses input)) day3part2 :: [Char] -> Int day3part2 input = length (uniqueHouses (housesWithBot input)) + +y15day03 :: [String] -> (String, String) +y15day03 (input:_) = (part1, part2) + where part1 = show $ day3part1 input + part2 = show $ day3part2 input diff --git a/haskellAoC/src/Y2015/Day04.hs b/haskellAoC/src/Y2015/Day04.hs new file mode 100644 index 0000000..6240a33 --- /dev/null +++ b/haskellAoC/src/Y2015/Day04.hs @@ -0,0 +1,17 @@ +module Y2015.Day04 (y15day04) where + +import Data.ByteString.Lazy.UTF8 (fromString) +import Data.Digest.Pure.MD5 + +getLeadingZeroes :: String -> Int -> Int +getLeadingZeroes base nb = nbZeroes + where pass = base ++ (show nb) + md5hash = show $ md5 $ fromString pass + nbZeroes = length $ takeWhile (== '0') md5hash + +-- Crappy bruteforce solution... +y15day04 :: [String] -> (String, String) +y15day04 (input:_) = (part1, part2) + where part1 = show $ firstWithNzeroes 5 + part2 = show $ firstWithNzeroes 6 + firstWithNzeroes n = head $ take 1 $ dropWhile (\h -> getLeadingZeroes input h /= n) $ iterate (+1) 0 diff --git a/haskellAoC/src/Y2015/Days.hs b/haskellAoC/src/Y2015/Days.hs new file mode 100644 index 0000000..e324e42 --- /dev/null +++ b/haskellAoC/src/Y2015/Days.hs @@ -0,0 +1,13 @@ +module Y2015.Days (year2015) where + +import Y2015.Day01 +import Y2015.Day02 +import Y2015.Day03 +import Y2015.Day04 + + +year2015 :: String -> [String] -> (String, String) +year2015 "01" = y15day01 +year2015 "02" = y15day02 +year2015 "03" = y15day03 +year2015 "04" = y15day04 diff --git a/haskellAoC/src/Y2019/Days.hs b/haskellAoC/src/Y2019/Days.hs index 0117ec4..8e94965 100644 --- a/haskellAoC/src/Y2019/Days.hs +++ b/haskellAoC/src/Y2019/Days.hs @@ -1,7 +1,4 @@ -module Y2019.Days (y19day01, y19day02, y19day03, y19day04, y19day05, y19day06, - y19day07, y19day08, y19day09, y19day10, y19day11, y19day12, - y19day13 - ) where +module Y2019.Days (year2019) where import Y2019.Day01 import Y2019.Day02 @@ -17,16 +14,17 @@ import Y2019.Day11 import Y2019.Day12 import Y2019.Day13 -y19day01 = day1 -y19day02 = day2 -y19day03 = day3 -y19day04 = day4 -y19day05 = day5 -y19day06 = day6 -y19day07 = day7 -y19day08 = day8 -y19day09 = day9 -y19day10 = day10 -y19day11 = day11 -y19day12 = day12 -y19day13 = day13 +year2019 :: String -> [String] -> (String, String) +year2019 "01" = day1 +year2019 "02" = day2 +year2019 "03" = day3 +year2019 "04" = day4 +year2019 "05" = day5 +year2019 "06" = day6 +year2019 "07" = day7 +year2019 "08" = day8 +year2019 "09" = day9 +year2019 "10" = day10 +year2019 "11" = day11 +year2019 "12" = day12 +year2019 "13" = day13 diff --git a/haskellAoC/src/Y2020/Days.hs b/haskellAoC/src/Y2020/Days.hs index 167c268..2140673 100644 --- a/haskellAoC/src/Y2020/Days.hs +++ b/haskellAoC/src/Y2020/Days.hs @@ -1,5 +1,11 @@ -module Y2020.Days (y20day01, y20day02, y20day03) where +module Y2020.Days (year2020) where import Y2020.Day01 import Y2020.Day02 import Y2020.Day03 + + +year2020 :: String -> [String] -> (String, String) +year2020 "01" = y20day01 +year2020 "02" = y20day02 +year2020 "03" = y20day03