solved day 5
Dieser Commit ist enthalten in:
Ursprung
90d400eb37
Commit
da8b25b4e2
1 geänderte Dateien mit 87 neuen und 0 gelöschten Zeilen
87
days/2024/05.rs
Normale Datei
87
days/2024/05.rs
Normale Datei
|
@ -0,0 +1,87 @@
|
|||
use advent_of_code::strings::{convert_to_array, parsenumber};
|
||||
use advent_of_code_macros::include_aoc;
|
||||
use log::*;
|
||||
include_aoc!(DATA, 2024, 05, 2);
|
||||
|
||||
fn correct_sum(updates: Vec<Vec<u32>>, orders: Vec<(u32, u32)>) -> u32 {
|
||||
let mut correct_numbers = 0;
|
||||
'updateloop: for update in updates.clone().iter() {
|
||||
for order in orders.clone() {
|
||||
let (mut beforepos, mut afterpos) = (update.len(), update.len());
|
||||
for i in 0..update.len() {
|
||||
if update[i] == order.0 {
|
||||
beforepos = i
|
||||
} else if update[i] == order.1 {
|
||||
afterpos = i
|
||||
}
|
||||
}
|
||||
if beforepos != update.len() && afterpos != update.len() {
|
||||
if beforepos > afterpos {
|
||||
continue 'updateloop;
|
||||
}
|
||||
}
|
||||
}
|
||||
let centerpos = if update.len() % 2 == 1 {
|
||||
(update.len() - 1) / 2
|
||||
} else {
|
||||
update.len() / 2
|
||||
};
|
||||
debug!("Adding {}: {:?}", update[centerpos], update);
|
||||
correct_numbers += update[centerpos]
|
||||
}
|
||||
correct_numbers
|
||||
}
|
||||
|
||||
fn incorrect_sum(updates: Vec<Vec<u32>>, orders: Vec<(u32, u32)>) -> u32 {
|
||||
let mut numbers = 0;
|
||||
'updateloop: for update in updates.clone().iter_mut() {
|
||||
let mut broken;
|
||||
let mut was_broken = false;
|
||||
loop {
|
||||
broken = false;
|
||||
for order in orders.clone() {
|
||||
let (mut beforepos, mut afterpos) = (update.len(), update.len());
|
||||
for i in 0..update.len() {
|
||||
if update[i] == order.0 {
|
||||
beforepos = i
|
||||
} else if update[i] == order.1 {
|
||||
afterpos = i
|
||||
}
|
||||
}
|
||||
if beforepos != update.len() && afterpos != update.len() {
|
||||
if beforepos > afterpos {
|
||||
(update[beforepos], update[afterpos]) = (update[afterpos], update[beforepos]);
|
||||
debug!("switching {} with {} in {:?}", update[beforepos], update[afterpos], update);
|
||||
broken = true;
|
||||
was_broken = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if !was_broken {
|
||||
continue 'updateloop;
|
||||
}
|
||||
if !broken {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
let centerpos = if update.len() % 2 == 1 {
|
||||
(update.len() - 1) / 2
|
||||
} else {
|
||||
update.len() / 2
|
||||
};
|
||||
debug!("Adding {}: {:?}", update[centerpos], update);
|
||||
numbers += update[centerpos]
|
||||
}
|
||||
numbers
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let update_order = convert_to_array::<_, _, '\n'>(DATA_1, |l| {
|
||||
let x = l.split_once('|').unwrap();
|
||||
(parsenumber(x.0), parsenumber(x.1))
|
||||
});
|
||||
let updates: Vec<Vec<u32>> = convert_to_array::<_, _, '\n'>(DATA_2, |line| line.split(',').map(parsenumber).collect());
|
||||
println!("The Sum of the center of the correct numbers are {}", correct_sum(updates.clone(), update_order.clone()));
|
||||
println!("The Sum of the center of the incorrect numbers are {}", incorrect_sum(updates.clone(), update_order.clone()));
|
||||
}
|
Laden …
Tabelle hinzufügen
In neuem Issue referenzieren