Day 10 complete
This commit is contained in:
parent
1f225db08d
commit
f09ab515bb
97
src/10part1.rs
Normal file
97
src/10part1.rs
Normal file
|
@ -0,0 +1,97 @@
|
|||
use std::{fs, collections::HashMap};
|
||||
|
||||
#[derive(Eq, PartialEq, Hash, Copy, Clone)]
|
||||
struct Coordinate {
|
||||
x: usize,
|
||||
y: usize,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let file_path = "input/10input.txt";
|
||||
let contents = fs::read_to_string(file_path).expect("should read file");
|
||||
let mut lines = contents.lines();
|
||||
let mut matrix: Vec<Vec<char>> = Vec::new();
|
||||
loop {
|
||||
match lines.next() {
|
||||
Some(line) => {
|
||||
matrix.push(line.chars().collect());
|
||||
},
|
||||
None => break,
|
||||
}
|
||||
}
|
||||
let mut connection_map: HashMap<Coordinate, Vec<Coordinate>> = HashMap::new();
|
||||
let mut starting_point: Coordinate = Coordinate { x: 0, y: 0};
|
||||
for i in 0..matrix.len() {
|
||||
for j in 0..matrix[i].len() {
|
||||
match matrix[i][j] {
|
||||
'|' => {
|
||||
if i > 0 && (matrix[i-1][j] == '|' || matrix[i-1][j] == '7' || matrix[i-1][j] == 'F' || matrix[i-1][j] == 'S') && i < matrix.len()-1 && (matrix[i+1][j] == '|' || matrix[i+1][j] == 'L' || matrix[i+1][j] == 'J' || matrix[i+1][j] == 'S') {
|
||||
connection_map.insert(Coordinate { x: j, y: i}, vec![Coordinate { x: j, y: i-1}, Coordinate { x: j, y: i+1}]);
|
||||
}
|
||||
},
|
||||
'-' => {
|
||||
if j > 0 && (matrix[i][j-1] == '-' || matrix[i][j-1] == 'L' || matrix[i][j-1] == 'F' || matrix[i][j-1] == 'S') && j < matrix[i].len()-1 && (matrix[i][j+1] == '-' || matrix[i][j+1] == 'J' || matrix[i][j+1] == '7' || matrix[i][j+1] == 'S') {
|
||||
connection_map.insert(Coordinate { x: j, y: i}, vec![Coordinate { x: j-1, y: i}, Coordinate { x: j+1, y: i}]);
|
||||
}
|
||||
},
|
||||
'L' => {
|
||||
if i > 0 && (matrix[i-1][j] == '|' || matrix[i-1][j] == '7' || matrix[i-1][j] == 'F' || matrix[i-1][j] == 'S') && j < matrix[i].len()-1 && (matrix[i][j+1] == '-' || matrix[i][j+1] == '7' || matrix[i][j+1] == 'J' || matrix[i][j+1] == 'S') {
|
||||
connection_map.insert(Coordinate { x: j, y: i}, vec![Coordinate { x: j, y: i-1}, Coordinate { x: j+1, y: i}]);
|
||||
}
|
||||
}
|
||||
'J' => {
|
||||
if i > 0 && (matrix[i-1][j] == '|' || matrix[i-1][j] == '7' || matrix[i-1][j] == 'F' || matrix[i-1][j] == 'S') && j > 0 && (matrix[i][j-1] == '-' || matrix[i][j-1] == 'L' || matrix[i][j-1] == 'F' || matrix[i][j-1] == 'S' ) {
|
||||
connection_map.insert(Coordinate { x: j, y: i}, vec![Coordinate { x: j, y: i-1}, Coordinate { x: j-1, y: i}]);
|
||||
}
|
||||
}
|
||||
'7' => {
|
||||
if i < matrix.len()-1 && (matrix[i+1][j] == '|' || matrix[i+1][j] == 'L' || matrix[i+1][j] == 'J' || matrix[i+1][j] == 'S') && j > 0 && (matrix[i][j-1] == '-' || matrix[i][j-1] == 'L' || matrix[i][j-1] == 'F' || matrix[i][j-1] == 'S' ) {
|
||||
connection_map.insert(Coordinate { x: j, y: i}, vec![Coordinate { x: j, y: i+1}, Coordinate { x: j-1, y: i}]);
|
||||
}
|
||||
}
|
||||
'F' => {
|
||||
if i < matrix.len()-1 && (matrix[i+1][j] == '|' || matrix[i+1][j] == 'L' || matrix[i+1][j] == 'J' || matrix[i+1][j] == 'S') && j < matrix[i].len()-1 && (matrix[i][j+1] == '-' || matrix[i][j+1] == '7' || matrix[i][j+1] == 'J' || matrix[i][j+1] == 'S') {
|
||||
connection_map.insert(Coordinate { x: j, y: i}, vec![Coordinate { x: j, y: i+1}, Coordinate { x: j+1, y: i}]);
|
||||
}
|
||||
}
|
||||
'S' => {
|
||||
starting_point = Coordinate{x: j, y: i};
|
||||
let mut to_insert: Vec<Coordinate> = Vec::new();
|
||||
if i > 0 && (matrix[i-1][j] == '|' || matrix[i-1][j] == '7' || matrix[i-1][j] == 'F') {
|
||||
to_insert.push(Coordinate { x: j, y: i-1})
|
||||
}
|
||||
if i < matrix.len()-1 && (matrix[i+1][j] == '|' || matrix[i+1][j] == 'L' || matrix[i+1][j] == 'J') {
|
||||
to_insert.push(Coordinate { x: j, y: i+1})
|
||||
}
|
||||
if j > 0 && (matrix[i][j-1] == '-' || matrix[i][j-1] == 'L' || matrix[i][j-1] == 'F'){
|
||||
to_insert.push(Coordinate { x: j-1, y: i})
|
||||
}
|
||||
if j < matrix[i].len()-1 && (matrix[i][j+1] == '-' || matrix[i][j+1] == 'J' || matrix[i][j+1] == '7') {
|
||||
to_insert.push(Coordinate { x: j+1, y: i})
|
||||
}
|
||||
connection_map.insert(Coordinate { x: j, y: i}, to_insert);
|
||||
},
|
||||
_ => continue,
|
||||
}
|
||||
}
|
||||
}
|
||||
for i in 0..connection_map[&starting_point].len()-1 {
|
||||
let mut current_coordinate = connection_map[&starting_point][i];
|
||||
let mut prev_coordinate = starting_point;
|
||||
let mut count = 1;
|
||||
while current_coordinate != starting_point && connection_map.get(¤t_coordinate).is_some() {
|
||||
count += 1;
|
||||
for j in 0..connection_map[¤t_coordinate].len() {
|
||||
if connection_map[¤t_coordinate][j] != prev_coordinate {
|
||||
prev_coordinate = current_coordinate;
|
||||
current_coordinate = connection_map[¤t_coordinate][j];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if current_coordinate == starting_point {
|
||||
println!("{}", count/2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
268
src/10part2.rs
Normal file
268
src/10part2.rs
Normal file
|
@ -0,0 +1,268 @@
|
|||
use std::{fs, collections::HashMap};
|
||||
|
||||
#[derive(Eq, PartialEq, Hash, Copy, Clone, Debug)]
|
||||
struct Coordinate {
|
||||
x: usize,
|
||||
y: usize,
|
||||
}
|
||||
|
||||
#[derive(Eq, PartialEq)]
|
||||
enum InLoop {
|
||||
Loop = 1,
|
||||
Outside = 2,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let file_path = "input/10input.txt";
|
||||
let contents = fs::read_to_string(file_path).expect("should read file");
|
||||
let mut lines = contents.lines();
|
||||
let mut matrix: Vec<Vec<char>> = Vec::new();
|
||||
loop {
|
||||
match lines.next() {
|
||||
Some(line) => {
|
||||
matrix.push(line.chars().collect());
|
||||
},
|
||||
None => break,
|
||||
}
|
||||
}
|
||||
let mut connection_map: HashMap<Coordinate, Vec<Coordinate>> = HashMap::new();
|
||||
let mut starting_point: Coordinate = Coordinate { x: 0, y: 0};
|
||||
for i in 0..matrix.len() {
|
||||
for j in 0..matrix[i].len() {
|
||||
match matrix[i][j] {
|
||||
'|' => {
|
||||
if i > 0 && (matrix[i-1][j] == '|' || matrix[i-1][j] == '7' || matrix[i-1][j] == 'F' || matrix[i-1][j] == 'S') && i < matrix.len()-1 && (matrix[i+1][j] == '|' || matrix[i+1][j] == 'L' || matrix[i+1][j] == 'J' || matrix[i+1][j] == 'S') {
|
||||
connection_map.insert(Coordinate { x: j, y: i}, vec![Coordinate { x: j, y: i-1}, Coordinate { x: j, y: i+1}]);
|
||||
}
|
||||
},
|
||||
'-' => {
|
||||
if j > 0 && (matrix[i][j-1] == '-' || matrix[i][j-1] == 'L' || matrix[i][j-1] == 'F' || matrix[i][j-1] == 'S') && j < matrix[i].len()-1 && (matrix[i][j+1] == '-' || matrix[i][j+1] == 'J' || matrix[i][j+1] == '7' || matrix[i][j+1] == 'S') {
|
||||
connection_map.insert(Coordinate { x: j, y: i}, vec![Coordinate { x: j-1, y: i}, Coordinate { x: j+1, y: i}]);
|
||||
}
|
||||
},
|
||||
'L' => {
|
||||
if i > 0 && (matrix[i-1][j] == '|' || matrix[i-1][j] == '7' || matrix[i-1][j] == 'F' || matrix[i-1][j] == 'S') && j < matrix[i].len()-1 && (matrix[i][j+1] == '-' || matrix[i][j+1] == '7' || matrix[i][j+1] == 'J' || matrix[i][j+1] == 'S') {
|
||||
connection_map.insert(Coordinate { x: j, y: i}, vec![Coordinate { x: j, y: i-1}, Coordinate { x: j+1, y: i}]);
|
||||
}
|
||||
}
|
||||
'J' => {
|
||||
if i > 0 && (matrix[i-1][j] == '|' || matrix[i-1][j] == '7' || matrix[i-1][j] == 'F' || matrix[i-1][j] == 'S') && j > 0 && (matrix[i][j-1] == '-' || matrix[i][j-1] == 'L' || matrix[i][j-1] == 'F' || matrix[i][j-1] == 'S' ) {
|
||||
connection_map.insert(Coordinate { x: j, y: i}, vec![Coordinate { x: j, y: i-1}, Coordinate { x: j-1, y: i}]);
|
||||
}
|
||||
}
|
||||
'7' => {
|
||||
if i < matrix.len()-1 && (matrix[i+1][j] == '|' || matrix[i+1][j] == 'L' || matrix[i+1][j] == 'J' || matrix[i+1][j] == 'S') && j > 0 && (matrix[i][j-1] == '-' || matrix[i][j-1] == 'L' || matrix[i][j-1] == 'F' || matrix[i][j-1] == 'S' ) {
|
||||
connection_map.insert(Coordinate { x: j, y: i}, vec![Coordinate { x: j, y: i+1}, Coordinate { x: j-1, y: i}]);
|
||||
}
|
||||
}
|
||||
'F' => {
|
||||
if i < matrix.len()-1 && (matrix[i+1][j] == '|' || matrix[i+1][j] == 'L' || matrix[i+1][j] == 'J' || matrix[i+1][j] == 'S') && j < matrix[i].len()-1 && (matrix[i][j+1] == '-' || matrix[i][j+1] == '7' || matrix[i][j+1] == 'J' || matrix[i][j+1] == 'S') {
|
||||
connection_map.insert(Coordinate { x: j, y: i}, vec![Coordinate { x: j, y: i+1}, Coordinate { x: j+1, y: i}]);
|
||||
}
|
||||
}
|
||||
'S' => {
|
||||
starting_point = Coordinate{x: j, y: i};
|
||||
let mut to_insert: Vec<Coordinate> = Vec::new();
|
||||
if i > 0 && (matrix[i-1][j] == '|' || matrix[i-1][j] == '7' || matrix[i-1][j] == 'F') {
|
||||
to_insert.push(Coordinate { x: j, y: i-1})
|
||||
}
|
||||
if i < matrix.len()-1 && (matrix[i+1][j] == '|' || matrix[i+1][j] == 'L' || matrix[i+1][j] == 'J') {
|
||||
to_insert.push(Coordinate { x: j, y: i+1})
|
||||
}
|
||||
if j > 0 && (matrix[i][j-1] == '-' || matrix[i][j-1] == 'L' || matrix[i][j-1] == 'F'){
|
||||
to_insert.push(Coordinate { x: j-1, y: i})
|
||||
}
|
||||
if j < matrix[i].len()-1 && (matrix[i][j+1] == '-' || matrix[i][j+1] == 'J' || matrix[i][j+1] == '7') {
|
||||
to_insert.push(Coordinate { x: j+1, y: i})
|
||||
}
|
||||
connection_map.insert(Coordinate { x: j, y: i}, to_insert);
|
||||
},
|
||||
_ => continue,
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut loop_path: Vec<Coordinate> = Vec::new();
|
||||
for i in 0..connection_map[&starting_point].len()-1 {
|
||||
let mut potential_loop = vec![starting_point, connection_map[&starting_point][i]];
|
||||
while *potential_loop.last().unwrap() != starting_point && connection_map.get(&potential_loop.last().unwrap()).is_some() {
|
||||
for j in 0..connection_map[potential_loop.last().unwrap()].len() {
|
||||
if connection_map[potential_loop.last().unwrap()][j] != potential_loop[potential_loop.len()-2] {
|
||||
potential_loop.push(connection_map[potential_loop.last().unwrap()][j]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if *potential_loop.last().unwrap() == starting_point {
|
||||
loop_path = potential_loop;
|
||||
break;
|
||||
}
|
||||
}
|
||||
let mut inside_loop: HashMap<Coordinate, InLoop> = HashMap::new();
|
||||
for i in loop_path {
|
||||
inside_loop.insert(i, InLoop::Loop);
|
||||
}
|
||||
for i in 0..matrix.len()/2+1 {
|
||||
for j in 0..matrix[i].len()/2+1 {
|
||||
if (!inside_loop.contains_key(&Coordinate{x:j, y:i}) || inside_loop[&Coordinate { x: j, y: i}] != InLoop::Loop) && ((i > 0 && inside_loop.contains_key(&Coordinate{x:j, y:i-1}) && inside_loop[&Coordinate{x:j, y:i-1}] == InLoop::Outside) || (j > 0 && inside_loop.contains_key(&Coordinate{x:j-1, y:i}) && inside_loop[&Coordinate{x:j-1, y:i}] == InLoop::Outside) || (i == 0 || j == 0)) {
|
||||
inside_loop.insert(Coordinate{x:j, y:i}, InLoop::Outside);
|
||||
}
|
||||
if (!inside_loop.contains_key(&Coordinate { x: j, y: matrix.len()-i-1}) || inside_loop[&Coordinate {x:j, y:matrix.len()-i-1}] != InLoop::Loop) && ((i > 0 && inside_loop.contains_key(&Coordinate{x:j, y:matrix.len()-i}) && inside_loop[&Coordinate{x:j, y:matrix.len()-i}] == InLoop::Outside) || (j > 0 && inside_loop.contains_key(&Coordinate{x:j-1, y:matrix.len()-i-1}) && inside_loop[&Coordinate{x:j-1, y:matrix.len()-i-1}] == InLoop::Outside) || (i == 0 || j == 0)) {
|
||||
inside_loop.insert(Coordinate{x:j, y:matrix.len()-i-1}, InLoop::Outside);
|
||||
}
|
||||
if (!inside_loop.contains_key(&Coordinate { x: matrix[i].len()-j-1, y: i}) || inside_loop[&Coordinate {x:matrix[i].len()-j-1, y:i}] != InLoop::Loop) && ((i > 0 && inside_loop.contains_key(&Coordinate{x:matrix[i].len()-j-1, y:i-1}) && inside_loop[&Coordinate{x:matrix[i].len()-j-1, y:i-1}] == InLoop::Outside) || (j > 0 && inside_loop.contains_key(&Coordinate{x:matrix[i].len()-j, y:i}) && inside_loop[&Coordinate{x:matrix[i].len()-j, y:i}] == InLoop::Outside) || (i == 0 || j == 0)) {
|
||||
inside_loop.insert(Coordinate{x:matrix[i].len()-j-1, y:i}, InLoop::Outside);
|
||||
}
|
||||
if (!inside_loop.contains_key(&Coordinate { x: matrix[i].len()-j-1, y: matrix.len()-i-1}) || inside_loop[&Coordinate {x:matrix[i].len()-j-1, y:matrix.len()-i-1}] != InLoop::Loop) && ((i > 0 && inside_loop.contains_key(&Coordinate{x:matrix[i].len()-j-1, y:matrix.len()-i}) && inside_loop[&Coordinate{x:matrix[i].len()-j-1, y:matrix.len()-i}] == InLoop::Outside) || (j > 0 && inside_loop.contains_key(&Coordinate{x:matrix[i].len()-j, y:matrix.len()-i-1}) && inside_loop[&Coordinate{x:matrix[i].len()-j, y:matrix.len()-i-1}] == InLoop::Outside) || (i == 0 || j == 0)) {
|
||||
inside_loop.insert(Coordinate{x:matrix[i].len()-j-1, y:matrix.len()-i-1}, InLoop::Outside);
|
||||
}
|
||||
}
|
||||
}
|
||||
for i in 0..matrix.len() {
|
||||
for j in 0..matrix[i].len() {
|
||||
if inside_loop.contains_key(&Coordinate { x: j, y: i}) {
|
||||
match inside_loop[&Coordinate{x:j, y:i}] {
|
||||
InLoop::Outside => print!("O"),
|
||||
InLoop::Loop => print!("{}", matrix[i][j]),
|
||||
}
|
||||
} else {
|
||||
print!("?")
|
||||
}
|
||||
}
|
||||
println!("");
|
||||
}
|
||||
let mut matrix_expanded: Vec<Vec<char>> = Vec::new();
|
||||
let mut unknown_list = Vec::new();
|
||||
for i in 0..matrix.len() {
|
||||
let mut row_a = Vec::new();
|
||||
let mut row_b = Vec::new();
|
||||
for j in 0..matrix[0].len() {
|
||||
if inside_loop.contains_key(&Coordinate{x: j, y: i}) {
|
||||
if inside_loop[&Coordinate{x: j, y: i}] == InLoop::Outside {
|
||||
row_a.push('O');
|
||||
row_a.push('O');
|
||||
row_b.push('O');
|
||||
row_b.push('O');
|
||||
} else if inside_loop[&Coordinate{x:j, y:i}] == InLoop::Loop {
|
||||
match matrix[i][j] {
|
||||
'|' => {
|
||||
row_a.push('|');
|
||||
row_b.push('|');
|
||||
if (i > 0 && matrix_expanded[i*2-1][j*2+1] == 'O') || i == 0 {
|
||||
row_a.push('O');
|
||||
row_b.push('O');
|
||||
} else {
|
||||
row_a.push('.');
|
||||
row_b.push('.');
|
||||
}
|
||||
},
|
||||
'-' => {
|
||||
row_a.push('-');
|
||||
row_a.push('-');
|
||||
if (j > 0 && row_b[row_b.len()-1] == 'O') || j == 0 {
|
||||
row_b.push('O');
|
||||
row_b.push('O');
|
||||
}
|
||||
else {
|
||||
row_b.push('.');
|
||||
row_b.push('.');
|
||||
}
|
||||
}
|
||||
'L' => {
|
||||
row_a.push('L');
|
||||
row_a.push('-');
|
||||
if (j > 0 && row_b[row_b.len()-1] == 'O') || j == 0 {
|
||||
row_b.push('O');
|
||||
row_b.push('O');
|
||||
}
|
||||
else {
|
||||
row_b.push('.');
|
||||
row_b.push('.');
|
||||
}
|
||||
},
|
||||
'J' => {
|
||||
row_a.push('J');
|
||||
if (j > 0 && row_b[row_b.len()-1] == 'O') || j == 0 || (i > 0 && matrix_expanded[i*2-1][j*2+1] == 'O') || i == 0 {
|
||||
row_a.push('O');
|
||||
row_b.push('O');
|
||||
row_b.push('O');
|
||||
}
|
||||
else {
|
||||
row_a.push('.');
|
||||
row_b.push('.');
|
||||
row_b.push('.');
|
||||
}
|
||||
},
|
||||
'7' => {
|
||||
row_a.push('7');
|
||||
row_b.push('|');
|
||||
if (i > 0 && matrix_expanded[i*2-1][j*2+1] == 'O') || i == 0 {
|
||||
row_a.push('O');
|
||||
row_b.push('O');
|
||||
} else {
|
||||
row_a.push('.');
|
||||
row_b.push('.');
|
||||
}
|
||||
},
|
||||
'F' => {
|
||||
row_a.push('F');
|
||||
row_a.push('-');
|
||||
row_b.push('|');
|
||||
row_b.push('.');
|
||||
},
|
||||
'S' => {
|
||||
row_a.push('S');
|
||||
row_a.push('-');
|
||||
row_b.push('|');
|
||||
row_b.push('.');
|
||||
}
|
||||
_ => {},
|
||||
}
|
||||
}
|
||||
} else {
|
||||
row_a.push('.');
|
||||
row_a.push('.');
|
||||
row_b.push('.');
|
||||
row_b.push('.');
|
||||
}
|
||||
}
|
||||
println!("{:?}\n{:?}", row_a, row_b);
|
||||
matrix_expanded.push(row_a);
|
||||
matrix_expanded.push(row_b);
|
||||
}
|
||||
let mut y = matrix_expanded.len() -2;
|
||||
while y > 0 {
|
||||
let mut x = matrix_expanded[y].len() - 2;
|
||||
while x > 0 {
|
||||
if matrix_expanded[y][x] != '.' {
|
||||
x -= 1;
|
||||
continue;
|
||||
} else if matrix_expanded[y][x-1] == 'O' || matrix_expanded[y-1][x] == 'O' || matrix_expanded[y][x+1] == 'O' || matrix_expanded[y+1][x] == 'O' {
|
||||
matrix_expanded[y][x] = 'O';
|
||||
x -= 1;
|
||||
} else {
|
||||
unknown_list.push(Coordinate{x, y});
|
||||
x -= 1;
|
||||
}
|
||||
}
|
||||
y -= 1;
|
||||
}
|
||||
let mut iters_since_last_update = 0;
|
||||
while unknown_list.len() > iters_since_last_update {
|
||||
let current = unknown_list.pop().unwrap();
|
||||
if matrix_expanded[current.y][current.x-1] == 'O' || matrix_expanded[current.y-1][current.x] == 'O' || matrix_expanded[current.y][current.x+1] == 'O' || matrix_expanded[current.y+1][current.x] == 'O' {
|
||||
matrix_expanded[current.y][current.x] = 'O';
|
||||
iters_since_last_update = 0;
|
||||
} else {
|
||||
iters_since_last_update += 1;
|
||||
unknown_list.insert(0, current);
|
||||
}
|
||||
}
|
||||
let mut count = 0;
|
||||
while unknown_list.len() > 0 {
|
||||
let current = unknown_list.pop().unwrap();
|
||||
if current.x % 2 == 0 && current.y % 2 == 0 {
|
||||
count+=1;
|
||||
}
|
||||
}
|
||||
println!("{}", count);
|
||||
}
|
Loading…
Reference in New Issue
Block a user