Compare commits
6 commits
173bab5a0f
...
a2d4fdc341
Author | SHA1 | Date | |
---|---|---|---|
Xiretza | a2d4fdc341 | ||
Xiretza | 6f526a5cc3 | ||
Xiretza | f946be1b04 | ||
Xiretza | 7e6aa42763 | ||
Xiretza | fb0c542f5c | ||
Xiretza | 981633bf97 |
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
example.txt
|
|
@ -12,6 +12,8 @@ https://adventofcode.com/2020/
|
||||||
| 4 | `**` | `**` | |
|
| 4 | `**` | `**` | |
|
||||||
| 5 | | `**` | |
|
| 5 | | `**` | |
|
||||||
| 6 | | `**` | |
|
| 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.
|
`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
2
data/day9.expected
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
26134589
|
||||||
|
3535124
|
1000
data/day9.input
Normal file
1000
data/day9.input
Normal file
File diff suppressed because it is too large
Load diff
30
day9/day9.hs
Normal file
30
day9/day9.hs
Normal 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
13
test.sh
|
@ -25,13 +25,22 @@ run_solution() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shopt -s dotglob
|
||||||
|
|
||||||
for day in day*; do
|
for day in day*; do
|
||||||
input=data/$day.input
|
input=data/$day.input
|
||||||
expected=data/$day.expected
|
expected=data/$day.expected
|
||||||
for solution in "$day"/*; do
|
for solution in "$day"/*; do
|
||||||
echo -n "$solution... "
|
echo -n "$solution... "
|
||||||
|
|
||||||
|
case "${solution##*/}" in
|
||||||
|
example.txt|.*)
|
||||||
|
echo SKIP
|
||||||
|
continue
|
||||||
|
esac
|
||||||
|
|
||||||
solution_output=$(mktemp)
|
solution_output=$(mktemp)
|
||||||
trap "rm $solution_output" EXIT
|
trap "rm -f '$solution_output'" EXIT
|
||||||
run_solution "$solution" > "$solution_output"
|
run_solution "$solution" > "$solution_output"
|
||||||
|
|
||||||
if ! diff -u "$expected" "$solution_output"; then
|
if ! diff -u "$expected" "$solution_output"; then
|
||||||
|
@ -48,5 +57,7 @@ for day in day*; do
|
||||||
else
|
else
|
||||||
echo ok
|
echo ok
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
rm "$solution_output"
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
|
|
Loading…
Reference in a new issue