74 lines
1.6 KiB
Rust
74 lines
1.6 KiB
Rust
|
use std::collections::HashMap;
|
||
|
|
||
|
pub fn process_part1(input: &str) -> String {
|
||
|
let line_len = input.find("\n").unwrap();
|
||
|
let mut rows: Vec<HashMap<char, u32>> = vec![HashMap::new(); line_len];
|
||
|
input.lines().for_each(|line| {
|
||
|
for (idx, chara) in line.chars().enumerate() {
|
||
|
rows[idx]
|
||
|
.entry(chara)
|
||
|
.and_modify(|count| *count += 1)
|
||
|
.or_insert(1);
|
||
|
}
|
||
|
});
|
||
|
let mut res = String::new();
|
||
|
for row in rows {
|
||
|
let most_common = row.iter().max_by(|a, b| a.1.cmp(b.1)).unwrap().0;
|
||
|
res.push(*most_common);
|
||
|
}
|
||
|
res
|
||
|
}
|
||
|
|
||
|
pub fn process_part2(input: &str) -> String {
|
||
|
let line_len = input.find("\n").unwrap();
|
||
|
let mut rows: Vec<HashMap<char, u32>> = vec![HashMap::new(); line_len];
|
||
|
input.lines().for_each(|line| {
|
||
|
for (idx, chara) in line.chars().enumerate() {
|
||
|
rows[idx]
|
||
|
.entry(chara)
|
||
|
.and_modify(|count| *count += 1)
|
||
|
.or_insert(1);
|
||
|
}
|
||
|
});
|
||
|
let mut res = String::new();
|
||
|
for row in rows {
|
||
|
let most_common = row.iter().max_by(|a, b| b.1.cmp(a.1)).unwrap().0;
|
||
|
res.push(*most_common);
|
||
|
}
|
||
|
res
|
||
|
}
|
||
|
|
||
|
#[cfg(test)]
|
||
|
mod tests {
|
||
|
use super::*;
|
||
|
|
||
|
const INPUT: &str = "eedadn
|
||
|
drvtee
|
||
|
eandsr
|
||
|
raavrd
|
||
|
atevrs
|
||
|
tsrnev
|
||
|
sdttsa
|
||
|
rasrtv
|
||
|
nssdts
|
||
|
ntnada
|
||
|
svetve
|
||
|
tesnvt
|
||
|
vntsnd
|
||
|
vrdear
|
||
|
dvrsen
|
||
|
enarar";
|
||
|
|
||
|
#[test]
|
||
|
fn part1() {
|
||
|
let result = process_part1(INPUT);
|
||
|
assert_eq!(result, *"easter");
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn part2() {
|
||
|
let result = process_part2(INPUT);
|
||
|
assert_eq!(result, *"advent");
|
||
|
}
|
||
|
}
|