From 35160c9e759bb7ab5d478074f417305012c779be Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Sat, 1 Dec 2018 12:05:29 +0100 Subject: Start 2018! --- 2018/src/day1.rs | 25 ++++++++++++++++++ 2018/src/main.rs | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 2018/src/day1.rs create mode 100644 2018/src/main.rs (limited to '2018/src') diff --git a/2018/src/day1.rs b/2018/src/day1.rs new file mode 100644 index 0000000..741f5b3 --- /dev/null +++ b/2018/src/day1.rs @@ -0,0 +1,25 @@ +use std::io; +use std::io::BufRead; +use std::collections::HashSet; + +pub fn main(reader: T) -> io::Result<()> { + let values: Vec = + reader.lines().map(|l| l.unwrap().parse::().unwrap()).collect(); + + println!("{}", values.iter().sum::()); + + let mut seen = HashSet::new(); + seen.insert(0); + + let mut res = 0; + for val in values.iter().cycle() { + res += val; + if seen.contains(&res) { + println!("{}", res); + return Ok(()); + } else { + seen.insert(res); + } + } + unreachable!() +} diff --git a/2018/src/main.rs b/2018/src/main.rs new file mode 100644 index 0000000..7e683ca --- /dev/null +++ b/2018/src/main.rs @@ -0,0 +1,78 @@ +extern crate argparse; + +use std::io; +use std::io::{BufRead, BufReader, Error, ErrorKind}; +use std::fs::File; +use std::process::exit; +use argparse::{ArgumentParser, StoreTrue, Store}; + +mod day1; + +fn day_switch(day: i32, reader: T) -> io::Result<()> { + match day { + 1 => day1::main(reader), + _ => Err(Error::new(ErrorKind::Other, "Invalid day")) + } +} + +struct Options { + use_stdin: bool, +} + +fn run_day(day: i32, opts: &Options) -> io::Result<()> { + if opts.use_stdin { + let stdin = io::stdin(); + day_switch(day, BufReader::new(stdin)) + } else { + match File::open(format!("../input/{}.txt", day)) { + Ok(f) => day_switch(day, BufReader::new(f)), + Err(_) => Err(Error::new(ErrorKind::Other, format!("No input file for day {}", day))) + } + } +} + +fn error_handler(func: F) -> io::Result<()> + where F: Fn() -> io::Result<()> { + + match func() { + Ok(()) => Ok(()), + Err(err) => { + if err.kind() == ErrorKind::Other { + println!("Error: {}", err); + exit(1) + } else { + Err(err) + } + } + } +} + +fn main() -> io::Result<()> { + let mut day_string = String::new(); + let mut options = Options { + use_stdin: false + }; + + { + let mut parser = ArgumentParser::new(); + parser.set_description("AOC 2018 solutions by Tom Smeding"); + parser.refer(&mut options.use_stdin) + .add_option(&["-s", "--stdin"], StoreTrue, + "Read from stdin"); + parser.refer(&mut day_string) + .add_argument("day", Store, "Day to execute"); + parser.parse_args_or_exit(); + } + + error_handler(|| + match day_string.parse::() { + Ok(day) => run_day(day, &options), + Err(_) => { + for day in 1..1 { + run_day(day, &options)?; + } + Ok(()) + } + } + ) +} -- cgit v1.2.3-70-g09d2