Compare commits

..

1 Commits

6 changed files with 43 additions and 562 deletions

View File

@@ -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
```

View File

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

View File

@@ -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() {

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -1,6 +1,5 @@
mod day1;
mod day2;
mod day3;
use aoc_runner_derive::aoc_lib;