From 29e02c819e71cae99f9082fd1524e2b45c36278b Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sun, 7 Dec 2025 15:12:21 +0100 Subject: [PATCH] Implement 2025 day 7 part 1 in Haskell --- 2025/day07/.gitignore | 3 +++ 2025/day07/Makefile | 14 ++++++++++++++ 2025/day07/sample.txt | 16 ++++++++++++++++ 2025/day07/solve.hs | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+) create mode 100644 2025/day07/.gitignore create mode 100644 2025/day07/Makefile create mode 100644 2025/day07/sample.txt create mode 100644 2025/day07/solve.hs diff --git a/2025/day07/.gitignore b/2025/day07/.gitignore new file mode 100644 index 0000000..bda3d13 --- /dev/null +++ b/2025/day07/.gitignore @@ -0,0 +1,3 @@ +solve +*.o +*.hi diff --git a/2025/day07/Makefile b/2025/day07/Makefile new file mode 100644 index 0000000..c37b219 --- /dev/null +++ b/2025/day07/Makefile @@ -0,0 +1,14 @@ +.PHONY: all clean test + +all: solve + +test: solve + ./solve sample.txt + +solve: solve.hs + ghc -dynamic -O -o $@ $^ + +clean: + $(RM) solve + $(RM) *.o + $(RM) *.hi diff --git a/2025/day07/sample.txt b/2025/day07/sample.txt new file mode 100644 index 0000000..57a2466 --- /dev/null +++ b/2025/day07/sample.txt @@ -0,0 +1,16 @@ +.......S....... +............... +.......^....... +............... +......^.^...... +............... +.....^.^.^..... +............... +....^.^...^.... +............... +...^.^...^.^... +............... +..^...^.....^.. +............... +.^.^.^.^.^...^. +............... diff --git a/2025/day07/solve.hs b/2025/day07/solve.hs new file mode 100644 index 0000000..53bf58a --- /dev/null +++ b/2025/day07/solve.hs @@ -0,0 +1,38 @@ +import Basement.Compat.IsList qualified as Set +import Data.Array +import Data.List +import Data.Maybe +import Data.Set +import System.Environment +import System.Exit + +main = getArgs >>= parse >>= (print . solve . lines) + +findStartingPoint line = fromJust (elemIndex 'S' line) + +solve lines = simulate (tail lines) 0 (Data.Set.singleton (findStartingPoint (head lines))) + +stringToArray :: [Char] -> Array Int Char +stringToArray s = listArray (0, length s - 1) s + +checkHit :: Array Int Char -> Int -> [Int] +checkHit line idx = case line ! idx of + '^' -> (idx - 1) : [idx + 1] + _ -> [idx] + +simulate :: [[Char]] -> Int -> Set Int -> Int +simulate [] count active = count +simulate lines count active = + let arr = stringToArray (head lines) + followUp = Data.Set.fromList $ concatMap (checkHit arr) (Set.toList active) + hits = length (Data.Set.filter (\i -> arr ! i == '^') active) + remainder = tail lines + in simulate remainder (hits + count) followUp + +parse ["-h"] = usage >> exitSuccess +parse [] = usage >> die usageStr +parse fs = concat `fmap` mapM readFile fs + +usageStr = "Usage: solve [-vh] [file ..]" + +usage = putStrLn usageStr