Skip to content

Instantly share code, notes, and snippets.

@oisin
Created December 4, 2023 10:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oisin/6897f9cdab8c824cf194f818da52e577 to your computer and use it in GitHub Desktop.
Save oisin/6897f9cdab8c824cf194f818da52e577 to your computer and use it in GitHub Desktop.
AOC 23 Day 2
#![allow(dead_code, unused_variables, unused_mut)]
use std::env;
use std::fs::File;
use std::io::{self, BufRead};
struct Game {
id: u32,
r: u32,
g: u32,
b: u32
}
use std::fmt;
impl fmt::Display for Game {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}: r {} g {} b {}", self.id, self.r, self.g, self.b)
}
}
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() != 2 {
eprintln!("Usage: {} <filename>", args[0]);
std::process::exit(1);
}
let filename = &args[1];
let file = match File::open(filename) {
Ok(file) => file,
Err(error) => {
eprintln!("Error opening file {}: {}", filename, error);
std::process::exit(1);
}
};
let reader = io::BufReader::new(file);
let mut games: Vec<Game> = Vec::new();
for (line_number, line) in reader.lines().enumerate() {
match line {
Ok(line_content) => {
games.push(parse_game(line_number, line_content));
}
Err(error) => {
eprintln!("Error reading line {}: {}", line_number + 1, error);
}
}
}
println!("Total = {}", part2(games));
}
fn parse_game(line_number: usize, line_content: String) -> Game {
let mut game = Game {
id: 0,
r: 0,
g: 0,
b: 0,
};
let v: Vec<&str> = line_content.split(&[';', ' ', ',', ':']).filter(|s| !s.is_empty()).collect();
//println!("Vec is {:?}", v);
// parse out game id
game.id = v[1].parse::<u32>().expect(format!("Line {} does not produce a number", line_number).as_str());
for inx in (2..v.len()).step_by(2) {
let num = v[inx].parse::<u32>().expect(format!("Line {} does not produce a number", line_number).as_str());
match v[inx+1] {
"blue" => {
if num > game.b { game.b = num }
},
"green" => {
if num > game.g { game.g = num }
},
"red" => {
if num > game.r { game.r = num }
},
_ => panic!("What the fuck lads")
}
}
game
}
fn part1(games: Vec<Game>) -> u32 {
let filter_game = Game {
id: 0,
r: 12,
g: 13,
b: 14,
};
games.iter().fold(0,
|sum, g|
{
//println!("Checking filter game {} vs game {}", filter_game, g);
if filter_game.r >= g.r && filter_game.g >= g.g && filter_game.b >= g.b {
sum + g.id
} else {
sum
}
}
)
}
fn part2(games: Vec<Game>) -> u32 {
games.iter().fold(0,|sum, g| sum + (g.r * g.g * g.b))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment