1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use std::collections::HashMap;

use errors::*;

pub fn solve(input: &str) -> Result<String> {
  let mut counters = HashMap::new();
  for line in input.lines() {
    for (i, c) in line.chars().enumerate() {
      let mut col = counters.entry(i).or_insert_with(HashMap::new);
      *col.entry(c).or_insert(0) += 1
    }
  }

  let mut counters: Vec<_> = counters.iter().collect();
  counters.sort_by_key(|&(idx, _)| idx);
  Ok(counters.iter()
    .map(|&(_, col)| {
      let mut v: Vec<_> = col.iter().collect();
      v.sort_by_key(|&(_, count)| count);
      v.iter().map(|&(chr, _)| *chr).last().unwrap()
    })
    .collect())
}

#[test]
fn test_solve() {
  let input = "eedadn
drvtee
eandsr
raavrd
atevrs
tsrnev
sdttsa
rasrtv
nssdts
ntnada
svetve
tesnvt
vntsnd
vrdear
dvrsen
enarar";
  assert_eq!(solve(input).unwrap(), "easter".to_string());
}