From f0ebeb2301edafa5777d5d15cd5423804583e2e6 Mon Sep 17 00:00:00 2001 From: Amneesh Singh Date: Sun, 22 Dec 2024 18:14:00 +0530 Subject: [PATCH] day 22 Signed-off-by: Amneesh Singh --- aoc2024.cabal | 6 ++++++ fetch.sh | 38 ++++++++++++++++++++++++++++++++++++++ flake.nix | 2 +- src/Day22.hs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 1 deletion(-) create mode 100755 fetch.sh create mode 100644 src/Day22.hs diff --git a/aoc2024.cabal b/aoc2024.cabal index e852f3c..d09089c 100644 --- a/aoc2024.cabal +++ b/aoc2024.cabal @@ -164,3 +164,9 @@ executable day21 hs-source-dirs: src main-is: Day21.hs build-depends: containers + +executable day22 + import: common + hs-source-dirs: src + main-is: Day22.hs + build-depends: containers diff --git a/fetch.sh b/fetch.sh new file mode 100755 index 0000000..e22fa35 --- /dev/null +++ b/fetch.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +SOURCE_DIR=$(realpath "$(dirname "$0")") +INPUT_DIR=${INPUT_DIR:="$SOURCE_DIR/inputs"} + +help () { + echo "usage: $0 " + echo "example: $0 day15" + echo " $0 15" + echo " $0 all" +} + +fetch () { + TMPFILE=$(mktemp) + curl "https://adventofcode.com/2024/day/${1}/input" \ + -s --fail-with-body --cookie "session=$AOC_SESSION" \ + -o "${TMPFILE}" + + mkdir -p "$INPUT_DIR" + mv "$TMPFILE" "$INPUT_DIR/day${1}.in" + echo "Fetched Day $1" +} + +if [[ $# != 1 || ! "${1#day}" =~ ^([1-9]|1[0-9]|2[0-5]|all)$ ]]; then + help + exit 1 +fi + +if [[ -z "${AOC_SESSION}" ]]; then + echo "\$AOC_SESSION is not set" + exit 1 +fi + +if [[ $1 == "all" ]]; then + for x in {1..25}; do fetch "$x"; done +else + fetch "${1#day}" +fi diff --git a/flake.nix b/flake.nix index 94781f8..f122393 100644 --- a/flake.nix +++ b/flake.nix @@ -31,7 +31,7 @@ let name = n: "day${(if n < 10 then "0" else "" ) + toString n}"; in - with pkgs.lib; genAttrs (map name (range 1 21)) + with pkgs.lib; genAttrs (map name (range 1 22)) (n: { type = "app"; program = "${self'.packages.aoc2024}/bin/${n}"; diff --git a/src/Day22.hs b/src/Day22.hs new file mode 100644 index 0000000..cc78037 --- /dev/null +++ b/src/Day22.hs @@ -0,0 +1,46 @@ +module Main where + +import Data.Bits (Bits (xor)) +import qualified Data.Map as M + +type Bananas = M.Map Int Int + +evolve :: Int -> Int +evolve = + (`mod` 16777216) + . (xor <*> (* 2048)) + . (`mod` 16777216) + . (xor <*> (`div` 32)) + . (`mod` 16777216) + . (xor <*> (* 64)) + +part1 :: [Int] -> Int +part1 = sum . map ((!! 2000) . iterate evolve) + +hash :: (Int, Int, Int, Int) -> Int +hash (a, b, c, d) = a + 19 * (b + 19 * (c + 19 * d)) + +bananas :: Bananas -> [Int] -> Bananas +bananas f (a : b : c : d : e : xs) = + let key = hash (b - a, c - b, d - c, e - d) + next = bananas f (b : c : d : e : xs) + in case M.lookup key f of + Nothing -> M.insert key e next + Just _ -> next +bananas f _ = f + +part2 :: [Int] -> Int +part2 = + maximum + . M.elems + . M.unionsWith (+) + . map + (bananas M.empty . map (`mod` 10) . take 2001 . iterate evolve) + +main :: IO () +main = + do + buyers <- map read . words <$> readFile "./inputs/day22.in" + + putStr "Part 1: " >> print (part1 buyers) + putStr "Part 2: " >> print (part2 buyers)