| use std::error; | |
| use std::fs::File; | |
| use std::io::{self, BufRead}; | |
| use std::result; | |
| use std::process; | |
| type Result<T> = result::Result<T, Box<error::Error>>; | |
| fn process_line(bytes: &[u8]) -> (usize, usize) { | |
| let (mut i, mut key, mut val) = (0, 0, 0); | |
| while bytes[i] != b'\t' { | |
| i += 1; | |
| } | |
| i += 1; | |
| while bytes[i] != b'\t' { | |
| key = key * 10 + (bytes[i] as usize) - (b'0' as usize); | |
| i += 1; | |
| } | |
| i += 1; | |
| while bytes[i] != b'\t' { | |
| val = val * 10 + (bytes[i] as usize) - (b'0' as usize); | |
| i += 1; | |
| } | |
| (key, val) | |
| } | |
| fn process_file(file: &File) -> Result<(usize, usize)> { | |
| let mut sum_by_key = [0; 2009]; | |
| let mut buf = io::BufReader::new(file); | |
| let mut line = vec![]; | |
| while buf.read_until(b'\n', &mut line)? > 0 { | |
| let (k, v) = process_line(&line); | |
| sum_by_key[k] += v; | |
| line.clear(); | |
| } | |
| let (mut k, mut v) = (0, 0); | |
| for (i, &val) in sum_by_key.iter().enumerate() { | |
| if val > v { | |
| k = i; | |
| v = val; | |
| } | |
| } | |
| Ok((k, v)) | |
| } | |
| fn try_main() -> Result<()> { | |
| let file = File::open("/tmp/ngrams.tsv")?; | |
| let (k, v) = process_file(&file)?; | |
| if k != 2006 || v != 22569013 { | |
| Err(format!("bad result {:?} | {:?}", k, v).into()) | |
| } else { | |
| Ok(()) | |
| } | |
| } | |
| fn main() { | |
| if let Err(err) = try_main() { | |
| println!("{}", err); | |
| process::exit(1); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment