Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Day 25: Code Chronicle #164

Merged
merged 1 commit into from
Dec 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,4 @@ Development occurs in language-specific directories:
|[Day22.hs](hs/src/Day22.hs)|[Day22.kt](kt/aoc2024-lib/src/commonMain/kotlin/com/github/ephemient/aoc2024/Day22.kt)|[day22.py](py/aoc2024/day22.py)|[day22.rs](rs/src/day22.rs)|
|[Day23.hs](hs/src/Day23.hs)|[Day23.kt](kt/aoc2024-lib/src/commonMain/kotlin/com/github/ephemient/aoc2024/Day23.kt)|[day23.py](py/aoc2024/day23.py)|[day23.rs](rs/src/day23.rs)|
|[Day24.hs](hs/src/Day24.hs)|[Day24.kt](kt/aoc2024-lib/src/commonMain/kotlin/com/github/ephemient/aoc2024/Day24.kt)|||
|[Day25.hs](hs/src/Day25.hs)||||
2 changes: 2 additions & 0 deletions hs/aoc2024.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ library
Day22
Day23
Day24
Day25
Day3
Day4
Day5
Expand Down Expand Up @@ -102,6 +103,7 @@ test-suite aoc2024-test
Day22Spec
Day23Spec
Day24Spec
Day25Spec
Day2Spec
Day3Spec
Day4Spec
Expand Down
2 changes: 2 additions & 0 deletions hs/app/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import Day21 qualified (solve)
import Day22 qualified (part1, part2)
import Day23 qualified (part1, part2)
import Day24 qualified (part1, part2)
import Day25 qualified (part1)
import Day3 qualified (part1, part2)
import Day4 qualified (part1, part2)
import Day5 qualified (part1, part2)
Expand Down Expand Up @@ -81,5 +82,6 @@ main = do
run 22 (either fail print) [Day22.part1, Day22.part2]
run 23 putStrLn [show . Day23.part1, T.unpack . Day23.part2]
run 24 (either (fail . errorBundlePretty) (maybe (fail "error") putStrLn)) [fmap2 show . Day24.part1, fmap2 T.unpack . Day24.part2]
run 25 print [Day25.part1]
where
fmap2 = fmap . fmap
6 changes: 6 additions & 0 deletions hs/bench/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import Day21 qualified (solve)
import Day22 qualified (part1, part2)
import Day23 qualified (part1, part2)
import Day24 qualified (part1, part2)
import Day25 qualified (part1)
import Day3 qualified (part1, part2)
import Day4 qualified (part1, part2)
import Day5 qualified (part1, part2)
Expand Down Expand Up @@ -189,5 +190,10 @@ main =
"Day 24"
[ bench "part 1" $ nf Day24.part1 input,
bench "part 2" $ nf Day24.part2 input
],
env (getDayInput 24) $ \input ->
bgroup
"Day 25"
[ bench "part 2" $ nf Day25.part1 input
]
]
26 changes: 26 additions & 0 deletions hs/src/Day25.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{-# LANGUAGE OverloadedStrings #-}

-- |
-- Module: Day25
-- Description: <https://adventofcode.com/2024/day/25 Day 25: Code Chronicle>
module Day25 (part1) where

import Control.Arrow (Arrow ((&&&)))
import Data.List (partition)
import Data.List.NonEmpty (nonEmpty)
import Data.List.NonEmpty qualified as NonEmpty (head)
import Data.Maybe (mapMaybe)
import Data.Text (Text)
import Data.Text qualified as T (group, head, length, lines, splitOn, transpose)

part1 :: Text -> Int
part1 input =
length
[ ()
| key <- keys,
lock <- locks,
and [k >= l | ((_, k), (_, l)) <- zip key lock]
]
where
stanzas = mapMaybe (fmap ((T.head &&& T.length) . NonEmpty.head) . nonEmpty . T.group) . T.transpose . T.lines <$> T.splitOn "\n\n" input
(keys, locks) = partition (maybe False ((== '.') . fst . NonEmpty.head) . nonEmpty) stanzas
59 changes: 59 additions & 0 deletions hs/test/Day25Spec.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
{-# LANGUAGE OverloadedStrings #-}

module Day25Spec (spec) where

import Data.Text (Text)
import Data.Text qualified as T (unlines)
import Day25 (part1)
import Test.Hspec (Spec, describe, it, shouldBe)

example :: Text
example =
T.unlines
[ -- :r!pbpaste | sed 's/.*/ , "&"/;1s/,/ /'
"#####",
".####",
".####",
".####",
".#.#.",
".#...",
".....",
"",
"#####",
"##.##",
".#.##",
"...##",
"...#.",
"...#.",
".....",
"",
".....",
"#....",
"#....",
"#...#",
"#.#.#",
"#.###",
"#####",
"",
".....",
".....",
"#.#..",
"###..",
"###.#",
"###.#",
"#####",
"",
".....",
".....",
".....",
"#....",
"#.#..",
"#.#.#",
"#####"
]

spec :: Spec
spec = do
describe "part 1" $ do
it "examples" $ do
part1 example `shouldBe` 3
Loading