Compare commits

...

6 commits

Author SHA1 Message Date
Xiretza a2d4fdc341
Add gitignore 2020-12-10 19:23:39 +01:00
Xiretza 6f526a5cc3
day9: add haskell solution 2020-12-10 19:23:22 +01:00
Xiretza f946be1b04
README: update 2020-12-10 19:22:16 +01:00
Xiretza 7e6aa42763
README: fix typo 2020-12-10 19:21:53 +01:00
Xiretza fb0c542f5c
test.sh: skip hidden files and example.txt 2020-12-10 19:20:56 +01:00
Xiretza 981633bf97
test.sh: fix removal of test output files 2020-12-10 19:20:41 +01:00
6 changed files with 1048 additions and 2 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
example.txt

View file

@ -12,6 +12,8 @@ https://adventofcode.com/2020/
| 4 | `**` | `**` | |
| 5 | | `**` | |
| 6 | | `**` | |
| 6 | `**` | | |
| 7 | `**` | | |
| 8 | | `**` | |
| 9 | | `**` | |
`test.sh` can be used to run all solutions and automatically compares them to (my) puzzle inputs and the expected outputs.

2
data/day9.expected Normal file
View file

@ -0,0 +1,2 @@
26134589
3535124

1000
data/day9.input Normal file

File diff suppressed because it is too large Load diff

30
day9/day9.hs Normal file
View file

@ -0,0 +1,30 @@
import AoC
import Control.Monad
import Data.List
import Data.Maybe
slidingWindow :: Int -> [a] -> [[a]]
slidingWindow n xs
| length xs < n = []
| otherwise = take n xs : slidingWindow n (tail xs)
summingTo :: (Eq a, Num a) => Int -> a -> [a] -> Maybe [a]
n `summingTo` x = find ((==x) . sum) . replicateM n
sublistSummingTo :: (Num a, Ord a) => a -> [a] -> Maybe [a]
sublistSummingTo n = fmap snd . find ((== n) . fst) . scanl go (0, [])
where go = dropNeeded .: addToAcc
addToAcc (sum, parts) x = (sum+x, parts++[x])
dropNeeded = fromJust . find ((<= n) . fst) . iterate dropPart
dropPart (sum, (x:xs)) = (sum-x, xs)
part1 :: [Int] -> Int
part1 = snd . fromJust . find (not . uncurry doesSum) . map (\xs -> (init xs, last xs)) . slidingWindow 26
where doesSum xs y = isJust $ 2 `summingTo` y $ xs
part2 :: [Int] -> Int
part2 xs = minimum range + maximum range
where range = fromJust $ sublistSummingTo (part1 xs) xs
main = runAoC (map read . lines) part1 part2

13
test.sh
View file

@ -25,13 +25,22 @@ run_solution() {
fi
}
shopt -s dotglob
for day in day*; do
input=data/$day.input
expected=data/$day.expected
for solution in "$day"/*; do
echo -n "$solution... "
case "${solution##*/}" in
example.txt|.*)
echo SKIP
continue
esac
solution_output=$(mktemp)
trap "rm $solution_output" EXIT
trap "rm -f '$solution_output'" EXIT
run_solution "$solution" > "$solution_output"
if ! diff -u "$expected" "$solution_output"; then
@ -48,5 +57,7 @@ for day in day*; do
else
echo ok
fi
rm "$solution_output"
done
done