Advent of Code Day Three part Two
unknown
rust
4 years ago
2.4 kB
17
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...