Files
advent_of_code_2021/december_8/src/main.rs
2021-12-09 19:59:08 +01:00

96 lines
3.7 KiB
Rust

use std::fs::File;
use std::io::{BufReader};
use std::io::prelude::*;
use std::collections::HashSet;
fn main(){
let file = File::open("./input.txt").expect("Read failed");
let reader = BufReader::new(file);
let mut line_vec = Vec::new();
for line in reader.lines(){
let line_as_string = line.unwrap();
let split_line = line_as_string.split('|').collect::<Vec<&str>>();
let input = split_line[0].to_owned();
let result = split_line[1].to_owned();
let input_list: Vec<String> = input.split_whitespace().map(|x| x.to_owned()).collect();
let result_list: Vec<String> = result.split_whitespace().map(|x| x.to_owned()).collect();
line_vec.push((input_list, result_list));
}
let mut easy_values = 0;
for line in line_vec.iter(){
let result = line.to_owned().1;
for res in result {
let len_res = res.len();
if len_res == 2 || len_res == 3 || len_res == 4 || len_res == 7 {
easy_values += 1;
}
}
}
println!("Easy values: {}", easy_values);
let mut output_sum = 0;
for line in line_vec{
let input = line.0;
let result = line.1;
let mut segments = ['x'; 7]; // segment mapping
let mut digits = [""; 10]; //Pos of digits
digits[1] = input.iter().find(|x| x.len() == 2).unwrap();
digits[4] = input.iter().find(|x| x.len() == 4).unwrap();
digits[7] = input.iter().find(|x| x.len() == 3).unwrap();
digits[8] = input.iter().find(|x| x.len() == 7).unwrap();
segments[0] = digits[7].chars().find(|x| !digits[1].contains(x.clone() )).unwrap();
segments[1] = digits[4].chars().find(|&x|
!digits[1].contains(x ) &&
input.iter().all(|digit| digit.len() != 6 || digit.contains(x))
).unwrap();
digits[5] = input.iter().find(|x| x.len() == 5 && x.contains(segments[0]) && x.contains(segments[1])).unwrap();
segments[2] = digits[1].chars().find(|&x| !digits[5].contains(x)).unwrap();
segments[5] = digits[1].chars().find(|&x| digits[5].contains(x)).unwrap();
digits[2] = input.iter().find(|x| x.len() == 5 && x.contains(segments[0]) && x.contains(segments[2]) && !x.contains(segments[5])).unwrap();
digits[3] = input.iter().find(|x| x.len() == 5 && x.contains(segments[0]) && x.contains(segments[2]) && x.contains(segments[5])).unwrap();
digits[6] = input.iter().find(|x| x.len() == 6 && !x.contains(segments[2])).unwrap();
segments[4] = digits[6].chars().find(|&x| !digits[5].contains(x)).unwrap();
digits[0] = input.iter().find(|x| x.len() == 6 && x.contains(segments[2])&& x.contains(segments[4])).unwrap();
segments[3] = digits[8].chars().find(|&x| !digits[0].contains(x)).unwrap();
segments[6] = digits[0].chars().find(|&x| x != segments[0] && x != segments[1] && x != segments[2] && x != segments[4] && x != segments[5]).unwrap();
digits[9] = input.iter().find(|x| x.len() == 6 && !x.contains(segments[4])).unwrap();
let mut output_value: String = "".to_string();
for val in &result {
let mut val_hash = HashSet::new();
for ch in val.chars() {
val_hash.insert(ch);
}
let index = digits.iter().position(|&r| HashSet::from_iter(r.chars()) == val_hash ).unwrap();
println!("Element is {}", index);
output_value.push_str(&index.to_string());
}
let output_value_int = output_value.parse::<i32>().unwrap();
println!("Final Result is {}", output_value_int);
output_sum += output_value_int;
}
println!("Final Final Result is {}", output_sum);
}