From 0b0e9bc0f42527874095687ed44fb9e112167789 Mon Sep 17 00:00:00 2001 From: Dory Date: Wed, 27 Mar 2024 20:02:43 -0700 Subject: [PATCH] d14p2 --- day14/src/main.rs | 14 +++++-- day14/src/main1.rs | 97 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 day14/src/main1.rs diff --git a/day14/src/main.rs b/day14/src/main.rs index d269ac0..e25c7b5 100644 --- a/day14/src/main.rs +++ b/day14/src/main.rs @@ -48,6 +48,13 @@ fn main() { } lists.push(list); } + + // part2 hack here + minx = 0; + maxx = 1000; + maxy = maxy + 2; + lists.push(vec![(minx, maxy), (maxx, maxy)]); + println!("{:?} {:?} {:?} {:?}", minx, miny, maxx, maxy); let mut map: Vec> = vec![vec!['.'; maxx - minx + 3]; maxy + 1]; @@ -74,9 +81,7 @@ fn main() { let (mut rockx, mut rocky) = (500, 0); 'rock: loop { //println!("{:?}, {:?}", rockx, rocky); - if rockx < minx || rockx > maxx || rocky == maxy { - break 'map; - } else if map[rocky + 1][rockx + 1 - minx] == '.' { + if map[rocky + 1][rockx + 1 - minx] == '.' { rocky = rocky + 1; } else if map[rocky + 1][rockx + 1 - minx - 1] == '.' { rocky = rocky + 1; @@ -87,6 +92,9 @@ fn main() { } else { map[rocky][rockx - minx + 1] = 'o'; total += 1; + if rockx == 500 && rocky == 0 { + break 'map; + } //print_map(&map); break 'rock; } diff --git a/day14/src/main1.rs b/day14/src/main1.rs new file mode 100644 index 0000000..d269ac0 --- /dev/null +++ b/day14/src/main1.rs @@ -0,0 +1,97 @@ +use std::env; +use std::fs::File; +use std::io::{BufReader, BufRead}; +use std::cmp::{min, max}; + +fn parse_num(s: &[u8]) -> (usize, usize) { + let mut num: usize = 0; + let mut len = 0; + for i in 0..s.len() { + if s[i].is_ascii_digit() { + num = num*10 + (s[i] as usize - '0' as usize); + len += 1; + } else { + break; + } + } + (num, len) +} + +fn print_map(map: &Vec>) { + for row in map { + let s: String = row.iter().collect(); + println!("{}", s); + } + println!(""); +} + +fn main() { + let file = File::open(&env::args().nth(1).expect("input")).expect("io err"); + let lines = BufReader::new(file).lines(); + let (mut minx, mut miny, mut maxx, mut maxy) = + (usize::MAX, usize::MAX, 0, 0); + let mut lists: Vec> = Vec::new(); + + for line in lines.flatten() { + let l_bytes = line.as_bytes(); + let mut cursor = 0; + let mut list: Vec<(usize, usize)> = Vec::new(); + while cursor < l_bytes.len() { + let (x, lenx) = parse_num(&l_bytes[cursor..]); + let (y, leny) = parse_num(&l_bytes[cursor + lenx + 1..]); + list.push((x, y)); + minx = if x < minx {x} else {minx}; + miny = if y < miny {y} else {miny}; + maxx = if x > maxx {x} else {maxx}; + maxy = if y > maxy {y} else {maxy}; + cursor = cursor + lenx + 1 + leny + 4; + } + lists.push(list); + } + println!("{:?} {:?} {:?} {:?}", minx, miny, maxx, maxy); + let mut map: Vec> = + vec![vec!['.'; maxx - minx + 3]; maxy + 1]; + for list in lists { + let (mut xprev, mut yprev) = &list[0]; + for (x, y) in &list[1..] { + if *x == xprev { + for ty in *min(y, &yprev)..=*max(y, &yprev) { + map[ty][*x - minx + 1] = '#'; + } + } else if *y == yprev { + for tx in *min(x, &xprev)..=*max(x, &xprev) { + map[*y][tx - minx + 1] = '#'; + } + } + xprev = *x; + yprev = *y; + } + } + print_map(&map); + + let mut total = 0; + 'map: loop { + let (mut rockx, mut rocky) = (500, 0); + 'rock: loop { + //println!("{:?}, {:?}", rockx, rocky); + if rockx < minx || rockx > maxx || rocky == maxy { + break 'map; + } else if map[rocky + 1][rockx + 1 - minx] == '.' { + rocky = rocky + 1; + } else if map[rocky + 1][rockx + 1 - minx - 1] == '.' { + rocky = rocky + 1; + rockx = rockx - 1; + } else if map[rocky + 1][rockx + 1 - minx + 1] == '.' { + rocky = rocky + 1; + rockx = rockx + 1; + } else { + map[rocky][rockx - minx + 1] = 'o'; + total += 1; + //print_map(&map); + break 'rock; + } + } + } + print_map(&map); + println!("{:?}", total); +}