day 9 part 1
This commit is contained in:
74
src/day09.rs
Normal file
74
src/day09.rs
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
use std::fs::read_to_string;
|
||||||
|
|
||||||
|
pub fn day_main() {
|
||||||
|
let input = read_to_string("input/day09.txt").unwrap();
|
||||||
|
let input = input.trim();
|
||||||
|
println!(" part1: {}", part1(input));
|
||||||
|
println!(" part2: {}", part2(input));
|
||||||
|
}
|
||||||
|
|
||||||
|
type RiddleResult = usize;
|
||||||
|
|
||||||
|
fn part1(input: &str) -> RiddleResult {
|
||||||
|
let mut disk = Vec::with_capacity(input.len() * 10);
|
||||||
|
for (i, l) in input.chars().enumerate() {
|
||||||
|
let l = l.to_digit(10).unwrap();
|
||||||
|
let content = if i % 2 == 0 {
|
||||||
|
// file
|
||||||
|
Some(i / 2) // id based on order of apperance and every second one is a file
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
for j in 0..l {
|
||||||
|
disk.push(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// dbg!(disk);
|
||||||
|
let mut free = disk
|
||||||
|
.iter()
|
||||||
|
.enumerate()
|
||||||
|
.find(|(_, v)| v.is_none())
|
||||||
|
.unwrap()
|
||||||
|
.0;
|
||||||
|
let mut last_block = disk.len() - 1;
|
||||||
|
|
||||||
|
while free < last_block {
|
||||||
|
if disk[free].is_some() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
disk[free] = disk[last_block];
|
||||||
|
disk[last_block] = None;
|
||||||
|
while last_block > 0 && disk[last_block].is_none() {
|
||||||
|
last_block -= 1;
|
||||||
|
}
|
||||||
|
while free < disk.len() && disk[free].is_some() {
|
||||||
|
free += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
disk.into_iter()
|
||||||
|
.take(free)
|
||||||
|
.enumerate()
|
||||||
|
.map(|(i, v)| i * v.unwrap())
|
||||||
|
.sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(_input: &str) -> RiddleResult {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::{part1, part2};
|
||||||
|
|
||||||
|
const TEST_INPUT: &str = r"2333133121414131402";
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test1() {
|
||||||
|
assert_eq!(part1(TEST_INPUT), 1928);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test2() {
|
||||||
|
assert_eq!(part2(TEST_INPUT), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,4 +6,5 @@ pub mod day05;
|
|||||||
pub mod day06;
|
pub mod day06;
|
||||||
pub mod day07;
|
pub mod day07;
|
||||||
pub mod day08;
|
pub mod day08;
|
||||||
|
pub mod day09;
|
||||||
pub mod utils;
|
pub mod utils;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ fn main() {
|
|||||||
(6, day06::day_main),
|
(6, day06::day_main),
|
||||||
(7, day07::day_main),
|
(7, day07::day_main),
|
||||||
(8, day08::day_main),
|
(8, day08::day_main),
|
||||||
|
(9, day09::day_main),
|
||||||
]);
|
]);
|
||||||
let day: Option<u8> = args().nth(1).and_then(|a| a.parse().ok());
|
let day: Option<u8> = args().nth(1).and_then(|a| a.parse().ok());
|
||||||
let Some(day) = day else {
|
let Some(day) = day else {
|
||||||
|
|||||||
Reference in New Issue
Block a user