day_9: done but not validated
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -74,4 +74,5 @@ pub fn historian_hysteria() {
|
|||||||
|
|
||||||
// Monday 09
|
// Monday 09
|
||||||
let disk_checksum = mon_09::disk_fragmenter("./assets/day_9_disk_input");
|
let disk_checksum = mon_09::disk_fragmenter("./assets/day_9_disk_input");
|
||||||
|
println!("The disk checksum is {}", disk_checksum);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,59 @@
|
|||||||
use super::{utils::read_disk_map_input, DiskMap};
|
use super::{utils::read_disk_map_input, DiskChecksum, DiskMap};
|
||||||
|
|
||||||
pub fn disk_fragmenter(input: &str) -> usize {
|
// Last result: 6349343813585
|
||||||
|
|
||||||
|
pub fn disk_fragmenter(input: &str) -> DiskChecksum {
|
||||||
let disk_map = read_disk_map_input(input);
|
let disk_map = read_disk_map_input(input);
|
||||||
|
|
||||||
let organized_disk_map = organize_disk_map(&disk_map);
|
let organized_disk_map = organize_disk_map(disk_map);
|
||||||
println!("{:?}", disk_map);
|
|
||||||
println!("{:?}", organized_disk_map);
|
|
||||||
|
|
||||||
0
|
println!("Organized map: {:?}", organized_disk_map);
|
||||||
|
|
||||||
|
calc_disk_check_sum(&organized_disk_map)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn organize_disk_map(disk_map: &DiskMap) -> DiskMap {
|
pub fn organize_disk_map(mut disk_map: DiskMap) -> DiskMap {
|
||||||
let organized_disk_map: DiskMap = vec![];
|
let mut end_index: usize = disk_map.len() - 1;
|
||||||
|
let mut start_index: usize = 0;
|
||||||
|
|
||||||
for block in disk_map {}
|
'outer: loop {
|
||||||
|
if end_index <= start_index || start_index > disk_map.len() - 1 {
|
||||||
|
println!(
|
||||||
|
"Broke out of outer: {} {} with len {}",
|
||||||
|
start_index,
|
||||||
|
end_index,
|
||||||
|
disk_map.len()
|
||||||
|
);
|
||||||
|
break 'outer;
|
||||||
|
}
|
||||||
|
|
||||||
organized_disk_map
|
if let None = disk_map[start_index] {
|
||||||
|
'inner: loop {
|
||||||
|
if let Some(_) = disk_map[end_index] {
|
||||||
|
disk_map.swap(start_index, end_index);
|
||||||
|
end_index -= 1;
|
||||||
|
break 'inner;
|
||||||
|
}
|
||||||
|
end_index -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
start_index += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
disk_map
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn calc_disk_check_sum(disk_map: &DiskMap) -> DiskChecksum {
|
||||||
|
let mut checksum: DiskChecksum = 0;
|
||||||
|
|
||||||
|
for (block_index, block) in disk_map.iter().enumerate() {
|
||||||
|
if let Some(id) = block {
|
||||||
|
checksum += *id as DiskChecksum * block_index as DiskChecksum;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
checksum as DiskChecksum
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,3 +75,4 @@ pub type AntinodeList = HashSet<Antinode>;
|
|||||||
// Disk fragmenter
|
// Disk fragmenter
|
||||||
pub type Block = Option<usize>;
|
pub type Block = Option<usize>;
|
||||||
pub type DiskMap = Vec<Block>;
|
pub type DiskMap = Vec<Block>;
|
||||||
|
pub type DiskChecksum = usize;
|
||||||
|
|||||||
Reference in New Issue
Block a user