use std::fs; enum Color { Red, Blue, Green } const GREENMAX: u32 = 13; const REDMAX: u32 = 12; const BLUEMAX: u32 = 14; fn main() { let f = fs::read_to_string("input").unwrap(); let mut count = 0; let mut count2 = 0; for line in f.split("\n") { // Separate game number and data let colonidx = line.find(':').unwrap(); let (game, data) = line.split_at(colonidx); // Get game number let game: Vec<&str> = game.split_whitespace().collect(); let game = game.get(game.len() - 1).unwrap(); let game: u32 = game.parse().unwrap(); println!("{}", game); // Separate game data let data = data.replace(':', ""); let data: Vec<(u32, Vec<(u32, Color)>)> = data.split(";").map(|x| { // Separate game rolls let x: Vec<&str> = x.split(",").collect(); let mut fin = (game, vec![]); for roll in x { let mut roll = roll.split_whitespace(); let amount: u32 = roll.next().unwrap().parse().unwrap(); let color = match roll.next().unwrap() { "blue" => Color::Blue, "red" => Color::Red, "green" => Color::Green, _ => panic!(), }; fin.1.push((amount, color)); } return fin; }).collect(); // let mut count = 0; // println!("process data"); let mut failed = false; let mut game = 0; let mut red = 0; let mut green = 0; let mut blue = 0; for entry in data { game = entry.0; for e in entry.1 { match e.1 { Color::Blue => { if e.0 > blue { // println!("{}", e.0); blue = e.0; } if e.0 > BLUEMAX { failed = true; } }, Color::Green => { if e.0 > green { green = e.0; } if e.0 > GREENMAX { failed = true; } }, Color::Red => { if e.0 > red { red = e.0; } if e.0 > REDMAX { failed = true; } }, } } } // println!("{}", red * green * blue); count2 += red * green * blue; if failed == false { // println!("one"); count += game; } println!("\n"); } println!("\npart one:{}", count); println!("part two:{}", count2); }