Skip to content

Commit 6975063

Browse files
committed
feat: completed day 3
1 parent a4dba29 commit 6975063

File tree

7 files changed

+488
-1
lines changed

7 files changed

+488
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
- [Day 1](https://github.com/ankjevel/adventofcode/tree/2020/day_01) 🌟 🌟
77
- [Day 2](https://github.com/ankjevel/adventofcode/tree/2020/day_02) 🌟 🌟
8-
- [Day 3](#)
8+
- [Day 3](https://github.com/ankjevel/adventofcode/tree/2020/day_03) 🌟 🌟
99
- [Day 4](#)
1010
- [Day 5](#)
1111
- [Day 6](#)

day_03/Cargo.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[package]
2+
name = "day_03"
3+
version = "0.1.0"
4+
authors = ["Dennis Pettersson <mail@dennispettersson.se>"]
5+
edition = "2018"
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[dependencies]

day_03/src/lib.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
pub mod part_01;
2+
pub mod part_02;
3+
4+
#[derive(Clone, Copy, Eq, PartialEq, Hash, Debug)]
5+
pub enum Square {
6+
Open,
7+
Tree,
8+
}
9+
10+
use Square::{Open, Tree};
11+
12+
pub fn parse_input(input: &str) -> Vec<Vec<Square>> {
13+
input
14+
.lines()
15+
.map(|string| string.trim())
16+
.filter(|string| !string.is_empty())
17+
.into_iter()
18+
.map(|string| {
19+
string
20+
.chars()
21+
.into_iter()
22+
.map(|square| if square == '.' { Open } else { Tree })
23+
.collect()
24+
})
25+
.collect()
26+
}
27+
28+
#[cfg(test)]
29+
mod tests {
30+
use crate::{
31+
parse_input,
32+
Square::{Open, Tree},
33+
};
34+
35+
const EXAMPLE_DATA: &'static str = "
36+
..##.......
37+
#...#...#..
38+
";
39+
40+
#[test]
41+
fn it_can_parse_input() {
42+
assert_eq!(
43+
parse_input(&EXAMPLE_DATA),
44+
vec![
45+
vec![Open, Open, Tree, Tree, Open, Open, Open, Open, Open, Open, Open],
46+
vec![Tree, Open, Open, Open, Tree, Open, Open, Open, Tree, Open, Open]
47+
]
48+
)
49+
}
50+
}

day_03/src/main.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use std::io::Result;
2+
3+
use day_03::{parse_input, part_01::main as part_01, part_02::main as part_02};
4+
5+
fn main() -> Result<()> {
6+
let input = parse_input(include_str!("../../input/day_03"));
7+
8+
println!("part_01: {:?}", part_01(&input).unwrap());
9+
println!("part_02: {:?}", part_02(&input).unwrap());
10+
11+
Ok(())
12+
}

day_03/src/part_01.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
use std::io::Result;
2+
3+
use crate::{Square, Square::Tree};
4+
5+
pub fn main(input: &Vec<Vec<Square>>) -> Result<usize> {
6+
let max = input.get(0).unwrap().len();
7+
let mut index = 0;
8+
Ok(input
9+
.into_iter()
10+
.map(|row| {
11+
let square = row.get(index).unwrap();
12+
13+
index = (index + 3) % max;
14+
15+
square.to_owned()
16+
})
17+
.filter(|square| square == &Tree)
18+
.count())
19+
}
20+
21+
#[cfg(test)]
22+
mod tests {
23+
use crate::parse_input;
24+
25+
use super::main;
26+
27+
const EXAMPLE_DATA: &'static str = "
28+
..##.......
29+
#...#...#..
30+
.#....#..#.
31+
..#.#...#.#
32+
.#...##..#.
33+
..#.##.....
34+
.#.#.#....#
35+
.#........#
36+
#.##...#...
37+
#...##....#
38+
.#..#...#.#
39+
";
40+
41+
#[test]
42+
fn it_gets_the_example_correct() {
43+
assert_eq!(main(&parse_input(EXAMPLE_DATA)).unwrap(), 7);
44+
}
45+
}

day_03/src/part_02.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
use std::io::Result;
2+
3+
use crate::{Square, Square::Tree};
4+
5+
pub fn main(input: &Vec<Vec<Square>>) -> Result<usize> {
6+
let max = input.get(0).unwrap().len();
7+
Ok(vec![(1, 1), (3, 1), (5, 1), (7, 1), (1, 2)]
8+
.into_iter()
9+
.fold(1, |count, (right, down)| {
10+
let mut index = right.to_owned();
11+
let trees = (down..input.len())
12+
.step_by(down)
13+
.map(|i| {
14+
let square = input.get(i).unwrap().get(index).unwrap();
15+
index = (index + right) % max;
16+
square.to_owned()
17+
})
18+
.filter(|square| square == &Tree)
19+
.count();
20+
count * trees
21+
}))
22+
}
23+
24+
#[cfg(test)]
25+
mod tests {
26+
use crate::parse_input;
27+
28+
use super::main;
29+
30+
const EXAMPLE_DATA: &'static str = "
31+
..##.......
32+
#...#...#..
33+
.#....#..#.
34+
..#.#...#.#
35+
.#...##..#.
36+
..#.##.....
37+
.#.#.#....#
38+
.#........#
39+
#.##...#...
40+
#...##....#
41+
.#..#...#.#
42+
";
43+
44+
#[test]
45+
fn it_gets_the_example_correct() {
46+
assert_eq!(main(&parse_input(EXAMPLE_DATA)).unwrap(), 336);
47+
}
48+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy