Compare commits
1 Commits
iter
...
10e760c49d
| Author | SHA1 | Date | |
|---|---|---|---|
| 10e760c49d |
@@ -24,26 +24,10 @@ Day 1 - Part 2 : 165026160
|
|||||||
```
|
```
|
||||||
AOC 2020
|
AOC 2020
|
||||||
Day 2 - Part 1 : 640
|
Day 2 - Part 1 : 640
|
||||||
generator: 1.732103ms,
|
generator: 1.821498ms,
|
||||||
runner: 100.802µs
|
runner: 115.525µs
|
||||||
|
|
||||||
Day 2 - Part 1 - handrolled : 640
|
|
||||||
generator: 157.527µs,
|
|
||||||
runner: 97.775µs
|
|
||||||
|
|
||||||
Day 2 - Part 2 : 472
|
Day 2 - Part 2 : 472
|
||||||
generator: 1.374162ms,
|
generator: 1.52241ms,
|
||||||
runner: 10.461µs
|
runner: 10.459µs
|
||||||
```
|
|
||||||
|
|
||||||
## Day 3
|
|
||||||
```
|
|
||||||
AOC 2020
|
|
||||||
Day 3 - Part 1 : 148
|
|
||||||
generator: 40.059µs,
|
|
||||||
runner: 1.345µs
|
|
||||||
|
|
||||||
Day 3 - Part 2 : 727923200
|
|
||||||
generator: 95.265µs,
|
|
||||||
runner: 6.908µs
|
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,323 +0,0 @@
|
|||||||
........#.............#........
|
|
||||||
...#....#...#....#.............
|
|
||||||
.#..#...#............#.....#..#
|
|
||||||
..#......#..##............###..
|
|
||||||
..........#......#..#..#.......
|
|
||||||
.#..#.......#.........#.#......
|
|
||||||
.........#..#....##..#.##....#.
|
|
||||||
..#....##...#..................
|
|
||||||
##..........#.##...#....##..#..
|
|
||||||
...#....#...#..............#...
|
|
||||||
...........................#..#
|
|
||||||
..##.##.#..................#...
|
|
||||||
...#.##..#............#........
|
|
||||||
........#.......#...#.....##.#.
|
|
||||||
.##..........#......#.......#..
|
|
||||||
...#..........#...#..#.......#.
|
|
||||||
......#...#...#.##.......#.#...
|
|
||||||
........#...#...#...##.........
|
|
||||||
#..............#.#....#.......#
|
|
||||||
..#..#..#.#....#...............
|
|
||||||
.....#........#...#..........#.
|
|
||||||
##......#...#..#.##.......#....
|
|
||||||
..#.#.....#.#.............#.#.#
|
|
||||||
#..#..##......##...#...........
|
|
||||||
..#......#........#.....#......
|
|
||||||
.....#.......#....#.#...#......
|
|
||||||
...#........#...........#...#..
|
|
||||||
.......#.#...........###....#..
|
|
||||||
...#...........##....##........
|
|
||||||
#....#..####....#.....#..#....#
|
|
||||||
..........#...........#........
|
|
||||||
...#.......#....#.#.........#..
|
|
||||||
....#...#.......#..###.........
|
|
||||||
......#......#..#......#..#....
|
|
||||||
...#.....#............#..#.....
|
|
||||||
...#.#.#.#..#.......#.....#....
|
|
||||||
#....##...#.........#...##.....
|
|
||||||
#..#.......#..#..#..#...##.....
|
|
||||||
#.......#............#.....#...
|
|
||||||
.#........##....##...#........#
|
|
||||||
.....#...#.....................
|
|
||||||
.......#........#..............
|
|
||||||
.....#............#.#.#...#.#..
|
|
||||||
.....##..#.............#.......
|
|
||||||
..#.##..#........#..#...#......
|
|
||||||
.........#.#....#...........#..
|
|
||||||
.#.....#..#....#.....#...#.....
|
|
||||||
....#.#................#.......
|
|
||||||
...............##......#...#...
|
|
||||||
.##...#...#.......##.#....#....
|
|
||||||
............#........#.......#.
|
|
||||||
......##.#.#...................
|
|
||||||
.#.#..............#.......#....
|
|
||||||
#.....#...#.......#..#...#.....
|
|
||||||
.............#....#..#......#..
|
|
||||||
........#...##................#
|
|
||||||
.......#...#..#..##............
|
|
||||||
..#..#...##...#..#.#.....#...#.
|
|
||||||
.#.#...#.........#.#...........
|
|
||||||
...###....#.......#...#........
|
|
||||||
........#......##.#...#..##..#.
|
|
||||||
.....................#.#.......
|
|
||||||
.............#...........#...#.
|
|
||||||
#..#..#.....#.#...#............
|
|
||||||
...#....#.....#...........#....
|
|
||||||
..##.....##...#......#..##.....
|
|
||||||
#.....#.....###.#.....#....##..
|
|
||||||
.#...........###...............
|
|
||||||
..................#..##.#...#..
|
|
||||||
................#....##.#......
|
|
||||||
.#.#.#...#....#.........#..#.#.
|
|
||||||
#.......#........##............
|
|
||||||
.......##.#....#.#............#
|
|
||||||
..........#..##.#....#.........
|
|
||||||
........##..#....#.............
|
|
||||||
.........#....#...........##...
|
|
||||||
#.........#.#..#..#..........#.
|
|
||||||
.....#........#......#.........
|
|
||||||
....#.#.#...............#......
|
|
||||||
.#..#..##...#.##..........#....
|
|
||||||
..#....................#.#.....
|
|
||||||
.........#....#...........#.#.#
|
|
||||||
........#....##.##.............
|
|
||||||
..#.....#.......#..#......#....
|
|
||||||
#..........#.#.....#.#....#....
|
|
||||||
........##.#.....#..#.....#.#..
|
|
||||||
...................#...#....#.#
|
|
||||||
............#..#....#...#...#..
|
|
||||||
..............#.#.........#....
|
|
||||||
...#..#..#.#..##..##...........
|
|
||||||
.#...........................#.
|
|
||||||
.#.......#...........#....#.#.#
|
|
||||||
......#..#...#........#...##...
|
|
||||||
.........#......#.#.......#...#
|
|
||||||
...#..##................#......
|
|
||||||
.............#.#..##....#.#....
|
|
||||||
...............#..#......#.....
|
|
||||||
.#......#.#.#....#........#....
|
|
||||||
........#..#.##..#..#.........#
|
|
||||||
...#....#.#...#..#.......#..#..
|
|
||||||
..#...##.........#..#...#......
|
|
||||||
...#...........#.............#.
|
|
||||||
....#.....................#....
|
|
||||||
.....#..#...............#.#...#
|
|
||||||
....#..........#........#......
|
|
||||||
..#....#........##..##.........
|
|
||||||
...#....#..#.#.......#...#.....
|
|
||||||
..#........#....#...##....#.#..
|
|
||||||
.#...#........##.....#....###..
|
|
||||||
#....#....##......#........#...
|
|
||||||
.........#..#.#..........#....#
|
|
||||||
....#...#.....#.......##.......
|
|
||||||
..............#..........#.##..
|
|
||||||
#...#..#..............#......#.
|
|
||||||
.................#......##....#
|
|
||||||
..#..##..#.......#..#.#......#.
|
|
||||||
.............#........#.....#.#
|
|
||||||
.#.##............#..#..........
|
|
||||||
..#...#...........#..##........
|
|
||||||
.#....#...#....#.......#.......
|
|
||||||
...#.#..#..#..#....#.....#..#..
|
|
||||||
....#..##..............#...#...
|
|
||||||
#..........###......###........
|
|
||||||
.##.##......#..#............#..
|
|
||||||
.#...........#.#.....#...#.....
|
|
||||||
#.#..#...#............#........
|
|
||||||
.........#...#...#..........##.
|
|
||||||
.......###..#..........#.......
|
|
||||||
...........###.....#........#..
|
|
||||||
.#.............#.....#......#..
|
|
||||||
...#.....#....#.#.........##...
|
|
||||||
....##..##...#.......##........
|
|
||||||
......#....##.........#......#.
|
|
||||||
..........#.....##..#.....#..#.
|
|
||||||
..........####...#..#.........#
|
|
||||||
.##....#..#.#...#.......#......
|
|
||||||
...#.#.##.#.#...#....#.#.#.....
|
|
||||||
.........#...##........##.....#
|
|
||||||
..#........#..........##...##.#
|
|
||||||
##...##..........#.#...........
|
|
||||||
..............#......#.........
|
|
||||||
........#.....#.#.......#......
|
|
||||||
.#...#.....#....#.#..#.........
|
|
||||||
.....#....................##...
|
|
||||||
....#..................#.#...##
|
|
||||||
.....#............#..##........
|
|
||||||
#..........#....#.#.......##.#.
|
|
||||||
....#..#.....................#.
|
|
||||||
#..#....##.....#...............
|
|
||||||
..#...#..#..##....#.#..........
|
|
||||||
.......#......#.#.......#.....#
|
|
||||||
...#.#.......#...#.##..........
|
|
||||||
....#..........#....#.#.#......
|
|
||||||
.......#..#..........#..##.....
|
|
||||||
#......#......#...#......#...#.
|
|
||||||
###..#....##......##........#..
|
|
||||||
.#..........#.....#.......#.#..
|
|
||||||
.......#.....#.....#.#.........
|
|
||||||
..#...#....#...................
|
|
||||||
..............#.##.............
|
|
||||||
.#...#.......#.##...#.#.......#
|
|
||||||
.......#......................#
|
|
||||||
....#.#...#.#........#.........
|
|
||||||
.#......#....#...#.............
|
|
||||||
#.......#...###.....#.#.#..#...
|
|
||||||
#....##.#...............##.....
|
|
||||||
..#.......#..................#.
|
|
||||||
.....####...............#......
|
|
||||||
.##......#......#.#.......##.#.
|
|
||||||
#......##..###....#....#......#
|
|
||||||
.##.......##.##...#.##.........
|
|
||||||
......##............#.......#..
|
|
||||||
......#..#.....##.#............
|
|
||||||
.#..........#.....##...........
|
|
||||||
#.........#......#......##.#...
|
|
||||||
.........#.......#..#......#.#.
|
|
||||||
.........#.......#...........#.
|
|
||||||
.#..##.#..................##...
|
|
||||||
.............#.............#...
|
|
||||||
.....##........#......##...##..
|
|
||||||
..#..#.#.....#..#....#.........
|
|
||||||
.....#....#.....#.....#........
|
|
||||||
#......##.....#....#....#......
|
|
||||||
#.................#..#.#......#
|
|
||||||
.......#..#......#....#.#...#.#
|
|
||||||
....#.........#..#..........#.#
|
|
||||||
##......#............#...#...#.
|
|
||||||
....##......#...#.....#....##..
|
|
||||||
.#...##.........#..............
|
|
||||||
......#.....................#..
|
|
||||||
..#..........###....#..........
|
|
||||||
#....#...#..#.............#....
|
|
||||||
#........#.#......#....#.......
|
|
||||||
.#...#.......#..#...#.#...#..#.
|
|
||||||
................##.#.....#.....
|
|
||||||
###.......#...#................
|
|
||||||
...#.......#...#.#.....#.......
|
|
||||||
..#.........#.....#.#.......#..
|
|
||||||
......#.......................#
|
|
||||||
#.....#.#..#....#.......#......
|
|
||||||
...#....#..#....####...........
|
|
||||||
.............#.....#...##......
|
|
||||||
.......#.........#...#..#......
|
|
||||||
.##..#.........#....#.#........
|
|
||||||
....##...#.#...........#....#..
|
|
||||||
.........................##....
|
|
||||||
..###.......##....#.#.........#
|
|
||||||
.#....#.#.#...........##....#..
|
|
||||||
......#...#..#..#..#..#.......#
|
|
||||||
..#....#.#.......#..#..#..#...#
|
|
||||||
.....##...#.##....#.#...#......
|
|
||||||
.........#..#....#..#..........
|
|
||||||
.##..##.........#.#.....#......
|
|
||||||
..........#...##...#.#...#.....
|
|
||||||
#.##..#..#.............#.......
|
|
||||||
...#...........#.......#......#
|
|
||||||
.......#....#....#...##.......#
|
|
||||||
..#.##........###..#......#....
|
|
||||||
...#...........###......#..#..#
|
|
||||||
.#.........#.#.........#.#.....
|
|
||||||
##.......##.##.##......##......
|
|
||||||
............#...#..........#...
|
|
||||||
....................#..........
|
|
||||||
...#..#...........#...#...#....
|
|
||||||
.................#...#......###
|
|
||||||
...#................#.#.##.....
|
|
||||||
...............#........#......
|
|
||||||
#.............##......#.#..#...
|
|
||||||
..#.#.....#..#.##.....##...#...
|
|
||||||
......#.........#......#.......
|
|
||||||
#.......#......#....#........#.
|
|
||||||
.#..##.....#.........#.........
|
|
||||||
....##.##.#...#.........##.#...
|
|
||||||
...............#..#..#..##.....
|
|
||||||
.#..#...............###........
|
|
||||||
.##............##..............
|
|
||||||
...............#...##...#...#.#
|
|
||||||
..#.#......#.#..#.............#
|
|
||||||
#.#..#..##.........#.#.#...#...
|
|
||||||
....##.#....................##.
|
|
||||||
.........#..#.....#.....#..#..#
|
|
||||||
....#......#......#.##....#....
|
|
||||||
........###..#.............#..#
|
|
||||||
##................#.........#..
|
|
||||||
#.....#.......#....#...........
|
|
||||||
..#.......#..#........#....#...
|
|
||||||
..#.#.##..#.#...##........#.##.
|
|
||||||
..#..........#............#....
|
|
||||||
..........#...............##...
|
|
||||||
..........###........#.#.......
|
|
||||||
.....###..#.............#......
|
|
||||||
##.............#...#.....#.....
|
|
||||||
.....#......#....#........#.#..
|
|
||||||
............#..#..............#
|
|
||||||
.................#...........##
|
|
||||||
#........#.........###.....#...
|
|
||||||
..#.#..............##......#.#.
|
|
||||||
.#...........#.........#..##..#
|
|
||||||
...............................
|
|
||||||
.#.....#..#....#....#......#...
|
|
||||||
.#...#......#.#..#....#.......#
|
|
||||||
......#.##.......#......#......
|
|
||||||
......#..###..#................
|
|
||||||
#..#.....#........##...#.......
|
|
||||||
......##.........##....#...##..
|
|
||||||
.#..........#.................#
|
|
||||||
#..#.......#...............#...
|
|
||||||
.........#..###....#.#.##.#....
|
|
||||||
..#...#.##..##...............##
|
|
||||||
.........#.....................
|
|
||||||
.#....##...#......#....#.......
|
|
||||||
............#..........#..#....
|
|
||||||
...#......##....#....#........#
|
|
||||||
.#...................#.........
|
|
||||||
#.#........###....#..........#.
|
|
||||||
.........#....#....#........##.
|
|
||||||
.#....#..#.........#..#........
|
|
||||||
...............#..#...#..#...##
|
|
||||||
.........#....##....#......#...
|
|
||||||
.#.............................
|
|
||||||
...#........#...#.#...#.#..#...
|
|
||||||
.....#..##...#.#...............
|
|
||||||
#.....#....#.........#.........
|
|
||||||
#...#...........##.........#...
|
|
||||||
..##........#.#...#...#......#.
|
|
||||||
...........#.....#...#.#.......
|
|
||||||
......###....#.....#...........
|
|
||||||
......##...#..........#....#.#.
|
|
||||||
.......##..##..........#.......
|
|
||||||
....#............#..#....##....
|
|
||||||
..##...................#.#.....
|
|
||||||
...#.#..#.#....................
|
|
||||||
.#..##..#............##.###..#.
|
|
||||||
#.#...#....#.#..........#.#....
|
|
||||||
........#....#.....#...........
|
|
||||||
..##....#...#.......#..........
|
|
||||||
...........##.##....#..........
|
|
||||||
.....#............#............
|
|
||||||
.......#.............#....#....
|
|
||||||
.................#......#......
|
|
||||||
......##.......#....#..##...#..
|
|
||||||
.#..#....#.....................
|
|
||||||
...#.#.#...#......##...........
|
|
||||||
##........##.#....#....#.......
|
|
||||||
.......#.....#..#..#...#.##....
|
|
||||||
#..........#....#.#..#..#..#...
|
|
||||||
...##..............#...........
|
|
||||||
.........#.....#.#....#.......#
|
|
||||||
.........#....##..#..##..#.....
|
|
||||||
.....#......................#..
|
|
||||||
...###...#..#......#...........
|
|
||||||
....#.....................#....
|
|
||||||
...............................
|
|
||||||
..#.....###.......#..#....#....
|
|
||||||
#..........#.................#.
|
|
||||||
......#.......###.......#..##..
|
|
||||||
.............#.##..............
|
|
||||||
......#..#.#..#...........#....
|
|
||||||
...#....##.#...#..#.#...#....#.
|
|
||||||
..................#...#....#.##
|
|
||||||
......#.#....#.................
|
|
||||||
......#.#.....#.....#..##......
|
|
||||||
#..##...........#..#.....#.##..
|
|
||||||
@@ -45,6 +45,8 @@ fn parse(input: &str) -> Vec<u32> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Finds pairs of numbers in `nums` that sum to 2020. If no pairs are found, the function panics.
|
/// Finds pairs of numbers in `nums` that sum to 2020. If no pairs are found, the function panics.
|
||||||
|
/// TODO(wathiede): make a version that sorts or uses a hash for finding the match to compare
|
||||||
|
/// benchmarks.
|
||||||
#[aoc(day1, part1, linear)]
|
#[aoc(day1, part1, linear)]
|
||||||
fn find_pair_2020_linear(nums: &[u32]) -> u32 {
|
fn find_pair_2020_linear(nums: &[u32]) -> u32 {
|
||||||
for (idx, first) in nums.iter().enumerate() {
|
for (idx, first) in nums.iter().enumerate() {
|
||||||
|
|||||||
106
2020/src/day2.rs
106
2020/src/day2.rs
@@ -43,47 +43,22 @@ struct Policy {
|
|||||||
password: String,
|
password: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_regex<'a>(input: &'a str) -> impl Iterator<Item = Policy> + 'a {
|
#[aoc_generator(day2)]
|
||||||
|
fn parse(input: &str) -> Vec<Policy> {
|
||||||
let re = Regex::new(r"(\d+)-(\d+) (\w): (.*)").expect("Failed to compile regex");
|
let re = Regex::new(r"(\d+)-(\d+) (\w): (.*)").expect("Failed to compile regex");
|
||||||
input
|
input
|
||||||
.split('\n')
|
.split('\n')
|
||||||
.filter_map(move |line| match re.captures(line) {
|
.filter(|line| re.is_match(line))
|
||||||
Some(caps) => Some(Policy {
|
.map(|line| {
|
||||||
|
let caps = re.captures(line).expect("Failed to match pattern");
|
||||||
|
Policy {
|
||||||
min: caps.get(1).unwrap().as_str().parse().unwrap(),
|
min: caps.get(1).unwrap().as_str().parse().unwrap(),
|
||||||
max: caps.get(2).unwrap().as_str().parse().unwrap(),
|
max: caps.get(2).unwrap().as_str().parse().unwrap(),
|
||||||
letter: caps.get(3).unwrap().as_str().to_string(),
|
letter: caps.get(3).unwrap().as_str().to_string(),
|
||||||
password: caps.get(4).unwrap().as_str().to_string(),
|
password: caps.get(4).unwrap().as_str().to_string(),
|
||||||
}),
|
}
|
||||||
None => None,
|
|
||||||
})
|
})
|
||||||
}
|
.collect()
|
||||||
|
|
||||||
fn parse_handrolled<'a>(input: &'a str) -> impl Iterator<Item = Policy> + 'a {
|
|
||||||
// Example line:
|
|
||||||
// 1-3 a: abcde
|
|
||||||
input.split('\n').filter_map(|line| {
|
|
||||||
let start = 0;
|
|
||||||
let end = line.find('-')?;
|
|
||||||
let min: usize = line[start..end].parse().ok()?;
|
|
||||||
|
|
||||||
let start = end + 1;
|
|
||||||
let end = line.find(' ')?;
|
|
||||||
let max: usize = line[start..end].parse().ok()?;
|
|
||||||
|
|
||||||
let start = end + 1;
|
|
||||||
let end = line.find(':')?;
|
|
||||||
let letter = line[start..end].to_string();
|
|
||||||
|
|
||||||
let start = end + 2;
|
|
||||||
let password = line[start..].to_string();
|
|
||||||
|
|
||||||
Some(Policy {
|
|
||||||
min,
|
|
||||||
max,
|
|
||||||
letter,
|
|
||||||
password,
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_valid_policy_part1(p: &Policy) -> bool {
|
fn is_valid_policy_part1(p: &Policy) -> bool {
|
||||||
@@ -92,15 +67,8 @@ fn is_valid_policy_part1(p: &Policy) -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[aoc(day2, part1)]
|
#[aoc(day2, part1)]
|
||||||
fn valid_policy_count_part1(input: &str) -> usize {
|
fn valid_policy_count_part1(policies: &[Policy]) -> usize {
|
||||||
let policies = parse_regex(input);
|
policies.iter().filter(|p| is_valid_policy_part1(p)).count()
|
||||||
policies.filter(|p| is_valid_policy_part1(p)).count()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[aoc(day2, part1, handrolled)]
|
|
||||||
fn valid_policy_count_handrolled_part1(input: &str) -> usize {
|
|
||||||
let policies = parse_handrolled(input);
|
|
||||||
policies.filter(|p| is_valid_policy_part1(p)).count()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_valid_policy_part2(p: &Policy) -> bool {
|
fn is_valid_policy_part2(p: &Policy) -> bool {
|
||||||
@@ -114,9 +82,8 @@ fn is_valid_policy_part2(p: &Policy) -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[aoc(day2, part2)]
|
#[aoc(day2, part2)]
|
||||||
fn valid_policy_count_part2(input: &str) -> usize {
|
fn valid_policy_count_part2(policies: &[Policy]) -> usize {
|
||||||
let policies = parse_regex(input);
|
policies.iter().filter(|p| is_valid_policy_part2(p)).count()
|
||||||
policies.filter(|p| is_valid_policy_part2(p)).count()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@@ -130,37 +97,38 @@ mod tests {
|
|||||||
"#;
|
"#;
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_policies() {
|
fn parse_policies() {
|
||||||
let want = vec![
|
assert_eq!(
|
||||||
Policy {
|
parse(INPUT),
|
||||||
min: 1,
|
vec![
|
||||||
max: 3,
|
Policy {
|
||||||
letter: "a".to_string(),
|
min: 1,
|
||||||
password: "abcde".to_string(),
|
max: 3,
|
||||||
},
|
letter: "a".to_string(),
|
||||||
Policy {
|
password: "abcde".to_string(),
|
||||||
min: 1,
|
},
|
||||||
max: 3,
|
Policy {
|
||||||
letter: "b".to_string(),
|
min: 1,
|
||||||
password: "cdefg".to_string(),
|
max: 3,
|
||||||
},
|
letter: "b".to_string(),
|
||||||
Policy {
|
password: "cdefg".to_string(),
|
||||||
min: 2,
|
},
|
||||||
max: 9,
|
Policy {
|
||||||
letter: "c".to_string(),
|
min: 2,
|
||||||
password: "ccccccccc".to_string(),
|
max: 9,
|
||||||
},
|
letter: "c".to_string(),
|
||||||
];
|
password: "ccccccccc".to_string(),
|
||||||
assert_eq!(parse_regex(INPUT).collect::<Vec<Policy>>(), want);
|
},
|
||||||
assert_eq!(parse_handrolled(INPUT).collect::<Vec<Policy>>(), want);
|
]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn validate_count_part1() {
|
fn validate_count_part1() {
|
||||||
assert_eq!(valid_policy_count_part1(INPUT), 2);
|
assert_eq!(valid_policy_count_part1(&parse(INPUT)), 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn validate_count_part2() {
|
fn validate_count_part2() {
|
||||||
assert_eq!(valid_policy_count_part2(INPUT), 1);
|
assert_eq!(valid_policy_count_part2(&parse(INPUT)), 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
149
2020/src/day3.rs
149
2020/src/day3.rs
@@ -1,149 +0,0 @@
|
|||||||
//! --- Day 3: Toboggan Trajectory ---
|
|
||||||
//! With the toboggan login problems resolved, you set off toward the airport. While travel by toboggan might be easy, it's certainly not safe: there's very minimal steering and the area is covered in trees. You'll need to see which angles will take you near the fewest trees.
|
|
||||||
//!
|
|
||||||
//! Due to the local geology, trees in this area only grow on exact integer coordinates in a grid. You make a map (your puzzle input) of the open squares (.) and trees (#) you can see. For example:
|
|
||||||
//!
|
|
||||||
//! ..##.......
|
|
||||||
//! #...#...#..
|
|
||||||
//! .#....#..#.
|
|
||||||
//! ..#.#...#.#
|
|
||||||
//! .#...##..#.
|
|
||||||
//! ..#.##.....
|
|
||||||
//! .#.#.#....#
|
|
||||||
//! .#........#
|
|
||||||
//! #.##...#...
|
|
||||||
//! #...##....#
|
|
||||||
//! .#..#...#.#
|
|
||||||
//! These aren't the only trees, though; due to something you read about once involving arboreal genetics and biome stability, the same pattern repeats to the right many times:
|
|
||||||
//!
|
|
||||||
//! ..##.........##.........##.........##.........##.........##....... --->
|
|
||||||
//! #...#...#..#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..
|
|
||||||
//! .#....#..#..#....#..#..#....#..#..#....#..#..#....#..#..#....#..#.
|
|
||||||
//! ..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#
|
|
||||||
//! .#...##..#..#...##..#..#...##..#..#...##..#..#...##..#..#...##..#.
|
|
||||||
//! ..#.##.......#.##.......#.##.......#.##.......#.##.......#.##..... --->
|
|
||||||
//! .#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#
|
|
||||||
//! .#........#.#........#.#........#.#........#.#........#.#........#
|
|
||||||
//! #.##...#...#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...
|
|
||||||
//! #...##....##...##....##...##....##...##....##...##....##...##....#
|
|
||||||
//! .#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.# --->
|
|
||||||
//! You start on the open square (.) in the top-left corner and need to reach the bottom (below the bottom-most row on your map).
|
|
||||||
//!
|
|
||||||
//! The toboggan can only follow a few specific slopes (you opted for a cheaper model that prefers rational numbers); start by counting all the trees you would encounter for the slope right 3, down 1:
|
|
||||||
//!
|
|
||||||
//! From your starting position at the top-left, check the position that is right 3 and down 1. Then, check the position that is right 3 and down 1 from there, and so on until you go past the bottom of the map.
|
|
||||||
//!
|
|
||||||
//! The locations you'd check in the above example are marked here with O where there was an open square and X where there was a tree:
|
|
||||||
//!
|
|
||||||
//! ..##.........##.........##.........##.........##.........##....... --->
|
|
||||||
//! #..O#...#..#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..
|
|
||||||
//! .#....X..#..#....#..#..#....#..#..#....#..#..#....#..#..#....#..#.
|
|
||||||
//! ..#.#...#O#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#
|
|
||||||
//! .#...##..#..X...##..#..#...##..#..#...##..#..#...##..#..#...##..#.
|
|
||||||
//! ..#.##.......#.X#.......#.##.......#.##.......#.##.......#.##..... --->
|
|
||||||
//! .#.#.#....#.#.#.#.O..#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#
|
|
||||||
//! .#........#.#........X.#........#.#........#.#........#.#........#
|
|
||||||
//! #.##...#...#.##...#...#.X#...#...#.##...#...#.##...#...#.##...#...
|
|
||||||
//! #...##....##...##....##...#X....##...##....##...##....##...##....#
|
|
||||||
//! .#..#...#.#.#..#...#.#.#..#...X.#.#..#...#.#.#..#...#.#.#..#...#.# --->
|
|
||||||
//! In this example, traversing the map using this slope would cause you to encounter 7 trees.
|
|
||||||
//!
|
|
||||||
//! Starting at the top-left corner of your map and following a slope of right 3 and down 1, how many trees would you encounter?
|
|
||||||
//!
|
|
||||||
//! --- Part Two ---
|
|
||||||
//! Time to check the rest of the slopes - you need to minimize the probability of a sudden arboreal stop, after all.
|
|
||||||
//!
|
|
||||||
//! Determine the number of trees you would encounter if, for each of the following slopes, you start at the top-left corner and traverse the map all the way to the bottom:
|
|
||||||
//!
|
|
||||||
//! Right 1, down 1.
|
|
||||||
//! Right 3, down 1. (This is the slope you already checked.)
|
|
||||||
//! Right 5, down 1.
|
|
||||||
//! Right 7, down 1.
|
|
||||||
//! Right 1, down 2.
|
|
||||||
//! In the above example, these slopes would find 2, 7, 3, 4, and 2 tree(s) respectively; multiplied together, these produce the answer 336.
|
|
||||||
|
|
||||||
use std::ops::Index;
|
|
||||||
|
|
||||||
use aoc_runner_derive::{aoc, aoc_generator};
|
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
|
||||||
struct Bitmap {
|
|
||||||
width: usize,
|
|
||||||
height: usize,
|
|
||||||
bits: Vec<bool>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Index<(usize, usize)> for Bitmap {
|
|
||||||
type Output = bool;
|
|
||||||
|
|
||||||
// Perform 2-dimensional indexing of bits, wrapping the X coordinates if it is larger than the
|
|
||||||
// width of the Bitmap.
|
|
||||||
fn index(&self, (x, y): (usize, usize)) -> &Self::Output {
|
|
||||||
&self.bits[x % self.width + y * self.width]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[aoc_generator(day3)]
|
|
||||||
fn parse(input: &str) -> Bitmap {
|
|
||||||
let mut height = 0;
|
|
||||||
let bits: Vec<bool> = input
|
|
||||||
.chars()
|
|
||||||
.filter_map(|c| match c {
|
|
||||||
'.' => Some(false),
|
|
||||||
'#' => Some(true),
|
|
||||||
'\n' => {
|
|
||||||
height += 1;
|
|
||||||
None
|
|
||||||
}
|
|
||||||
_ => panic!("Unexpected character"),
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
let width = bits.len() / height;
|
|
||||||
Bitmap {
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
bits,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[aoc(day3, part1)]
|
|
||||||
fn answer_part1(map: &Bitmap) -> usize {
|
|
||||||
(0..map.height).filter(|y| map[(*y * 3, *y)]).count()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[aoc(day3, part2)]
|
|
||||||
fn answer_part2(map: &Bitmap) -> usize {
|
|
||||||
(0..map.height).filter(|y| map[(*y, *y)]).count()
|
|
||||||
* (0..map.height).filter(|y| map[(*y * 3, *y)]).count()
|
|
||||||
* (0..map.height).filter(|y| map[(*y * 5, *y)]).count()
|
|
||||||
* (0..map.height).filter(|y| map[(*y * 7, *y)]).count()
|
|
||||||
* (0..map.height / 2).filter(|y| map[(*y, *y * 2)]).count()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn make_bitmap() {
|
|
||||||
assert_eq!(
|
|
||||||
parse("..##\n##..\n"),
|
|
||||||
Bitmap {
|
|
||||||
width: 4,
|
|
||||||
height: 2,
|
|
||||||
bits: vec![false, false, true, true, true, true, false, false]
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const INPUT :&'static str="..##.......\n#...#...#..\n.#....#..#.\n..#.#...#.#\n.#...##..#.\n..#.##.....\n.#.#.#....#\n.#........#\n#.##...#...\n#...##....#\n.#..#...#.#\n";
|
|
||||||
#[test]
|
|
||||||
fn part1() {
|
|
||||||
assert_eq!(answer_part1(&parse(INPUT)), 7);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn part2() {
|
|
||||||
assert_eq!(answer_part2(&parse(INPUT)), 336);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
mod day1;
|
mod day1;
|
||||||
mod day2;
|
mod day2;
|
||||||
mod day3;
|
|
||||||
|
|
||||||
use aoc_runner_derive::aoc_lib;
|
use aoc_runner_derive::aoc_lib;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user