solution: day4

This commit is contained in:
2023-01-30 23:12:26 +01:00
parent 000000403f
commit 0000005043
2 changed files with 102 additions and 0 deletions

98
src/bin/04.rs Normal file
View File

@@ -0,0 +1,98 @@
use hashbrown::HashMap;
use itertools::Itertools;
pub fn part_one(input: &str) -> Option<u32> {
let mut res = 0;
for room in input.lines() {
if let Some((checksum, code)) = room.split('-').collect_vec().split_last() {
let mut letters = HashMap::new();
for word in code.iter() {
for letter in word.chars() {
*letters.entry(letter).or_insert(0) += 1;
}
}
let checksum = checksum.replace(']', "").to_string();
let (id, order) = checksum.split_once('[').unwrap();
let code = letters
.into_iter()
.sorted_by(|kv1, kv2| kv2.1.cmp(&kv1.1).then_with(|| kv1.0.cmp(&kv2.0)))
.take(5)
.map(|(k, _)| k)
.collect::<String>();
if order == code {
res += id.parse::<u32>().unwrap();
}
}
}
Some(res)
}
pub fn part_two(input: &str) -> Option<usize> {
for room in input.lines() {
if let Some((checksum, codes)) = room.split('-').collect_vec().split_last() {
let mut letters = HashMap::new();
for word in codes.iter() {
for letter in word.chars() {
*letters.entry(letter).or_insert(0) += 1;
}
}
let checksum = checksum.replace(']', "").to_string();
let (id, order) = checksum.split_once('[').unwrap();
let id = id.parse().unwrap();
let code = letters
.into_iter()
.sorted_by(|kv1, kv2| kv2.1.cmp(&kv1.1).then_with(|| kv1.0.cmp(&kv2.0)))
.take(5)
.map(|(k, _)| k)
.collect::<String>();
if order == code {
let decrypted = codes
.iter()
.map(|x| {
x.chars()
.map(|x| {
let index = ('a'..='z').position(|y| y == x).unwrap();
('a'..='z').cycle().nth(index + id).unwrap()
})
.collect::<String>()
})
.collect_vec()
.join(" ");
if decrypted == "northpole object storage" {
return Some(id);
}
}
}
}
None
}
fn main() {
let input = &aoc::read_file("inputs", 4);
aoc::solve!(1, part_one, input);
aoc::solve!(2, part_two, input);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_one() {
let input = aoc::read_file("examples", 4);
assert_eq!(part_one(&input), Some(1514));
}
#[test]
fn test_part_two() {
let input = aoc::read_file("examples", 4);
assert_eq!(part_two(&input), None);
}
}

4
src/examples/04.txt Normal file
View File

@@ -0,0 +1,4 @@
aaaaa-bbb-z-y-x-123[abxyz]
a-b-c-d-e-f-g-h-987[abcde]
not-a-real-room-404[oarel]
totally-real-room-200[decoy]