diff options
Diffstat (limited to '2018/src')
| -rw-r--r-- | 2018/src/day1.rs | 25 | ||||
| -rw-r--r-- | 2018/src/main.rs | 78 | 
2 files changed, 103 insertions, 0 deletions
| 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<T: BufRead>(reader: T) -> io::Result<()> { +    let values: Vec<i64> = +        reader.lines().map(|l| l.unwrap().parse::<i64>().unwrap()).collect(); + +    println!("{}", values.iter().sum::<i64>()); + +    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<T: BufRead>(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<F>(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::<i32>() { +            Ok(day) => run_day(day, &options), +            Err(_) => { +                for day in 1..1 { +                    run_day(day, &options)?; +                } +                Ok(()) +            } +        } +    ) +} | 
