Compare commits

...

1 Commits

Author SHA1 Message Date
b228e7f80a alternative 2020-12-02 21:06:48 -08:00

View File

@ -36,14 +36,20 @@ Of course, your expense report is much larger. Find the two entries that sum to
do you get if you multiply them together? do you get if you multiply them together?
*/ */
use std::fs::{File};
use std::collections::HashSet;
use std::io::{BufRead, BufReader};
use anyhow::Result; use anyhow::Result;
use std::collections::HashSet;
use std::fs::File;
use std::io::{BufRead, BufReader};
fn find_triple(target: i32, list: &Vec<i32>, set: &HashSet<i32>) -> i32 { struct Entries {
for i in list { list: Vec<i32>,
let product = find_pair(target - i, list, set); set: HashSet<i32>,
}
impl Entries {
fn find_triple(&self, target: i32) -> i32 {
for i in self.list.iter().copied() {
let product = self.find_pair(target - i);
if product > 0 { if product > 0 {
return product * i; return product * i;
} }
@ -51,36 +57,44 @@ fn find_triple(target: i32, list: &Vec<i32>, set: &HashSet<i32>) -> i32 {
0 0
} }
fn find_pair(target: i32, list: &Vec<i32>, set: &HashSet<i32>) -> i32 { fn find_pair(&self, target: i32) -> i32 {
for i in list { for i in self.list.iter().copied() {
if i > &target { if i > target {
break break;
} }
let val = target - i; let val = target - i;
if set.contains(&val) { if self.set.contains(&val) {
return i * val; return i * val;
} }
} }
0 0
} }
}
fn main() -> Result<()> { impl std::iter::FromIterator<i32> for Entries {
//let contents = fs::read_to_string("1.input").expect("Couldn't read \"1.input\""); fn from_iter<T>(iter: T) -> Self
let file = File::open("1.input")?; where
let reader = BufReader::new(file); T: IntoIterator<Item = i32>,
{
let mut list: Vec<i32> = Vec::new(); let mut list = Vec::new();
let mut set: HashSet<i32> = HashSet::new(); let mut set = HashSet::new();
for value in iter {
for line in reader.lines() {
let value = line?.parse::<i32>()?;
list.push(value); list.push(value);
set.insert(value); set.insert(value);
} }
list.sort(); list.sort();
Entries { list, set }
}
}
println!("Pair is {}", find_pair(2020, &list, &set)); fn main() -> Result<()> {
println!("Triple is {}", find_triple(2020, &list, &set)); //let contents = fs::read_to_string("1.input").expect("Couldn't read \"1.input\"");
let entries: Entries = BufReader::new(File::open("1.input")?)
.lines()
.filter_map(|line| line.ok()?.parse().ok())
.collect();
println!("Pair is {}", entries.find_pair(2020));
println!("Triple is {}", entries.find_triple(2020));
Ok(()) Ok(())
} }