day 5
This commit is contained in:
parent
81a852e92e
commit
32712845e4
7
day-05/Cargo.lock
generated
Normal file
7
day-05/Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "day-05"
|
||||
version = "0.1.0"
|
6
day-05/Cargo.toml
Normal file
6
day-05/Cargo.toml
Normal file
@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "day-05"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
79
day-05/src/main.rs
Normal file
79
day-05/src/main.rs
Normal file
@ -0,0 +1,79 @@
|
||||
const INPUT: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/input.txt"));
|
||||
|
||||
fn main() {
|
||||
let mut deps = [[false; 100]; 100];
|
||||
|
||||
let mut lines = INPUT.lines();
|
||||
while let Some(line) = lines.next() {
|
||||
if line.is_empty() { break }
|
||||
let (first, second) = line.split_at(line.find("|").unwrap());
|
||||
let first = str::parse::<u8>(first).unwrap();
|
||||
let second = str::parse::<u8>(second.trim().trim_start_matches('|')).unwrap();
|
||||
|
||||
deps[first as usize][second as usize] = true;
|
||||
}
|
||||
|
||||
|
||||
let sequences = lines.map(|line| {
|
||||
line.split_terminator(",")
|
||||
.map(|num| {
|
||||
str::parse::<u8>(num).unwrap()
|
||||
})
|
||||
});
|
||||
|
||||
{
|
||||
let mut sequences = sequences.clone();
|
||||
|
||||
let mut total = 0;
|
||||
while let Some(line) = sequences.next() {
|
||||
let numbers: Vec<_> = line.collect();
|
||||
|
||||
if ordered(deps, &numbers[..]) {
|
||||
total += u32::from(numbers[numbers.len() / 2]);
|
||||
}
|
||||
}
|
||||
|
||||
println!("Part 1: {}", total);
|
||||
}
|
||||
|
||||
{
|
||||
let mut sequences = sequences.clone();
|
||||
|
||||
let mut total = 0;
|
||||
while let Some(line) = sequences.next() {
|
||||
let mut numbers: Vec<_> = line.collect();
|
||||
|
||||
if !ordered(deps, &numbers[..]) {
|
||||
order(deps, &mut numbers);
|
||||
total += u32::from(numbers[numbers.len() / 2]);
|
||||
}
|
||||
}
|
||||
|
||||
println!("Part 2: {}", total);
|
||||
}
|
||||
}
|
||||
|
||||
fn ordered(graph: [[bool; 100]; 100], list: &[u8]) -> bool {
|
||||
for i in 0..list.len() {
|
||||
for j in (i + 1)..list.len() {
|
||||
if graph[list[j] as usize][list[i] as usize] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
fn order(graph: [[bool; 100]; 100], list: &mut Vec<u8>) {
|
||||
use std::cmp::Ordering;
|
||||
list.sort_by(|&first, &second| {
|
||||
if graph[first as usize][second as usize] {
|
||||
Ordering::Less
|
||||
} else if graph[second as usize][first as usize] {
|
||||
Ordering::Greater
|
||||
} else {
|
||||
Ordering::Equal
|
||||
}
|
||||
})
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user