You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.6 KiB
105 lines
2.6 KiB
use std::fs::File; |
|
use std::io::{ self, BufRead, BufReader }; |
|
|
|
type Grid = Vec<Vec<u8>>; |
|
const N: usize = 20; |
|
|
|
fn read_grid_lines() -> io::Lines<BufReader<File>> { |
|
let file = File::open("grid.txt").unwrap(); |
|
return io::BufReader::new(file).lines(); |
|
} |
|
|
|
fn get_grid() -> Grid { |
|
let lines = read_grid_lines(); |
|
let mut grid: Grid = Vec::new(); |
|
for line in lines { |
|
let s = line.unwrap(); |
|
let ns: Vec<_> = s.split(" ") |
|
.map(|x| x.parse::<u8>().unwrap()) |
|
.collect(); |
|
grid.push(ns); |
|
} |
|
return grid; |
|
} |
|
|
|
fn g(grid: &Grid, i: usize, j: usize) -> u32 { |
|
return u32::from(grid.get(i).unwrap().get(j).unwrap().clone()); |
|
} |
|
|
|
fn best_h(grid: &Grid) -> u32 { |
|
let mut best_pr = 1; |
|
for i in 0..N { |
|
for j in 0..N-3 { |
|
let a = g(&grid, i, j); |
|
let b = g(&grid, i, j + 1); |
|
let c = g(&grid, i, j + 2); |
|
let d = g(&grid, i, j + 3); |
|
let pr = a * b * c * d; |
|
if pr > best_pr { best_pr = pr; } |
|
} |
|
} |
|
return best_pr; |
|
} |
|
|
|
fn best_v(grid: &Grid) -> u32 { |
|
let mut best_pr = 1; |
|
for i in 0..N-3 { |
|
for j in 0..N { |
|
let a = g(&grid, i, j); |
|
let b = g(&grid, i + 1, j); |
|
let c = g(&grid, i + 2, j); |
|
let d = g(&grid, i + 3, j); |
|
let pr = a * b * c * d; |
|
if pr > best_pr { best_pr = pr; } |
|
} |
|
} |
|
return best_pr; |
|
} |
|
|
|
fn best_dr(grid: &Grid) -> u32 { |
|
let mut best_pr = 1; |
|
for i in 0..N-3 { |
|
for j in 0..N-3 { |
|
let a = g(&grid, i, j); |
|
let b = g(&grid, i + 1, j + 1); |
|
let c = g(&grid, i + 2, j + 2); |
|
let d = g(&grid, i + 3, j + 3); |
|
let pr = a * b * c * d; |
|
if pr > best_pr { best_pr = pr; } |
|
} |
|
} |
|
return best_pr; |
|
} |
|
|
|
fn best_dl(grid: &Grid) -> u32 { |
|
let mut best_pr = 1; |
|
for i in 3..N { |
|
for j in 0..N-3 { |
|
let a = g(&grid, i, j); |
|
let b = g(&grid, i - 1, j + 1); |
|
let c = g(&grid, i - 2, j + 2); |
|
let d = g(&grid, i - 3, j + 3); |
|
let pr = a * b * c * d; |
|
if pr > best_pr { best_pr = pr; } |
|
} |
|
} |
|
return best_pr; |
|
} |
|
|
|
fn best(grid: &Grid) -> u32 { |
|
let a = best_h(&grid); |
|
let b = best_v(&grid); |
|
let c = best_dr(&grid); |
|
let d = best_dl(&grid); |
|
|
|
println!("{} {} {} {}", a, b, c, d); |
|
|
|
return best_h(&grid).max(best_v(&grid)).max(best_dr(&grid)).max(best_dl(grid)); |
|
} |
|
|
|
fn main() { |
|
let grid = get_grid(); |
|
let n = best(&grid); |
|
|
|
println!("{}", n); |
|
}
|
|
|