Advent of Code Day Three part Two

 avatar
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...