Compare commits
2 Commits
eca0b7d3a1
...
11744d1fe9
| Author | SHA1 | Date | |
|---|---|---|---|
| 11744d1fe9 | |||
| 11c5dcaaaf |
7
2021/Cargo.lock
generated
7
2021/Cargo.lock
generated
@ -6,10 +6,17 @@ version = 3
|
|||||||
name = "advent2021"
|
name = "advent2021"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"anyhow",
|
||||||
"aoc-runner",
|
"aoc-runner",
|
||||||
"aoc-runner-derive",
|
"aoc-runner-derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anyhow"
|
||||||
|
version = "1.0.51"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8b26702f315f53b6071259e15dd9d64528213b44d61de1ec926eca7715d62203"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "aoc-runner"
|
name = "aoc-runner"
|
||||||
version = "0.3.0"
|
version = "0.3.0"
|
||||||
|
|||||||
@ -6,5 +6,6 @@ edition = "2021"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
anyhow = "1.0.45"
|
||||||
aoc-runner = "0.3.0"
|
aoc-runner = "0.3.0"
|
||||||
aoc-runner-derive = "0.3.0"
|
aoc-runner-derive = "0.3.0"
|
||||||
|
|||||||
@ -73,36 +73,34 @@
|
|||||||
//!
|
//!
|
||||||
//! Consider sums of a three-measurement sliding window. How many sums are larger than the previous sum?
|
//! Consider sums of a three-measurement sliding window. How many sums are larger than the previous sum?
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
use aoc_runner_derive::{aoc, aoc_generator};
|
use aoc_runner_derive::{aoc, aoc_generator};
|
||||||
|
|
||||||
/// Reads text file containing one integer per line, and parses them into `Vec<u32>`. Any
|
/// Reads text file containing one integer per line, and parses them into `Vec<u32>`.
|
||||||
/// non-number will result in a panice.
|
|
||||||
#[aoc_generator(day1)]
|
#[aoc_generator(day1)]
|
||||||
fn parse(input: &str) -> Vec<u32> {
|
fn parse(input: &str) -> Result<Vec<u32>> {
|
||||||
input
|
input.split("\n").map(|s| Ok(s.parse()?)).collect()
|
||||||
.split("\n")
|
|
||||||
.map(|s| s.parse().expect("not a number"))
|
|
||||||
.collect()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[aoc(day1, part1)]
|
#[aoc(day1, part1)]
|
||||||
fn part1(depths: &[u32]) -> u32 {
|
fn part1(depths: &[u32]) -> Result<u32> {
|
||||||
depths
|
Ok(depths
|
||||||
.windows(2)
|
.windows(2)
|
||||||
.map(|s| if s[0] < s[1] { 1 } else { 0 })
|
.map(|s| if s[0] < s[1] { 1 } else { 0 })
|
||||||
.sum()
|
.sum())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[aoc(day1, part2)]
|
#[aoc(day1, part2)]
|
||||||
fn part2(depths: &[u32]) -> u32 {
|
fn part2(depths: &[u32]) -> Result<u32> {
|
||||||
let sums: Vec<u32> = depths.windows(3).map(|s| s.iter().sum()).collect();
|
let sums: Vec<u32> = depths.windows(3).map(|s| s.iter().sum()).collect();
|
||||||
sums.windows(2)
|
Ok(sums
|
||||||
|
.windows(2)
|
||||||
.map(|s| if s[0] < s[1] { 1 } else { 0 })
|
.map(|s| if s[0] < s[1] { 1 } else { 0 })
|
||||||
.sum()
|
.sum())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_part1() {
|
fn test_part1() -> Result<()> {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
part1(&parse(
|
part1(&parse(
|
||||||
r#"199
|
r#"199
|
||||||
@ -115,13 +113,14 @@ fn test_part1() {
|
|||||||
269
|
269
|
||||||
260
|
260
|
||||||
263"#
|
263"#
|
||||||
)),
|
)?)?,
|
||||||
7
|
7
|
||||||
);
|
);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_part2() {
|
fn test_part2() -> Result<()> {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
part2(&parse(
|
part2(&parse(
|
||||||
r#"199
|
r#"199
|
||||||
@ -134,7 +133,8 @@ fn test_part2() {
|
|||||||
269
|
269
|
||||||
260
|
260
|
||||||
263"#
|
263"#
|
||||||
)),
|
)?)?,
|
||||||
5
|
5
|
||||||
);
|
);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@ -52,49 +52,50 @@
|
|||||||
//!
|
//!
|
||||||
//! Using this new interpretation of the commands, calculate the horizontal position and depth you would have after following the planned course. What do you get if you multiply your final horizontal position by your final depth?
|
//! Using this new interpretation of the commands, calculate the horizontal position and depth you would have after following the planned course. What do you get if you multiply your final horizontal position by your final depth?
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
use aoc_runner_derive::{aoc, aoc_generator};
|
use aoc_runner_derive::{aoc, aoc_generator};
|
||||||
|
|
||||||
#[aoc(day2, part1)]
|
#[aoc(day2, part1)]
|
||||||
fn part1(input: &str) -> i32 {
|
fn part1(input: &str) -> Result<i32> {
|
||||||
let mut horizontal: i32 = 0;
|
let mut horizontal: i32 = 0;
|
||||||
let mut depth: i32 = 0;
|
let mut depth: i32 = 0;
|
||||||
input.split("\n").for_each(|l| {
|
for l in input.split("\n") {
|
||||||
let p: Vec<_> = l.split(" ").collect();
|
let p: Vec<_> = l.split(" ").collect();
|
||||||
|
|
||||||
match p[0] {
|
match p[0] {
|
||||||
"forward" => horizontal += p[1].parse::<i32>().expect("forward"),
|
"forward" => horizontal += p[1].parse::<i32>()?,
|
||||||
"up" => depth -= p[1].parse::<i32>().expect("up"),
|
"up" => depth -= p[1].parse::<i32>()?,
|
||||||
"down" => depth += p[1].parse::<i32>().expect("down"),
|
"down" => depth += p[1].parse::<i32>()?,
|
||||||
_ => panic!("unknown command {}", p[0]),
|
_ => panic!("unknown command {}", p[0]),
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
horizontal * depth
|
Ok(horizontal * depth)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[aoc(day2, part2)]
|
#[aoc(day2, part2)]
|
||||||
fn part2(input: &str) -> i32 {
|
fn part2(input: &str) -> Result<i32> {
|
||||||
let mut horizontal: i32 = 0;
|
let mut horizontal: i32 = 0;
|
||||||
let mut depth: i32 = 0;
|
let mut depth: i32 = 0;
|
||||||
let mut aim: i32 = 0;
|
let mut aim: i32 = 0;
|
||||||
input.split("\n").for_each(|l| {
|
for l in input.split("\n") {
|
||||||
let p: Vec<_> = l.split(" ").collect();
|
let p: Vec<_> = l.split(" ").collect();
|
||||||
|
|
||||||
match p[0] {
|
match p[0] {
|
||||||
"forward" => {
|
"forward" => {
|
||||||
let v = p[1].parse::<i32>().expect("forward");
|
let v = p[1].parse::<i32>()?;
|
||||||
horizontal += v;
|
horizontal += v;
|
||||||
depth += v * aim;
|
depth += v * aim;
|
||||||
}
|
}
|
||||||
"up" => aim -= p[1].parse::<i32>().expect("up"),
|
"up" => aim -= p[1].parse::<i32>()?,
|
||||||
"down" => aim += p[1].parse::<i32>().expect("down"),
|
"down" => aim += p[1].parse::<i32>()?,
|
||||||
_ => panic!("unknown command {}", p[0]),
|
_ => panic!("unknown command {}", p[0]),
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
horizontal * depth
|
Ok(horizontal * depth)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_part1() {
|
fn test_part1() -> Result<()> {
|
||||||
let input = r#"
|
let input = r#"
|
||||||
forward 5
|
forward 5
|
||||||
down 5
|
down 5
|
||||||
@ -104,11 +105,12 @@ down 8
|
|||||||
forward 2
|
forward 2
|
||||||
"#
|
"#
|
||||||
.trim();
|
.trim();
|
||||||
assert_eq!(part1(input), 150);
|
assert_eq!(part1(input)?, 150);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_part2() {
|
fn test_part2() -> Result<()> {
|
||||||
let input = r#"
|
let input = r#"
|
||||||
forward 5
|
forward 5
|
||||||
down 5
|
down 5
|
||||||
@ -118,5 +120,6 @@ down 8
|
|||||||
forward 2
|
forward 2
|
||||||
"#
|
"#
|
||||||
.trim();
|
.trim();
|
||||||
assert_eq!(part2(input), 900);
|
assert_eq!(part2(input)?, 900);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,36 +1,42 @@
|
|||||||
|
use anyhow::Result;
|
||||||
use aoc_runner_derive::{aoc, aoc_generator};
|
use aoc_runner_derive::{aoc, aoc_generator};
|
||||||
|
|
||||||
#[aoc_generator(dayX)]
|
#[aoc_generator(dayX)]
|
||||||
fn parse(input: &str) -> Vec<u32> {
|
fn parse(input: &str) -> Result<Vec<u32>> {
|
||||||
todo!("parse")
|
todo!("parse");
|
||||||
|
Ok(Vec::new())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[aoc(dayX, part1)]
|
#[aoc(dayX, part1)]
|
||||||
fn part1(depths: &[u32]) -> u32 {
|
fn part1(depths: &[u32]) -> Result<u32> {
|
||||||
todo!("part1")
|
todo!("part1");
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#[aoc(dayX, part2)]
|
#[aoc(dayX, part2)]
|
||||||
fn part2(depths: &[u32]) -> u32 {
|
fn part2(depths: &[u32]) -> Result<u32> {
|
||||||
todo!("part2")
|
todo!("part2")
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_part1() {
|
fn test_part1() -> Result<()> {
|
||||||
let input = r#"
|
let input = r#"
|
||||||
"#
|
"#
|
||||||
.trim();
|
.trim();
|
||||||
assert_eq!(part1(&parse(input)), TODO);
|
assert_eq!(part1(&parse(input)?)?, TODO);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#[test]
|
#[test]
|
||||||
fn test_part2() {
|
fn test_part2()->Result<()> {
|
||||||
let input = r#"
|
let input = r#"
|
||||||
"#
|
"#
|
||||||
.trim();
|
.trim();
|
||||||
assert_eq!(part2(&parse(input)), TODO);
|
assert_eq!(part2(&parse(input)?)?, TODO);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user