advent_of_code_2022/aoc_14b/src/main.rs

138 lines
4.5 KiB
Rust

use std::fs::File;
use std::io::{self, BufRead};
use std::path::Path;
use std::cmp::min;
use std::cmp::max;
#[derive(Clone, PartialEq)]
enum Cell {
Void,
Sand,
Wall,
}
fn main() {
let file_path = String::from("../aoc_14a/input");
println!("In file {}", file_path);
let mut data: Vec<Vec<Cell>> = vec![vec![Cell::Void; 1000]; 1000];
let mut min_x = 100000;
let mut max_x = 0;
let mut min_y = 100000;
let mut max_y = 0;
if let Ok(lines) = read_lines(file_path) {
// Consumes the iterator, returns an (Optional) String
for (i, line) in lines.enumerate() {
if let Ok(ip) = line {
let items: Vec<&str> = ip.split(" -> ").collect();
let mut x = items[1].split(",").collect::<Vec<&str>>()[0].parse::<usize>().unwrap();
let mut y = items[1].split(",").collect::<Vec<&str>>()[1].parse::<usize>().unwrap();
let mut prev_x = items[0].split(",").collect::<Vec<&str>>()[0].parse::<usize>().unwrap();
let mut prev_y = items[0].split(",").collect::<Vec<&str>>()[1].parse::<usize>().unwrap();
min_x = min(min_x, prev_x);
max_x = max(max_x, prev_x);
min_y = min(min_y, prev_y);
max_y = max(max_y, prev_y);
for v in items.iter().skip(2) {
match max(x, prev_x) - min(x, prev_x) {
0 => {
println!("draw vertical");
for i in min(y, prev_y)..max(y, prev_y) + 1 {
data[x][i] = Cell::Wall;
}
},
_ => {
println!("draw horizontal");
for i in min(x, prev_x)..max(x, prev_x) + 1 {
data[i][y] = Cell::Wall;
}
}
}
prev_x = x;
prev_y = y;
x = v.split(",").collect::<Vec<&str>>()[0].parse::<usize>().unwrap();
y = v.split(",").collect::<Vec<&str>>()[1].parse::<usize>().unwrap();
min_x = min(min_x, x);
max_x = max(max_x, x);
min_y = min(min_y, y);
max_y = max(max_y, y);
println!("{}", v);
}
match max(x, prev_x) - min(x, prev_x) {
0 => {
println!("draw vertical");
for i in min(y, prev_y)..max(y, prev_y) + 1 {
data[x][i] = Cell::Wall;
}
},
_ => {
println!("draw horizontal");
for i in min(x, prev_x)..max(x, prev_x) + 1 {
data[i][y] = Cell::Wall;
}
}
}
println!("{:#?}", items);
}
}
}
for i in 0..1000 {
data[i][max_y + 2] = Cell::Wall;
}
let mut sand_count = 0;
'outer: loop {
let mut x = 500;
let mut y = 0;
loop {
if data[500][0] == Cell::Sand {
break 'outer;
}
if data[x][y + 1] == Cell::Void {
y += 1;
}
else if data[x - 1][y + 1] == Cell::Void {
x -= 1;
y += 1;
}
else if data[x + 1][y + 1] == Cell::Void {
x += 1;
y += 1;
}
else {
sand_count += 1;
data[x][y] = Cell::Sand;
break;
}
}
}
if min_y > 1 {
min_y -= 2;
}
if min_x > 1 {
min_x -= 2;
}
let dx = max_x - min_x;
for i in 0..max_y + 4 {
for j in min_x - dx..max_x + dx {
match data[j][i] {
Cell::Void => print!("."),
Cell::Wall => print!("#"),
Cell::Sand => print!("o"),
}
}
println!("");
}
println!("{} {} {} {}", min_x, max_x, min_y, max_y);
println!("{}", sand_count);
}
fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
where P: AsRef<Path>, {
let file = File::open(filename)?;
Ok(io::BufReader::new(file).lines())
}