Advent of Code Day Three part Two
unknown
rust
4 years ago
2.4 kB
11
Indexable
use std::io::{self, BufRead}; use std::fs::File; use std::ops::IndexMut; fn main() { let file = File::open("./input.txt").unwrap(); let lines = io::BufReader::new(file).lines(); let mut str_lines: Vec<String> = Vec::new(); for line in lines { if let Ok(input) = line { str_lines.push(input); } } //Find oxygen rating let mut found_oxy = false; let mut oxy_idx: usize = 0; let mut oxy_result = String::new(); let mut results = str_lines.clone(); while (!found_oxy) { results = run_interation(&results, oxy_idx, true); if results.len() <= 1 { oxy_result = results[0].clone(); found_oxy = true; } oxy_idx += 1; } //Find CO2 rating let mut found_co2 = false; let mut co2_idx: usize = 0; let mut co2_result = String::new(); results = str_lines.clone(); while (!found_co2) { results = run_interation(&results, co2_idx, false); if results.len() <= 1 { co2_result = results[0].clone(); found_co2 = true; } co2_idx += 1; } println!("Oxygen result {}", oxy_result); println!("Co2 result {}", co2_result); } fn run_interation(input_lines: &Vec<String>, idx: usize, use_most:bool) -> Vec<String> { let mut zeroes: Vec<i32> = vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; let mut ones: Vec<i32> = vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for line in input_lines { let chars = line.chars(); let mut count = 0; for c in chars { match c { '0' => { zeroes[count] += 1 } '1' => { ones[count] += 1 } _ => {} } count += 1; } } let zeroes_val = zeroes[idx]; let ones_val = ones[idx]; let keep_ones = if use_most {zeroes_val <= ones_val} else {ones_val < zeroes_val}; let mut results: Vec<String> = Vec::new(); for line in input_lines { let mut chars = line.chars(); let mut c: char = '-'; c = chars.nth(idx).unwrap(); match c { '0' => if !keep_ones { results.push(line.clone()) } '1' => if keep_ones { results.push(line.clone()) } _ => {} } } results }
Editor is loading...