2018-12-02 06:43:52 +00:00
|
|
|
use std::collections::HashMap;
|
|
|
|
use std::fs;
|
|
|
|
|
|
|
|
fn main() {
|
2018-12-05 21:25:12 +00:00
|
|
|
let input = fs::read_to_string("input/day2.txt").expect("input");
|
2018-12-02 06:43:52 +00:00
|
|
|
part1(&input);
|
|
|
|
part2(&input);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn part1(input: &str) {
|
|
|
|
let mut twos = 0;
|
|
|
|
let mut threes = 0;
|
|
|
|
|
|
|
|
for line in input.lines() {
|
|
|
|
let char_counts = count_chars(line);
|
|
|
|
if char_counts.iter().any(|(_k, &v)| v == 2) {
|
|
|
|
twos += 1;
|
|
|
|
}
|
|
|
|
if char_counts.iter().any(|(_k, &v)| v == 3) {
|
|
|
|
threes += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
println!("{}", twos * threes);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn count_chars(line: &str) -> HashMap<char, u32> {
|
|
|
|
let mut counts = HashMap::new();
|
|
|
|
line.chars()
|
|
|
|
.for_each(|chr| *counts.entry(chr).or_insert(0) += 1);
|
|
|
|
counts
|
|
|
|
}
|
|
|
|
|
|
|
|
fn part2(input: &str) {
|
|
|
|
for (i, line) in input.lines().enumerate() {
|
|
|
|
for (j, other) in input.lines().enumerate() {
|
|
|
|
if i == j {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
let number_differing =
|
|
|
|
line.chars().zip(other.chars()).fold(
|
|
|
|
0,
|
|
|
|
|acc, (chr1, chr2)| if chr1 != chr2 { acc + 1 } else { acc },
|
|
|
|
);
|
|
|
|
|
2018-12-05 21:25:12 +00:00
|
|
|
if number_differing == 1 {
|
2018-12-02 06:43:52 +00:00
|
|
|
println!("{} and {} differ by 1 char", line, other);
|
|
|
|
let common: String = line
|
|
|
|
.chars()
|
|
|
|
.zip(other.chars())
|
|
|
|
.filter_map(|(chr1, chr2)| if chr1 != chr2 { None } else { Some(chr1) })
|
|
|
|
.collect();
|
|
|
|
println!("Common: {}", common);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|