This commit is contained in:
JonOfUs 2022-12-10 16:06:36 +01:00
parent 168479c5b1
commit a87505aa6d
3 changed files with 225 additions and 1 deletions

143
res/10/input.txt Normal file
View file

@ -0,0 +1,143 @@
addx 2
addx 3
noop
noop
addx 1
addx 5
addx -1
addx 5
addx 1
noop
noop
addx 4
noop
noop
addx 5
addx -5
addx 6
addx 3
addx 1
addx 5
addx 1
noop
addx -38
addx 41
addx -22
addx -14
addx 7
noop
noop
addx 3
addx -2
addx 2
noop
addx 17
addx -12
addx 5
addx 2
addx -16
addx 17
addx 2
addx 5
addx 2
addx -30
noop
addx -6
addx 1
noop
addx 5
noop
noop
noop
addx 5
addx -12
addx 17
noop
noop
noop
noop
addx 5
addx 10
addx -9
addx 2
addx 5
addx 2
addx -5
addx 6
addx 4
noop
noop
addx -37
noop
noop
addx 17
addx -12
addx 30
addx -23
addx 2
noop
addx 3
addx -17
addx 22
noop
noop
noop
addx 5
noop
addx -10
addx 11
addx 4
noop
addx 5
addx -2
noop
addx -6
addx -29
addx 37
addx -30
addx 27
addx -2
addx -22
noop
addx 3
addx 2
noop
addx 7
addx -2
addx 2
addx 5
addx -5
addx 6
addx 2
addx 2
addx 5
addx -25
noop
addx -10
noop
addx 1
noop
addx 2
noop
noop
noop
noop
addx 7
addx 1
addx 4
addx 1
noop
addx 2
noop
addx 3
addx 5
addx -1
noop
addx 3
addx 5
addx 2
addx 1
noop
noop
noop
noop

79
src/days/d10.rs Normal file
View file

@ -0,0 +1,79 @@
use std::fs;
pub fn solve() {
let path = "res/10/input.txt";
let contents = fs::read_to_string(path).expect("I/O error, wrong path?");
let lines: Vec<&str> = contents
.lines()
.filter(|line| *line != "")
.collect();
let mut reg_x = 1;
let mut cycle = 0;
let mut signal_strengths = Vec::<i32>::new();
let mut crt = Vec::<bool>::new();
// parse commands line by line
lines.iter().for_each(|line| {
let parts: Vec<&str> = line.split_whitespace().collect();
match parts[0] {
"noop" => {
// increase cycle 1 time
cycle += 1;
if rel_cycle(cycle) {
signal_strengths.push(cycle*reg_x);
}
crt.push(sprite_draw(cycle, reg_x));
},
"addx" => {
// increase cycle 2 times
(0..2).for_each(|_| {
cycle += 1;
if rel_cycle(cycle) {
signal_strengths.push(cycle*reg_x);
}
crt.push(sprite_draw(cycle, reg_x));
});
// change regX according to parameter
reg_x += parts[1].parse::<i32>().unwrap();
},
_ => {}
}
});
let res: i32 = signal_strengths.iter().sum();
println!("Result 1: {}", res);
println!("Result 2: ");
let mut print_buffer = "".to_string();
// print the crt line by line
crt.iter().enumerate().for_each(|(i, p)| {
if *p { print_buffer += "#" }
else { print_buffer += "." }
// print buffer if a line is completed
if (i+1) % 40 == 0 {
println!("{}", print_buffer);
print_buffer = "".to_string();
}
})
}
// returns whether the passed cycle is a relevant one
fn rel_cycle(cycle: i32) -> bool {
if (cycle-20) % 40 == 0 && cycle >= 20 {
true
} else {
false
}
}
// returns whether the sprite is currently in a position to draw a pixel
fn sprite_draw(cycle: i32, reg_x: i32) -> bool {
return ((cycle-1)%40).abs_diff(reg_x) <= 1
}

View file

@ -1,7 +1,7 @@
pub mod days;
fn main() {
days::d09::solve()
days::d10::solve()
}
fn _all_days() {
@ -23,4 +23,6 @@ fn _all_days() {
days::d08::solve();
println!("\nDay 9");
days::d09::solve();
println!("\nDay 10");
days::d10::solve();
}