Migrate to using cargo-aoc.

This commit is contained in:
Bill Thiede 2020-12-02 18:40:32 -08:00
parent 72996ba5dc
commit 8c6e25d0b9
6 changed files with 135 additions and 81 deletions

106
2020/Cargo.lock generated
View File

@ -5,6 +5,8 @@ name = "advent2020"
version = "0.1.0"
dependencies = [
"anyhow",
"aoc-runner",
"aoc-runner-derive",
]
[[package]]
@ -12,3 +14,107 @@ name = "anyhow"
version = "1.0.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf8dcb5b4bbaa28653b647d8c77bd4ed40183b48882e130c1f1ffb73de069fd7"
[[package]]
name = "aoc-runner"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d21ef9204ad206a5a3e918e9920da04e1118ad91ce4f23570be964b9d6b9dfcb"
[[package]]
name = "aoc-runner-derive"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba8b944269d3fee645d281b1335e1797044db497bb02d0098cc3fdb8900069cc"
dependencies = [
"aoc-runner-internal",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "aoc-runner-internal"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "274b0ba7f3669a45ec0aaacf94eb032a749de880ab776091576cca94037c9982"
dependencies = [
"serde",
"serde_derive",
"serde_json",
]
[[package]]
name = "itoa"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
[[package]]
name = "proc-macro2"
version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
dependencies = [
"unicode-xid",
]
[[package]]
name = "quote"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
dependencies = [
"proc-macro2",
]
[[package]]
name = "ryu"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
[[package]]
name = "serde"
version = "1.0.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a"
[[package]]
name = "serde_derive"
version = "1.0.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cbd1ae72adb44aab48f325a02444a5fc079349a8d804c1fc922aed3f7454c74e"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1500e84d27fe482ed1dc791a56eddc2f230046a040fa908c08bda1d9fb615779"
dependencies = [
"itoa",
"ryu",
"serde",
]
[[package]]
name = "syn"
version = "1.0.53"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8833e20724c24de12bbaba5ad230ea61c3eafb05b881c7c9d3cfe8638b187e68"
dependencies = [
"proc-macro2",
"quote",
"unicode-xid",
]
[[package]]
name = "unicode-xid"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"

View File

@ -8,3 +8,5 @@ edition = "2018"
[dependencies]
anyhow = "1.0.34"
aoc-runner = "0.3.0"
aoc-runner-derive = "0.3.0"

View File

@ -1,6 +0,0 @@
1721
979
366
299
675
1456

View File

@ -30,98 +30,45 @@
//!
//! In your expense report, what is the product of the three entries that sum to 2020?
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::Path;
use aoc_runner_derive::{aoc, aoc_generator};
use anyhow::{anyhow, Result};
fn main() -> Result<()> {
let path = std::env::args()
.nth(1)
.ok_or(anyhow!("Usage: 1 <path to expense report>"))?;
let nums = parse(path)?;
let pair = find_pair_2020(&nums).ok_or(anyhow!("Couldn't find pairs summing to 2020"))?;
println!("Product of {} x {} = {}", pair.0, pair.1, pair.0 * pair.1);
let triple = find_triple_2020(&nums).ok_or(anyhow!("Couldn't find triples summing to 2020"))?;
println!(
"Product of {} x {} x {} = {}",
triple.0,
triple.1,
triple.2,
triple.0 * triple.1 * triple.2
);
Ok(())
/// Reads text file containing one integer per line, and parses them into `Vec<u32>`. Any
/// non-number will result in a panice.
#[aoc_generator(day1)]
fn parse(input: &str) -> Vec<u32> {
input
.split('\n')
.map(|line| line.parse().unwrap())
.collect()
}
/// Finds pairs of numbers in `nums` that sum to 2020. If no pairs are found, `None` is returned.
fn find_pair_2020(nums: &Vec<u32>) -> Option<(u32, 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)]
fn find_pair_2020(nums: &[u32]) -> u32 {
for (idx, first) in nums.iter().enumerate() {
for second in nums.iter().skip(idx + 1) {
if first + second == 2020 {
return Some((*first, *second));
return first * second;
}
}
}
None
panic!("Couldn't find pair");
}
/// Finds triple of numbers in `nums` that sum to 2020. If no triple is found, `None` is returned.
fn find_triple_2020(nums: &Vec<u32>) -> Option<(u32, u32, u32)> {
/// Finds triple of numbers in `nums` that sum to 2020. If no triple is found, the function
/// panics.
#[aoc(day1, part2)]
fn find_triple_2020(nums: &[u32]) -> u32 {
for (idx1, first) in nums.iter().enumerate() {
for (idx2, second) in nums.iter().enumerate().skip(idx1 + 1) {
for third in nums.iter().skip(idx2 + 1) {
if first + second + third == 2020 {
return Some((*first, *second, *third));
return first * second * third;
}
}
}
}
None
}
/// Reads text file containing one integer per line, and parses them into `Vec<u32>`. Any
/// non-number will result in an error returned.
fn parse<P: AsRef<Path>>(path: P) -> Result<Vec<u32>> {
let f = File::open(path)?;
let f = BufReader::new(f);
let mut nums = Vec::new();
for line in f.lines() {
let num: u32 = line?.parse()?;
nums.push(num)
}
Ok(nums)
}
#[cfg(test)]
mod tests {
use anyhow::Context;
use super::*;
fn get_nums() -> Vec<u32> {
let root = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
let path = root.join("src/bin/day1-test.txt");
parse(&path)
.with_context(|| format!("Input {}", path.display()))
.expect("failed to parse")
}
#[test]
fn test_parse() {
let nums = get_nums();
assert_eq!(nums, vec![1721, 979, 366, 299, 675, 1456]);
}
#[test]
fn test_find_pair_2020() {
let nums = get_nums();
assert_eq!(find_pair_2020(&nums), Some((1721, 299)));
}
#[test]
fn test_find_triple_2020() {
let nums = get_nums();
assert_eq!(find_triple_2020(&nums), Some((979, 366, 675)));
}
panic!("Couldn't find triple");
}

5
2020/src/lib.rs Normal file
View File

@ -0,0 +1,5 @@
mod day1;
use aoc_runner_derive::aoc_lib;
aoc_lib! { year = 2020 }