d05
This commit is contained in:
parent
4d132cbe7c
commit
5dffb6f929
4 changed files with 1482 additions and 1 deletions
28
res/05/example
Normal file
28
res/05/example
Normal file
|
@ -0,0 +1,28 @@
|
|||
47|53
|
||||
97|13
|
||||
97|61
|
||||
97|47
|
||||
75|29
|
||||
61|13
|
||||
75|53
|
||||
29|13
|
||||
97|29
|
||||
53|29
|
||||
61|53
|
||||
97|53
|
||||
61|29
|
||||
47|13
|
||||
75|47
|
||||
97|75
|
||||
47|61
|
||||
75|61
|
||||
47|29
|
||||
75|13
|
||||
53|13
|
||||
|
||||
75,47,61,53,29
|
||||
97,61,53,29,13
|
||||
75,29,13
|
||||
75,97,47,61,53
|
||||
61,13,29
|
||||
97,13,75,29,47
|
1371
res/05/input
Normal file
1371
res/05/input
Normal file
File diff suppressed because it is too large
Load diff
82
src/days/d05.rs
Normal file
82
src/days/d05.rs
Normal file
|
@ -0,0 +1,82 @@
|
|||
use std::fs;
|
||||
|
||||
pub fn solve() {
|
||||
let path = "res/05/input";
|
||||
|
||||
let contents = fs::read_to_string(path).expect("Something went wrong reading the file");
|
||||
|
||||
let (rules_str, updates_str) = contents.split_once("\n\n").unwrap();
|
||||
|
||||
let rules: Vec<(usize, usize)> = rules_str
|
||||
.lines()
|
||||
.map(|s| {
|
||||
s.split_once("|")
|
||||
.map(|(n1, n2)| (n1.parse::<usize>().unwrap(), n2.parse::<usize>().unwrap()))
|
||||
.unwrap()
|
||||
})
|
||||
.collect();
|
||||
|
||||
let updates: Vec<Vec<usize>> = updates_str
|
||||
.lines()
|
||||
.map(|line| {
|
||||
line.split(",")
|
||||
.map(|n| n.parse::<usize>().unwrap())
|
||||
.collect::<Vec<usize>>()
|
||||
})
|
||||
.collect();
|
||||
|
||||
let result: usize = updates
|
||||
.iter()
|
||||
.filter(|upd| {
|
||||
upd.iter().enumerate().all(|(i, n)| {
|
||||
rules
|
||||
.iter()
|
||||
.filter(|(n1, _)| *n1 == *n)
|
||||
.all(|(_, n2)| upd.iter().take(i).all(|n| n != n2))
|
||||
})
|
||||
})
|
||||
.map(|upd| upd[(upd.len() / 2) as usize])
|
||||
.sum();
|
||||
|
||||
println!("Result 1: {}", result);
|
||||
|
||||
let result: usize = updates
|
||||
.iter()
|
||||
.filter(|upd| {
|
||||
!upd.iter().enumerate().all(|(i, n)| {
|
||||
rules
|
||||
.iter()
|
||||
.filter(|(n1, _)| *n1 == *n)
|
||||
.all(|(_, n2)| upd.iter().take(i).all(|n| n != n2))
|
||||
})
|
||||
})
|
||||
.map(|upd| {
|
||||
let mut upd = upd.clone();
|
||||
while upd.iter().enumerate().any(|(i, n)| {
|
||||
rules
|
||||
.iter()
|
||||
.filter(|(n1, _)| *n1 == *n)
|
||||
.any(|(_, n2)| upd.iter().take(i).any(|n| n == n2))
|
||||
}) {
|
||||
for i in 0..upd.len() {
|
||||
let mut upd2 = upd.clone();
|
||||
rules
|
||||
.iter()
|
||||
.filter(|(n1, _)| *n1 == upd[i])
|
||||
.filter(|(_, n2)| upd.iter().take(i).any(|n| n == n2))
|
||||
.take(1)
|
||||
.for_each(|(_, n2)| {
|
||||
let pos = upd.iter().position(|n| *n == *n2).unwrap();
|
||||
upd2[pos] = upd[i];
|
||||
upd2[i] = *n2;
|
||||
});
|
||||
upd = upd2;
|
||||
}
|
||||
}
|
||||
upd
|
||||
})
|
||||
.map(|upd| upd[(upd.len() / 2) as usize])
|
||||
.sum();
|
||||
|
||||
println!("Result 2: {}", result);
|
||||
}
|
|
@ -29,11 +29,11 @@ fn _all_days() {
|
|||
days::d04::solve();
|
||||
time = _print_elapsed(time);
|
||||
|
||||
/*
|
||||
println!("\nDay 5");
|
||||
days::d05::solve();
|
||||
time = _print_elapsed(time);
|
||||
|
||||
/*
|
||||
println!("\nDay 6");
|
||||
days::d06::solve();
|
||||
time = _print_elapsed(time);
|
||||
|
|
Loading…
Reference in a new issue