#![allow(dead_code)]
use std::fs::File;
use std::io;
use std::io::BufRead;
use std::path::Path;
use std::time::Instant;
fn main() {
let now = Instant::now();
part_one();
let part_one_duration = now.elapsed();
part_two();
let part_two_duration = now.elapsed();
println!(
"p1: {}ms, p2: {}ms",
part_one_duration.as_millis(),
(part_two_duration - part_one_duration).as_millis()
);
}
fn read_lines
(filename: P) -> io::Result>>
where
P: AsRef,
{
// note that this discards a final newline
let file = File::open(filename)?;
Ok(io::BufReader::new(file).lines())
}
fn part_one() {
if let Ok(lines) = read_lines("./inputs/input") {
let mut score = 0;
for line in lines {
let l = line.unwrap();
let them = l.chars().nth(0).unwrap() as u32 - 64;
let you = l.chars().nth(2).unwrap() as u32 - 87;
score += you;
// 1 is Rock
// 2 is Paper
// 3 is Scissors
if you == them {
score += 3;
} else if them == 1 && you == 2 {
score += 6
} else if them == 2 && you == 3 {
score += 6
} else if them == 3 && you == 1 {
score += 6
}
}
println!("{}", score)
}
}
fn part_two() {
if let Ok(lines) = read_lines("./inputs/input") {
let mut score = 0;
for line in lines {
let l = line.unwrap();
let them = l.chars().nth(0).unwrap() as u32 - 64;
let outcome = l.chars().nth(2).unwrap() as u32 - 87;
// 1 is Rock / you lose
// 2 is Paper / you tie
// 3 is Scissors / you win
// compute what you throw plus the score of the round
score += ((them + outcome) % 3) + 1 + (outcome - 1) * 3;
}
println!("{}", score)
}
}