Day 14 part 1 done
This commit is contained in:
parent
9b80143e37
commit
19d68fcfbd
119
2022/rust/src/day14.rs
Normal file
119
2022/rust/src/day14.rs
Normal file
|
@ -0,0 +1,119 @@
|
|||
use std::cmp::{max, min};
|
||||
use std::collections::HashMap;
|
||||
|
||||
mod common;
|
||||
|
||||
type XY = (i32, i32);
|
||||
type Map = HashMap<XY, char>;
|
||||
struct Input {
|
||||
map: Map,
|
||||
low_point: i32,
|
||||
}
|
||||
type Answer = usize;
|
||||
|
||||
fn processed_input(input: &str) -> Input {
|
||||
let mut map = HashMap::new();
|
||||
let mut low_point = i32::MIN;
|
||||
let mut set = |x, y, c| {
|
||||
println!("{}, {} -> {}", x, y, c);
|
||||
map.insert((x, y), c);
|
||||
if y > low_point {
|
||||
low_point = y + 1
|
||||
}
|
||||
};
|
||||
for l in input.lines() {
|
||||
println!("{}", l);
|
||||
let coords = l
|
||||
.split(" -> ")
|
||||
.map(|c| {
|
||||
let (x, y) = c.split_once(',').unwrap();
|
||||
(
|
||||
x.parse::<i32>().unwrap() + OFFSET.0,
|
||||
y.parse::<i32>().unwrap() + OFFSET.1,
|
||||
)
|
||||
})
|
||||
.collect::<Vec<XY>>();
|
||||
for i in 1..coords.len() {
|
||||
let a = coords[i - 1];
|
||||
let b = coords[i];
|
||||
if a.0 == b.0 {
|
||||
let x = a.0;
|
||||
for y in min(a.1, b.1)..=max(a.1, b.1) {
|
||||
set(x, y, '#');
|
||||
}
|
||||
} else {
|
||||
let y = a.1;
|
||||
for x in min(a.0, b.0)..=max(a.0, b.0) {
|
||||
set(x, y, '#');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return Input { map, low_point };
|
||||
}
|
||||
|
||||
const OFFSET: XY = (-500, 0);
|
||||
const SAND_LOC: XY = (0, 0);
|
||||
|
||||
fn fall_to_first_empty_or_void(map: &Map, void_height: i32) -> Result<XY, ()> {
|
||||
let (mut x, mut y) = (0, 0);
|
||||
while y < void_height {
|
||||
println!("{}", y);
|
||||
let ny = y + 1;
|
||||
match [(x, ny), (x - 1, ny), (x + 1, ny)]
|
||||
.iter()
|
||||
.find(|(x, y)| map.get(&(*x, *y)).is_none())
|
||||
{
|
||||
Some((nx, ny)) => (x, y) = (*nx, *ny),
|
||||
None => return Ok((x, y)),
|
||||
}
|
||||
}
|
||||
Err(())
|
||||
}
|
||||
|
||||
fn part1(input: &mut Input) -> Answer {
|
||||
println!("{}", input.low_point);
|
||||
let mut result = 0;
|
||||
loop {
|
||||
match fall_to_first_empty_or_void(&input.map, input.low_point) {
|
||||
Ok((x, y)) => input.map.insert((x, y), 'O'),
|
||||
Err(_) => break,
|
||||
};
|
||||
result += 1;
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
fn part2(input: &Input) -> Answer {
|
||||
0
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let input_text = common::day_input(14);
|
||||
eprintln!("{}\n\nAbove is your input file.\n\n", input_text);
|
||||
let mut input = processed_input(&input_text);
|
||||
let input2 = processed_input(&input_text);
|
||||
common::show_answers(&part1(&mut input), &part2(&input2))
|
||||
// common::show_both_answers(&both_parts(&input))
|
||||
}
|
||||
|
||||
// fn both_parts(input: &Input) -> (Answer, Answer) {
|
||||
// (0, 0)
|
||||
// }
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
const TEST_INPUT: &str = "498,4 -> 498,6 -> 496,6
|
||||
503,4 -> 502,4 -> 502,9 -> 494,9";
|
||||
|
||||
#[test]
|
||||
fn test() {
|
||||
let mut input = processed_input(TEST_INPUT);
|
||||
assert_eq!(part1(&mut input), 24);
|
||||
let input2 = processed_input(TEST_INPUT);
|
||||
assert_eq!(part2(&input2), 0);
|
||||
// assert_eq!(both_parts(&input), (0, 0));
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue