1
0
Fork 0
mirror of https://github.com/HenkKalkwater/aoc-2020 synced 2024-11-22 11:05:18 +00:00

Day 3, part 2

This commit is contained in:
Chris Josten 2020-12-04 10:32:34 +01:00
parent 52629702c8
commit 2072fc3ed8
Signed by: chris
GPG key ID: 1795A594046530AB
2 changed files with 379 additions and 14 deletions

323
in/3.txt Normal file
View file

@ -0,0 +1,323 @@
..#..#......#..#.......#...#.#.
...##.....##..#..#....#.##.##.#
...#...#.##...##.....#.....#.#.
..#....#.....#...##.##.###.#...
.#.....#......#..#.##.#...###..
#..#..#.#......#...........###.
#......####.#....##........##..
.#.......#.....#......#...#....
...#...#.....#.......##.....##.
#...##.........#.#..##..#..#.##
#.#.##.........#.#..#.#.....###
.##..##...#....##.....#..#.....
........#.......###.#.#.....#.#
...#.#....#.##..#...##..##..#..
......#....#........######.#...
.##...#.#...###......#.#.#..#.#
........#.##...##.#...#..#...##
.#..#.#..##....###..#.#.......#
..#..##..#.#...#.##......#.....
##.....#..##.#.#..#......##...#
......................#..#..#..
..#.##....####.........###.##..
##..###..#...#....#..#.#...#...
.##.#......#..#....#........#..
.#.....#..#..#.#.#....#.....##.
..........#..#....#..##...#..##
.#...#.#....#.##..#.....#....#.
#..............#.#.#..#..#....#
...#.#...............##........
#.#.##...#.##..##.....#........
...#.......###..###..#...#..#..
####..#.#..##.....##.#.#......#
.#.#.......#..##.......#.......
#....#...#.##.#.......#..#.....
.#...##..#..#..##.......##...#.
.#..#......#.........#.........
#.##.#.....#....#..##..#.....#.
#.#....#.#....#...#.#..#....#..
#..#.....#.##..#.....#...##...#
#....#...##.#.........#.#....##
.......##.##......##.......##..
#.....#..#........#........#...
#....#.#..#.#........##.#...#..
#.......#.#.#.#....#.......##.#
...#..###..........#...#.#.###.
....#..#....#...#....##.#.....#
.#..##.....#..#....##..##...#.#
#.........#....#.#..###...##...
.#.#.........#.#.......#.#.#..#
..........#........##..#.......
.....#.......#...#.....#..##.##
...#.........#.............####
##..#...#..#.#......#...#......
.#..###...#.#.#.#...#...#......
....#..##.#....#..#.#..##..##.#
..#.......#......#..#.......#..
....###......#...##...#....#...
..#..#.....#...#..###....#.#..#
.........##..#.##....#..##..#..
##...#...#.#.........##......#.
###..#.#....#......##..##.#...#
.##...##..#.#.#.#......#..#....
###......#..#..#.....#..#....#.
.#.#..##....##........##..#.#..
###...####.#....#.......###....
..#....###..#.#.#..#.......##..
.......#.#...#.....#.#....##.#.
......#......#.#....#..##..###.
....####..........#.....#......
.###.....#...#..#...##.#...###.
...##....##....###....#.#..#.#.
##.#..........##.........#.##..
..#..#.#.###..##..#....##.....#
..#....##.....#...##....###..##
....#.......##..#..#..........#
............#..#.###..#.#......
...........##......#.#.#...#..#
...##.##....#...##.##.....#.#..
.####...#....###...#.....#....#
.##........#..##..#.#.....#....
..................#.....#..##..
..###.....#.##..#..#....##...#.
...#.##.#.####.#.###.#....#..##
.#....##..##......####.#####...
#...#.#....##.........##....#..
..#.##.....##.............#.##.
###.....#.#..#..#......#.##.#..
...#..##.....#...##...#......#.
.##.#...#......##.#..##....#...
.....##.....#......#.#.........
#.....#.....#........##........
.#......##...#..#.#....###.#..#
#.####...#....#.........#..#...
#..##.#.....#.##.##.#....#...#.
#########..#....#..#...#......#
..##..##...###.######...##.##..
##.......#.......#.#....###..#.
.....#...#.######..#.....#.....
.#......#..#.............#.##.#
..###.#.#......##...###........
.......####.#..##....#........#
..#......#.##....##.##....#....
....#......#.#....#..#.#.....##
####.....#....#.#......#.#.#.##
#...##....#.#.##.........#....#
....#..###......#......#...#...
.....##.#..#..#...#..#.#.#.....
.##............#.....#.........
##...#..#.....##.#..#..........
#.....#####.......#..#....#.#..
.........#..#.....###........#.
#....#..#...###........#..#.#..
...##...#..#...#.##..#.........
.........#.#.....#.......#...#.
.#.....#..####....#.##.......##
...............##....##.##..##.
............#....#....#...##.#.
..#...#........#.......#..#....
##....####....#.##...#..##..#.#
.#.#.....#......#.#........#.#.
....#......#.#....##..##.......
.#..#.#..#..##.....#...........
..#........#.##..#......##..#..
...##.#...#...#..#........#....
##..##....#......#...#..#.#.#.#
......#.....#..#..#....#.......
.....##......#..#.#.##...#.....
...#.....#.#..........#..##...#
.####.##....#...........#.....#
.....###..##...#....##..#...#..
..##...#.#...#..........#..#.#.
...#..#..............#.##.#....
##.#....#...#..#....#..........
.##..........#..#........#.....
#...#.#......#...#.....##..#...
.##...#.#.#....###.####..#....#
.#......#.#...#.#....#.#...#...
#....##.###.............#.#....
....#.###..##..##.##...##......
##....#..###.##.##.....#......#
..#..#..#......#..#..#.........
#.##......#.#....#..#..#.......
....#.#...#..###......##.......
.###.......##.......#....###...
..#..#.##..#.#....#..#.#.....#.
.#..##.##..............#....#..
#...#.#...#..#.##..##.#.#......
#...#..#..##..##.###......#....
.#..#.....#...#....#.....#...#.
.....#....#..#.....###...#.####
.#.....#......#...##...#..#....
.#......#............#.#.......
....##....#.#..#..#...#..#.#...
#...#.....###...##...#.##.....#
.......#.....#....#.......#...#
#.......###.......#.#..........
...#.#.###.#........#.###...#..
....#............#....#..#.....
#......#.##.#...##.......#..#.#
.....#....#....#.#.#...###..#..
.....#.#...#...#.#..#....#.#..#
.#.......#.#..#...###.......##.
.......#..#.##.........#.......
.##.#........#.##...##....#....
.#....#..#...#......####...#..#
...#.....#..##.#..#.#....#....#
...##....#........#.#........#.
.....#....##..#.##..........#..
#.....#.#.#......##....##.#..#.
.#.#.##..#.#....##.#....##.....
.....#.....#..#.#....#..#....##
...#........#....#......###.#..
.....##...#.....##.##.#.#.##...
...#.....#####....##.#.#.###.#.
.#..#.#..##...###.........#.#.#
#...#...#.#..#...#...........#.
.##..............#...#..#....#.
....###.........#.#.#....#.....
..#...##.#.#....##.#..#...#..#.
..#.....#.#......#....#......#.
.......##....#.#.##....#...#..#
##.#.#...#..#......#..#..#....#
...#.#......#............###.##
..###..#..##..#...##........#..
.#...#...##...#....#....##.#..#
..##...####....#....#..#....#.#
...#......##....#.........##.#.
##.#.......#..#..#.............
..#.#.#.#......#...#.#..##.....
.#..##.....###...##.#..#......#
##...#..........#.####....##...
#..........#...#..##....#......
....##...#....#..####...#.##.##
.#.######...##...#..##.........
....##.........#.......##.##...
.#.....#.#..........##......#..
...#..#.#.###..#........#.....#
..##..#............##.......#..
......##....##..#.##..#.......#
.......##....#.......#..#...#.#
#.#......#.###.....#.##........
.#..##..........#..#.....#.##..
..#.#...#....#.........#..##..#
.#......#.......#...#..#..###..
......#.##.....#.#......#....#.
....#....#...#.......#...##.##.
#....#...##...#..##........###.
##......#.#..#.......#.......#.
...##.##..#......#.###..#.#.##.
.............#..#.............#
..#.......##..#..#....##...#...
...............##..##........#.
##...#.##.......#....#.......##
....##.##.#.#.....##.....##.##.
#.#......#.......#..#.#..#.....
....##....#.##........##.##.#..
......##....#..##..#..##....##.
.............#.....#.......#...
.......###.......#..........#..
......##.#..#.....#.#...#.#...#
.#...#..#..###.###...#....##...
#......#..#.#...#...#.....#..##
.###.....#..#.#......##..#.##..
.##.#.....#..#.#..#....##......
#......#..............#.....#.#
...#..#....#.....#.....##.#...#
......#..##..##.....#...#......
.....####..#..#.##.......#..#.#
###.#.#........#.......#.....##
..#.#.#.#...#...#........#....#
....##.#.#..#...##.....#......#
#..#.##....#..#.##..####.......
...####.#...#......#......##..#
#....#.#..###......#..#..##..#.
...........#....#...#......#...
......###.#.....#.#....#.#...#.
.......#.##..............#..##.
..##...........#..#.#...#.....#
#..#............##.........#.#.
.......###.#...#.#...#.#.#...#.
..#...##.......#..#......#.#.##
#.#...#.....#...##.#.#.......##
.#.#.##...#..##.#......#.......
#.......#.......#.#....#.....#.
.....#..#..#.......#..#........
##...##...##......#..##.###....
..#...#.###.#.###..#.....###...
.....####.......#.#.....##....#
....#....#.#....#...#..#.#..#..
..##.....#....#.#.#.###...#....
......#.#....#.#..#....#.#..#..
#...#...#....#.......#......#.#
#..#.#......#..#...........#.##
...............#....#.....#...#
.#.#.#...#.##...#.#.#..#....#..
...#.#.####..##.#...##.........
##.........##.##.....##....#...
................#...#.##.#.#..#
.#..#....#...#..#..#..###.#..#.
...#..#.##.#.####..........#..#
........#....##......#..#.#....
........##.........#..#..#..#.#
#......#.#...#...#...##.....#..
#...#.....#..#..##.#...#.#.#...
....#..##...##.....#...#.#.....
..#..##....#....#...#....#.....
.#..#...##.......###...#...#...
.#......#......#..##..#..##....
....##....#..#.#....#.#..##....
###......#...........#.....###.
.....#...#..##.#..#..#.....#..#
#.#....#...........#.##..#..###
#....#...###.#...#..##..#.....#
.#....#......##.#..#....#.#....
....#.#....#..#.#....#..#..#...
..#......#..#.#.#....#.........
.#...#.#.....#........#.#...###
....#..##.......#.###....##....
#.#.......#......#.###........#
#.........#.....####.##..#..#..
.#.#..##...#.#.....##.#.#..#...
.#..#..#..#.##..#...###.#...#..
.....##..##..##..#.#.#.....###.
.#..#...#..#......##.#.........
....#..##....#.##.........#...#
........#...#...###.........##.
#.........#..##....#.#...#.....
.......#.......#..#.......#....
#......##......#.#.##..........
.#..##..####...#.....####.....#
........#.#....#..##..###.#...#
.#...#...#.........###..#...#.#
#.........#....##...#..........
.#.#....#..........#...........
.#.#..........#.##.....#.##....
..#....#...##..###..........##.
.#.#..#.##..#..#.##.##..##.....
........#...#....#...#.#..##...
......#......##..#..#.....#..#.
.##.#....#...#....#...#..##..##
##............#..........###...
....#.......#.#..#.#####.....#.
#......#.....#...#........#....
..##.....###..#.#.#.#....#....#
#...#...#.#..#..#....#..#......
......#....#...#..#....#####...
....#.......##....#....##......
.....##...#.##.#.....##....#...
.#....###.#..##...##.##.......#
....#.#.#.##.............#..##.
...........##......#...#.#.##..
....##......#....#....##..##.#.
.#.#...#.....##.....#.........#
#.#..........#.......#.##...#..
....#.##..#.#....#.....#...#...
##.............##.......#.##.#.
....#...#.....##...#..........#
##..#...#...#.#.##...#.......##
..#........#.....###...##..##.#
.....#...##.#.#.##.....#...#...
####.###...##..##...#..#..#..##
......#..#..#.........#...#.#..
....###.....##.##....#.##.....#

View file

@ -1,31 +1,73 @@
import std.algorithm; import std.algorithm;
import std.array;
import std.format; import std.format;
import std.range; import std.range;
import std.stdio; import std.stdio;
import std.traits;
import std.uni; import std.uni;
import dayutil;
void run(string[] args) { void run(string[] args) {
ulong count = stdin.byLine.countTrees; auto input = stdin.byLineCopy.array;
ulong count = parts!ulong(args,
() => input.countTrees1,
() => [[1,1], [3,1], [5,1], [7,1], [1,2]]
.map!(x => input.save.enumerate.countTrees2(x[0], x[1]))
.fold!((x, y) => x * y));
writeln(count); writeln(count);
} }
ulong countTrees(Range)(Range lines) if (isInputRange!Range) { ulong countTrees1(Range)(Range lines) if (isInputRange!Range && isSomeString!(ElementType!Range)) {
return lines.enumerate.filter!(x => (x.value[x.index * 3 % x.value.length] == '#')).count; return lines.enumerate.filter!(x => (x.value[x.index * 3 % x.value.length] == '#')).count;
} }
unittest { unittest {
string[] field = [ string[] field = [
"..##.........##.........##.........##.........##.........##.......", "..##.......",
"#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..", "#...#...#..",
".#....#..#..#....#..#..#....#..#..#....#..#..#....#..#..#....#..#.", ".#....#..#.",
"..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#", "..#.#...#.#",
".#...##..#..#...##..#..#...##..#..#...##..#..#...##..#..#...##..#.", ".#...##..#.",
"..#.##.......#.##.......#.##.......#.##.......#.##.......#.##.....", "..#.##.....",
".#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#", ".#.#.#....#",
".#........#.#........#.#........#.#........#.#........#.#........#", ".#........#",
"#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...", "#.##...#...",
"#...##....##...##....##...##....##...##....##...##....##...##....#", "#...##....#",
".#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#" ".#..#...#.#"
]; ];
assert(field.countTrees == 7); assert(field.countTrees1 == 7);
}
// Screw proper template type checking, ain't got time for that.
ulong countTrees2(Range)(Range lines, int advanceX, int advanceY) if (isInputRange!Range)
in (advanceX > 0)
in (advanceY > 0)
out (r; r >= 0) {
return lines.enumerate.filter!(x => {
char c = x.value.value[(x.value.index * advanceX) / advanceY % x.value.value.length];
return (x.index % advanceY) == 0 && c == '#';
}()).count;
}
unittest {
string[] field = [
"..##.......",
"#...#...#..",
".#....#..#.",
"..#.#...#.#",
".#...##..#.",
"..#.##.....",
".#.#.#....#",
".#........#",
"#.##...#...",
"#...##....#",
".#..#...#.#"
];
assert(field.enumerate.countTrees2(1, 1) == 2);
assert(field.enumerate.countTrees2(3, 1) == 7);
assert(field.enumerate.countTrees2(5, 1) == 3);
assert(field.enumerate.countTrees2(7, 1) == 4);
assert(field.enumerate.countTrees2(1, 2) == 2, "Expected 2, got %d".format(field.enumerate.countTrees2(1,2)));
} }