Skip to content

Instantly share code, notes, and snippets.

@weirddan455
Last active June 27, 2024 13:49
Show Gist options
  • Save weirddan455/d70e7ec38976c4f33615599997679ec2 to your computer and use it in GitHub Desktop.
Save weirddan455/d70e7ec38976c4f33615599997679ec2 to your computer and use it in GitHub Desktop.
Advent of Code 2023 Day 5 Part 2
#[derive(Default)]
struct Map {
dst: u64,
src: u64,
range: u64
}
#[derive(Default)]
struct Seed {
start: u64,
len: u64
}
#[derive(Default)]
struct Almanac {
seeds: Vec<Seed>,
maps: [Vec<Map>; 7]
}
fn is_digit(c: u8) -> bool {
return c >= b'0' && c <= b'9';
}
fn get_almanac() -> Almanac {
let mut almanac: Almanac = Default::default();
let data = std::fs::read("input").unwrap();
let mut i = 0;
while data[i] != b':' {
i += 1;
}
i += 2;
'seeds: loop {
let mut seed: Seed = Default::default();
assert!(is_digit(data[i]));
while is_digit(data[i]) {
seed.start *= 10;
seed.start += (data[i] - b'0') as u64;
i += 1;
}
i += 1;
assert!(is_digit(data[i]));
while is_digit(data[i]) {
seed.len *= 10;
seed.len += (data[i] - b'0') as u64;
i += 1;
}
almanac.seeds.push(seed);
while !is_digit(data[i]) {
if data[i] == b':' {
i += 2;
break 'seeds;
}
i += 1;
}
}
let mut m = 0;
loop {
let mut map: Map = Default::default();
assert!(is_digit(data[i]));
while is_digit(data[i]) {
map.dst *= 10;
map.dst += (data[i] - b'0') as u64;
i += 1;
}
i += 1;
assert!(is_digit(data[i]));
while is_digit(data[i]) {
map.src *= 10;
map.src += (data[i] - b'0') as u64;
i += 1;
}
i += 1;
assert!(is_digit(data[i]));
while is_digit(data[i]) {
map.range *= 10;
map.range += (data[i] - b'0') as u64;
i += 1;
}
almanac.maps[m].push(map);
assert!(data[i] == b'\n');
i += 1;
if i >= data.len() {
assert!(m == 6);
break;
}
if data[i] == b'\n' {
m += 1;
if m > 6 {
break;
}
while !is_digit(data[i]) {
i += 1;
}
}
}
return almanac;
}
fn main() {
let almanac = get_almanac();
let mut answer = u64::MAX;
for seed in almanac.seeds {
for mut key in seed.start..seed.start + seed.len {
for map in &almanac.maps {
for m in map {
if key >= m.src && key < m.src + m.range {
key = (key - m.src) + m.dst;
break;
}
}
}
answer = core::cmp::min(answer, key);
}
}
println!("Answer: {answer}");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment