Created
July 30, 2017 21:29
-
-
Save anonymous/39209470971ded73d40d26df143817f5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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