Compare commits
1 Commits
iter
...
10e760c49d
| Author | SHA1 | Date | |
|---|---|---|---|
| 10e760c49d |
@@ -24,26 +24,10 @@ Day 1 - Part 2 : 165026160
|
||||
```
|
||||
AOC 2020
|
||||
Day 2 - Part 1 : 640
|
||||
generator: 1.732103ms,
|
||||
runner: 100.802µs
|
||||
|
||||
Day 2 - Part 1 - handrolled : 640
|
||||
generator: 157.527µs,
|
||||
runner: 97.775µs
|
||||
generator: 1.821498ms,
|
||||
runner: 115.525µs
|
||||
|
||||
Day 2 - Part 2 : 472
|
||||
generator: 1.374162ms,
|
||||
runner: 10.461µ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
|
||||
generator: 1.52241ms,
|
||||
runner: 10.459µ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.
|
||||
/// TODO(wathiede): make a version that sorts or uses a hash for finding the match to compare
|
||||
/// benchmarks.
|
||||
#[aoc(day1, part1, linear)]
|
||||
fn find_pair_2020_linear(nums: &[u32]) -> u32 {
|
||||
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,
|
||||
}
|
||||
|
||||
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");
|
||||
input
|
||||
.split('\n')
|
||||
.filter_map(move |line| match re.captures(line) {
|
||||
Some(caps) => Some(Policy {
|
||||
.filter(|line| re.is_match(line))
|
||||
.map(|line| {
|
||||
let caps = re.captures(line).expect("Failed to match pattern");
|
||||
Policy {
|
||||
min: caps.get(1).unwrap().as_str().parse().unwrap(),
|
||||
max: caps.get(2).unwrap().as_str().parse().unwrap(),
|
||||
letter: caps.get(3).unwrap().as_str().to_string(),
|
||||
password: caps.get(4).unwrap().as_str().to_string(),
|
||||
}),
|
||||
None => None,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
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,
|
||||
})
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn is_valid_policy_part1(p: &Policy) -> bool {
|
||||
@@ -92,15 +67,8 @@ fn is_valid_policy_part1(p: &Policy) -> bool {
|
||||
}
|
||||
|
||||
#[aoc(day2, part1)]
|
||||
fn valid_policy_count_part1(input: &str) -> usize {
|
||||
let policies = parse_regex(input);
|
||||
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 valid_policy_count_part1(policies: &[Policy]) -> usize {
|
||||
policies.iter().filter(|p| is_valid_policy_part1(p)).count()
|
||||
}
|
||||
|
||||
fn is_valid_policy_part2(p: &Policy) -> bool {
|
||||
@@ -114,9 +82,8 @@ fn is_valid_policy_part2(p: &Policy) -> bool {
|
||||
}
|
||||
|
||||
#[aoc(day2, part2)]
|
||||
fn valid_policy_count_part2(input: &str) -> usize {
|
||||
let policies = parse_regex(input);
|
||||
policies.filter(|p| is_valid_policy_part2(p)).count()
|
||||
fn valid_policy_count_part2(policies: &[Policy]) -> usize {
|
||||
policies.iter().filter(|p| is_valid_policy_part2(p)).count()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
@@ -130,37 +97,38 @@ mod tests {
|
||||
"#;
|
||||
#[test]
|
||||
fn parse_policies() {
|
||||
let want = vec![
|
||||
Policy {
|
||||
min: 1,
|
||||
max: 3,
|
||||
letter: "a".to_string(),
|
||||
password: "abcde".to_string(),
|
||||
},
|
||||
Policy {
|
||||
min: 1,
|
||||
max: 3,
|
||||
letter: "b".to_string(),
|
||||
password: "cdefg".to_string(),
|
||||
},
|
||||
Policy {
|
||||
min: 2,
|
||||
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);
|
||||
assert_eq!(
|
||||
parse(INPUT),
|
||||
vec![
|
||||
Policy {
|
||||
min: 1,
|
||||
max: 3,
|
||||
letter: "a".to_string(),
|
||||
password: "abcde".to_string(),
|
||||
},
|
||||
Policy {
|
||||
min: 1,
|
||||
max: 3,
|
||||
letter: "b".to_string(),
|
||||
password: "cdefg".to_string(),
|
||||
},
|
||||
Policy {
|
||||
min: 2,
|
||||
max: 9,
|
||||
letter: "c".to_string(),
|
||||
password: "ccccccccc".to_string(),
|
||||
},
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn validate_count_part1() {
|
||||
assert_eq!(valid_policy_count_part1(INPUT), 2);
|
||||
assert_eq!(valid_policy_count_part1(&parse(INPUT)), 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
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 day2;
|
||||
mod day3;
|
||||
|
||||
use aoc_runner_derive::aoc_lib;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user