add day 4
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user