Migrate to using cargo-aoc.
This commit is contained in:
parent
72996ba5dc
commit
8c6e25d0b9
106
2020/Cargo.lock
generated
106
2020/Cargo.lock
generated
@ -5,6 +5,8 @@ name = "advent2020"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
"aoc-runner",
|
||||||
|
"aoc-runner-derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -12,3 +14,107 @@ name = "anyhow"
|
|||||||
version = "1.0.34"
|
version = "1.0.34"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bf8dcb5b4bbaa28653b647d8c77bd4ed40183b48882e130c1f1ffb73de069fd7"
|
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"
|
||||||
|
|||||||
@ -8,3 +8,5 @@ edition = "2018"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.34"
|
anyhow = "1.0.34"
|
||||||
|
aoc-runner = "0.3.0"
|
||||||
|
aoc-runner-derive = "0.3.0"
|
||||||
|
|||||||
@ -1,6 +0,0 @@
|
|||||||
1721
|
|
||||||
979
|
|
||||||
366
|
|
||||||
299
|
|
||||||
675
|
|
||||||
1456
|
|
||||||
@ -30,98 +30,45 @@
|
|||||||
//!
|
//!
|
||||||
//! In your expense report, what is the product of the three entries that sum to 2020?
|
//! In your expense report, what is the product of the three entries that sum to 2020?
|
||||||
|
|
||||||
use std::fs::File;
|
use aoc_runner_derive::{aoc, aoc_generator};
|
||||||
use std::io::{BufRead, BufReader};
|
|
||||||
use std::path::Path;
|
|
||||||
|
|
||||||
use anyhow::{anyhow, Result};
|
/// Reads text file containing one integer per line, and parses them into `Vec<u32>`. Any
|
||||||
|
/// non-number will result in a panice.
|
||||||
fn main() -> Result<()> {
|
#[aoc_generator(day1)]
|
||||||
let path = std::env::args()
|
fn parse(input: &str) -> Vec<u32> {
|
||||||
.nth(1)
|
input
|
||||||
.ok_or(anyhow!("Usage: 1 <path to expense report>"))?;
|
.split('\n')
|
||||||
let nums = parse(path)?;
|
.map(|line| line.parse().unwrap())
|
||||||
let pair = find_pair_2020(&nums).ok_or(anyhow!("Couldn't find pairs summing to 2020"))?;
|
.collect()
|
||||||
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(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Finds pairs of numbers in `nums` that sum to 2020. If no pairs are found, `None` is returned.
|
/// Finds pairs of numbers in `nums` that sum to 2020. If no pairs are found, the function panics.
|
||||||
fn find_pair_2020(nums: &Vec<u32>) -> Option<(u32, u32)> {
|
/// 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 (idx, first) in nums.iter().enumerate() {
|
||||||
for second in nums.iter().skip(idx + 1) {
|
for second in nums.iter().skip(idx + 1) {
|
||||||
if first + second == 2020 {
|
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.
|
/// Finds triple of numbers in `nums` that sum to 2020. If no triple is found, the function
|
||||||
fn find_triple_2020(nums: &Vec<u32>) -> Option<(u32, u32, u32)> {
|
/// panics.
|
||||||
|
#[aoc(day1, part2)]
|
||||||
|
fn find_triple_2020(nums: &[u32]) -> u32 {
|
||||||
for (idx1, first) in nums.iter().enumerate() {
|
for (idx1, first) in nums.iter().enumerate() {
|
||||||
for (idx2, second) in nums.iter().enumerate().skip(idx1 + 1) {
|
for (idx2, second) in nums.iter().enumerate().skip(idx1 + 1) {
|
||||||
for third in nums.iter().skip(idx2 + 1) {
|
for third in nums.iter().skip(idx2 + 1) {
|
||||||
if first + second + third == 2020 {
|
if first + second + third == 2020 {
|
||||||
return Some((*first, *second, *third));
|
return first * second * third;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None
|
panic!("Couldn't find triple");
|
||||||
}
|
|
||||||
|
|
||||||
/// 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)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
5
2020/src/lib.rs
Normal file
5
2020/src/lib.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
mod day1;
|
||||||
|
|
||||||
|
use aoc_runner_derive::aoc_lib;
|
||||||
|
|
||||||
|
aoc_lib! { year = 2020 }
|
||||||
Loading…
x
Reference in New Issue
Block a user