Skip to content

Instantly share code, notes, and snippets.

@weirddan455
Created July 7, 2024 14:45
Show Gist options
  • Save weirddan455/3d4c728d19ca6da1197b800da0de002a to your computer and use it in GitHub Desktop.
Save weirddan455/3d4c728d19ca6da1197b800da0de002a to your computer and use it in GitHub Desktop.
Advent of Code 2023 Day 14 Part 2
struct Grid {
width: usize,
height: usize,
data: Vec<u8>
}
fn get_grid() -> Grid {
let mut grid = Grid {
width: 0,
height: 0,
data: std::fs::read("input").unwrap()
};
grid.width = grid.data.iter().position(|c| *c == b'\n').unwrap();
grid.data.retain(|c| *c != b'\n');
grid.height = grid.data.len() / grid.width;
assert!(grid.data.len() % grid.width == 0);
return grid;
}
fn rotate_north(grid: &mut Grid) {
for y in 1..grid.height {
for x in 0..grid.width {
let index = y * grid.width + x;
if grid.data[index] == b'O' {
let mut move_to = index;
for col in (0..y).rev() {
let test = col * grid.width + x;
if grid.data[test] != b'.' {
break;
}
move_to = test;
}
grid.data.swap(index, move_to);
}
}
}
}
fn rotate_south(grid: &mut Grid) {
for y in (0..grid.height - 1).rev() {
for x in 0..grid.width {
let index = y * grid.width + x;
if grid.data[index] == b'O' {
let mut move_to = index;
for col in y + 1..grid.height {
let test = col * grid.width + x;
if grid.data[test] != b'.' {
break;
}
move_to = test;
}
grid.data.swap(index, move_to);
}
}
}
}
fn rotate_west(grid: &mut Grid) {
for x in 1..grid.width {
for y in 0..grid.height {
let index = y * grid.width + x;
if grid.data[index] == b'O' {
let mut move_to = index;
for row in (0..x).rev() {
let test = y * grid.width + row;
if grid.data[test] != b'.' {
break;
}
move_to = test;
}
grid.data.swap(index, move_to);
}
}
}
}
fn rotate_east(grid: &mut Grid) {
for x in (0..grid.width - 1).rev() {
for y in 0..grid.height {
let index = y * grid.width + x;
if grid.data[index] == b'O' {
let mut move_to = index;
for row in x + 1..grid.width {
let test = y * grid.width + row;
if grid.data[test] != b'.' {
break;
}
move_to = test;
}
grid.data.swap(index, move_to);
}
}
}
}
fn main() {
let mut grid = get_grid();
for i in 0..1000000000 {
rotate_north(&mut grid);
rotate_west(&mut grid);
rotate_south(&mut grid);
rotate_east(&mut grid);
if i % 100000 == 0 {
let percentage = i as f64 / 10000000.0;
println!("{percentage}%");
}
}
let mut answer = 0;
let mut mul = grid.height;
for y in 0..grid.height {
let mut num_rocks = 0;
for x in 0..grid.width {
if grid.data[y * grid.width + x] == b'O' {
num_rocks += 1;
}
}
answer += num_rocks * mul;
mul -= 1;
}
println!("\nAnswer: {answer}");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment