day9
This commit is contained in:
		
							parent
							
								
									b522357495
								
							
						
					
					
						commit
						51035e0c4f
					
				| @ -1,7 +1,6 @@ | ||||
| use hashbrown::{HashMap, HashSet}; | ||||
| 
 | ||||
| use aoc_runner_derive::{aoc, aoc_generator}; | ||||
| use num::integer::gcd; | ||||
| 
 | ||||
| type Input = ((isize, isize), Vec<Vec<(isize, isize)>>); | ||||
| 
 | ||||
| @ -94,6 +93,7 @@ mod tests { | ||||
|             )), | ||||
|             14 | ||||
|         ); | ||||
|         assert_eq!(part1(&parse(include_str!("../input/2024/day8.txt"))), 273); | ||||
|     } | ||||
| 
 | ||||
|     #[test] | ||||
| @ -104,7 +104,6 @@ mod tests { | ||||
|             )), | ||||
|             34 | ||||
|         ); | ||||
| 
 | ||||
|         assert_eq!(part2(&parse(include_str!("../input/2024/day8.txt"))), 1017); | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										106
									
								
								aoc_2024/src/day9.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								aoc_2024/src/day9.rs
									
									
									
									
									
										Normal file
									
								
							| @ -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 day2; | ||||
| mod day3; | ||||
| @ -6,6 +5,8 @@ mod day4; | ||||
| mod day5; | ||||
| mod day6; | ||||
| mod day7; | ||||
| mod day8; | ||||
| mod day9; | ||||
| 
 | ||||
| extern crate aoc_runner; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jan-Bulthuis
						Jan-Bulthuis