use std::collections::HashSet; use std::error::Error; use std::fs::File; use std::io::BufReader; use std::io::SeekFrom; use std::io::prelude::*; fn main() -> std::io::Result<()> { let mut file = match File::open("input") { // The `description` method of `io::Error` returns a string that describes the error Err(why) => panic!("couldn't open input: {}", Error::description(&why)), Ok(file) => file, }; let mut repeat = true; let mut total: i128 = 0; let mut seen = HashSet::::new(); seen.insert(0); while repeat { file.seek(SeekFrom::Start(0)); let reader = BufReader::new(&file); let lines = reader.lines(); for result in lines { let l = result.unwrap(); let offset:i128 = i128::from_str_radix(&l, 10).unwrap(); total = total + offset; println!("{} => {}", offset, total); if seen.contains(&total) { println!("seen {} before", total); repeat = false; break; } seen.insert(total); } } println!("{}", total); Ok(()) }