Skip to content

Instantly share code, notes, and snippets.

Created July 30, 2017 21:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/39209470971ded73d40d26df143817f5 to your computer and use it in GitHub Desktop.
Save anonymous/39209470971ded73d40d26df143817f5 to your computer and use it in GitHub Desktop.
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