add day 4

This commit is contained in:
timeshifter
2026-06-27 14:01:46 +02:00
parent 2237d672bd
commit fd7d6f582a
5 changed files with 1123 additions and 0 deletions
+114
View File
@@ -0,0 +1,114 @@
use std::collections::HashMap;
#[cfg(debug_assertions)]
const FILENAME: &str = "example.txt";
#[cfg(not(debug_assertions))]
const FILENAME: &str = "input.txt";
fn main() {
let binding = std::fs::read_to_string(FILENAME).unwrap();
let mut data: Vec<_> = binding.lines().map(Room::parse).collect();
part1(&data);
part2(&mut data);
}
fn part2(data: &mut [Room]) {
for room in data {
room.shift();
if room.get_name().contains("northpole") {
println!("{}", room.id);
break;
}
}
}
fn part1(data: &[Room]) {
let x = data
.iter()
.filter(|r| r.is_valid())
.map(|r| r.id)
.sum::<u64>();
println!("{x}");
}
#[derive(Debug)]
struct Room {
name: Vec<char>,
pub id: u64,
checksum: Vec<char>,
}
impl Room {
fn shift(&mut self) {
for _ in 0..self.id {
self.name.iter_mut().for_each(|c| {
if c.is_ascii_lowercase() {
*c = (((((*c as u8) + 1) - 97) % 26) + 97) as char;
}
});
}
}
fn get_name(&self) -> String {
self.name.iter().collect()
}
fn parse(s: &str) -> Self {
let checksum = s
.split('[')
.next_back()
.unwrap()
.split(']')
.next()
.unwrap()
.chars()
.collect();
let id = s
.chars()
.skip_while(|c| !c.is_ascii_digit())
.take(3)
.collect::<String>()
.parse()
.unwrap();
let mut name: Vec<char> = s.chars().rev().skip_while(|c| *c != '-').skip(1).collect();
name.reverse();
Self { name, id, checksum }
}
fn is_valid(&self) -> bool {
let mut letters: Vec<_> = self
.name
.iter()
.filter(|c| c.is_ascii_lowercase())
.collect();
letters.sort();
let mut count = HashMap::new();
for c in letters {
count
.entry(c)
.and_modify(|counter| *counter += 1)
.or_insert(1);
}
let mut count_vec: Vec<_> = count.into_iter().map(|(c, i)| (*c, i)).collect();
count_vec.sort_by(|a, b| b.1.cmp(&a.1).then(a.0.cmp(&b.0)));
let most_common_letters_correct_count = count_vec
.into_iter()
.map(|(c, _)| c)
.zip(&self.checksum)
.filter(|(l, r)| l == *r)
.count();
most_common_letters_correct_count == 5
}
}