Skip to content

Commit 5153d58

Browse files
committed
finish day20
1 parent 3eb5aad commit 5153d58

File tree

3 files changed

+52
-0
lines changed

3 files changed

+52
-0
lines changed

examples/day_20.rs

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
use aoc_2022::day_20::{parsing, part_1, part_2};
2+
use aoc_2022::utils;
3+
4+
fn main() {
5+
let lines = utils::read_lines("inputs/day_20").unwrap();
6+
let nums = parsing(&lines);
7+
println!("part 1: {}", part_1(&nums));
8+
println!("part 2: {}", part_2(&nums));
9+
}

src/day_20.rs

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use std::str::FromStr;
2+
3+
pub fn parsing(lines: &Vec<String>) -> Vec<i32> {
4+
lines.iter().map(|x| i32::from_str(x).unwrap()).collect()
5+
}
6+
7+
pub fn part_1(nums: &Vec<i32>) -> i32 {
8+
let cycle = nums.len() as i32;
9+
let mut nums_positions= (0..cycle as usize).collect::<Vec<usize>>();
10+
let mut zero_original_pos = 0;
11+
for (i, num) in nums.iter().enumerate() {
12+
let pos = (nums_positions.iter().position(|x| *x == i).unwrap()) as i32;
13+
let step = (*num).rem_euclid(cycle-1);
14+
for i in 0..step {
15+
(nums_positions[(pos+i).rem_euclid(cycle) as usize], nums_positions[(pos+i+1).rem_euclid(cycle) as usize]) = (nums_positions[(pos+i+1).rem_euclid(cycle) as usize], nums_positions[(pos+i).rem_euclid(cycle) as usize]);
16+
}
17+
if *num == 0 {
18+
zero_original_pos = i;
19+
}
20+
}
21+
let zero_pos = (nums_positions.iter().position(|x| *x == zero_original_pos).unwrap()) as i32;
22+
nums[nums_positions[(zero_pos+1000).rem_euclid(cycle) as usize]] + nums[nums_positions[(zero_pos+2000).rem_euclid(cycle) as usize]] + nums[nums_positions[(zero_pos+3000).rem_euclid(cycle) as usize]]
23+
}
24+
25+
pub fn part_2(nums: &Vec<i32>) -> i64 {
26+
let cycle = nums.len() as i32;
27+
let mut nums_positions= (0..cycle as usize).collect::<Vec<usize>>();
28+
let mut zero_original_pos = 0;
29+
for (i, num) in nums.iter().enumerate().cycle().take((cycle * 10) as usize) {
30+
let pos = (nums_positions.iter().position(|x| *x == i).unwrap()) as i32;
31+
let step = ((811589153 as i32).rem_euclid(cycle-1) * (*num).rem_euclid(cycle-1)).rem_euclid(cycle-1);
32+
for i in 0..step {
33+
(nums_positions[(pos+i).rem_euclid(cycle) as usize], nums_positions[(pos+i+1).rem_euclid(cycle) as usize]) = (nums_positions[(pos+i+1).rem_euclid(cycle) as usize], nums_positions[(pos+i).rem_euclid(cycle) as usize]);
34+
}
35+
if *num == 0 {
36+
zero_original_pos = i;
37+
}
38+
}
39+
// println!("{:?}", nums_positions);
40+
let zero_pos = (nums_positions.iter().position(|x| *x == zero_original_pos).unwrap()) as i32;
41+
(811589153 as i64) * (nums[nums_positions[(zero_pos+1000).rem_euclid(cycle) as usize]] + nums[nums_positions[(zero_pos+2000).rem_euclid(cycle) as usize]] + nums[nums_positions[(zero_pos+3000).rem_euclid(cycle) as usize]]) as i64
42+
}

src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ pub mod day_15;
1919
pub mod day_16;
2020
pub mod day_17;
2121
pub mod day_18;
22+
pub mod day_20;

0 commit comments

Comments
 (0)