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); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										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 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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jan-Bulthuis
						Jan-Bulthuis