day9
This commit is contained in:
parent
b522357495
commit
51035e0c4f
|
@ -1,7 +1,6 @@
|
||||||
use hashbrown::{HashMap, HashSet};
|
use hashbrown::{HashMap, HashSet};
|
||||||
|
|
||||||
use aoc_runner_derive::{aoc, aoc_generator};
|
use aoc_runner_derive::{aoc, aoc_generator};
|
||||||
use num::integer::gcd;
|
|
||||||
|
|
||||||
type Input = ((isize, isize), Vec<Vec<(isize, isize)>>);
|
type Input = ((isize, isize), Vec<Vec<(isize, isize)>>);
|
||||||
|
|
||||||
|
@ -94,6 +93,7 @@ mod tests {
|
||||||
)),
|
)),
|
||||||
14
|
14
|
||||||
);
|
);
|
||||||
|
assert_eq!(part1(&parse(include_str!("../input/2024/day8.txt"))), 273);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -104,7 +104,6 @@ mod tests {
|
||||||
)),
|
)),
|
||||||
34
|
34
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(part2(&parse(include_str!("../input/2024/day8.txt"))), 1017);
|
assert_eq!(part2(&parse(include_str!("../input/2024/day8.txt"))), 1017);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
use aoc_runner_derive::{aoc, aoc_generator};
|
||||||
|
|
||||||
|
type Input = Vec<usize>;
|
||||||
|
|
||||||
|
#[aoc_generator(day9)]
|
||||||
|
fn parse(input: &str) -> Input {
|
||||||
|
input
|
||||||
|
.chars()
|
||||||
|
.map(|c| c.to_digit(10).unwrap() as usize)
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[aoc(day9, part1)]
|
||||||
|
fn part1(input: &Input) -> usize {
|
||||||
|
let mut sum = 0;
|
||||||
|
let mut len = input.chunks(2).map(|c| c[0]).sum::<usize>();
|
||||||
|
let mut l_idx = 0;
|
||||||
|
let mut l_pos = 0;
|
||||||
|
let mut r_idx = input.len() + 1;
|
||||||
|
let mut r_left = 0;
|
||||||
|
while len > 0 {
|
||||||
|
if l_idx % 2 == 0 {
|
||||||
|
for _ in 0..input[l_idx] {
|
||||||
|
// println!("l {}*{}", l_pos, l_idx / 2);
|
||||||
|
// print!("{}", l_idx / 2);
|
||||||
|
len -= 1;
|
||||||
|
sum += (l_idx / 2) * l_pos;
|
||||||
|
l_pos += 1;
|
||||||
|
if len == 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
l_idx += 1;
|
||||||
|
} else {
|
||||||
|
for _ in 0..input[l_idx] {
|
||||||
|
while r_left == 0 {
|
||||||
|
r_idx -= 2;
|
||||||
|
r_left = input[r_idx];
|
||||||
|
}
|
||||||
|
// println!("r {}*{}", l_pos, r_idx / 2);
|
||||||
|
// print!("{}", r_idx / 2);
|
||||||
|
len -= 1;
|
||||||
|
sum += (r_idx / 2) * l_pos;
|
||||||
|
l_pos += 1;
|
||||||
|
r_left -= 1;
|
||||||
|
if len == 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
l_idx += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sum
|
||||||
|
}
|
||||||
|
|
||||||
|
#[aoc(day9, part2)]
|
||||||
|
fn part2(input: &Input) -> usize {
|
||||||
|
let mut input = input
|
||||||
|
.iter()
|
||||||
|
.map(|c| (0, *c, *c))
|
||||||
|
.collect::<Vec<(usize, usize, usize)>>();
|
||||||
|
for i in 1..input.len() {
|
||||||
|
input[i].0 = input[i - 1].0 + input[i - 1].1;
|
||||||
|
}
|
||||||
|
// println!("{:?}", &input);
|
||||||
|
let mut sum = 0;
|
||||||
|
for r_idx in (0..input.len()).step_by(2).rev() {
|
||||||
|
let val = r_idx / 2;
|
||||||
|
let count = input[r_idx].2;
|
||||||
|
// println!("attempt: {:?}", input[r_idx]);
|
||||||
|
for l_idx in (1..r_idx).step_by(2) {
|
||||||
|
if input[l_idx].1 >= input[r_idx].2 {
|
||||||
|
// print!("{:?}", input[l_idx]);
|
||||||
|
input[r_idx].0 = input[l_idx].0;
|
||||||
|
input[l_idx].1 -= input[r_idx].2;
|
||||||
|
input[l_idx].0 += input[r_idx].2;
|
||||||
|
input[l_idx - 1].1 += input[r_idx].2;
|
||||||
|
// println!(" -> {:?}", input[l_idx]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i in 0..count {
|
||||||
|
// println!("{}*{}", (input[r_idx].0 + i), val);
|
||||||
|
sum += val * (input[r_idx].0 + i);
|
||||||
|
// input[r_idx].0 += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sum
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part1_example() {
|
||||||
|
assert_eq!(part1(&parse("2333133121414131402")), 1928);
|
||||||
|
// assert_eq!(part1(&parse(include_str!("../input/2024/day8.txt"))), 273);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part2_example() {
|
||||||
|
assert_eq!(part2(&parse("2333133121414131402")), 2858);
|
||||||
|
// assert_eq!(part2(&parse(include_str!("../input/2024/day8.txt"))), 1017);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,3 @@
|
||||||
mod day8;
|
|
||||||
mod day1;
|
mod day1;
|
||||||
mod day2;
|
mod day2;
|
||||||
mod day3;
|
mod day3;
|
||||||
|
@ -6,6 +5,8 @@ mod day4;
|
||||||
mod day5;
|
mod day5;
|
||||||
mod day6;
|
mod day6;
|
||||||
mod day7;
|
mod day7;
|
||||||
|
mod day8;
|
||||||
|
mod day9;
|
||||||
|
|
||||||
extern crate aoc_runner;
|
extern crate aoc_runner;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue