57 lines
1.3 KiB
Rust
57 lines
1.3 KiB
Rust
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 data: Vec<_> = binding.lines().collect();
|
|
|
|
part1(&data);
|
|
part2(&data);
|
|
}
|
|
|
|
fn part2(data: &[&str]) {
|
|
let mut counts = vec![HashMap::new(); data[0].len()];
|
|
|
|
for message in data {
|
|
message.chars().enumerate().for_each(|(idx, c)| {
|
|
counts[idx].entry(c).and_modify(|i| *i += 1).or_insert(1);
|
|
});
|
|
}
|
|
|
|
for count in counts {
|
|
let the_char = count
|
|
.iter()
|
|
.min_by_key(|(_, val)| **val)
|
|
.map(|(c, _)| c)
|
|
.unwrap();
|
|
|
|
print!("{the_char}");
|
|
}
|
|
println!();
|
|
}
|
|
|
|
fn part1(data: &[&str]) {
|
|
let mut counts = vec![HashMap::new(); data[0].len()];
|
|
|
|
for message in data {
|
|
message.chars().enumerate().for_each(|(idx, c)| {
|
|
counts[idx].entry(c).and_modify(|i| *i += 1).or_insert(1);
|
|
});
|
|
}
|
|
|
|
for count in counts {
|
|
let the_char = count
|
|
.iter()
|
|
.max_by_key(|(_, val)| **val)
|
|
.map(|(c, _)| c)
|
|
.unwrap();
|
|
|
|
print!("{the_char}");
|
|
}
|
|
println!();
|
|
}
|