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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
static INPUT: i32 = 9005;
static WIDTH: usize = 300;
static HEIGHT: usize = 300;
type Grid = Vec<Vec<i32>>;
fn build_grid() -> Grid {
let mut grid = vec![vec![0; WIDTH]; HEIGHT];
for y in 1..HEIGHT + 1 {
for x in 1..WIDTH + 1 {
if y == 5 && x == 3 {
print!("");
}
let rack_id: i32 = x as i32 + 10;
let mut level = rack_id * y as i32;
level += INPUT;
level *= rack_id;
level = nth_digit(level, 3);
level -= 5;
let xi = (x - 1) as usize;
let yi = (y - 1) as usize;
grid[yi][xi] = level;
}
}
grid
}
fn nth_digit(number: i32, n: u32) -> i32 {
(number % 10i32.pow(n)) / 10i32.pow(n - 1)
}
fn sum_subsquare(grid: &Grid, pos: (usize, usize), size: usize) -> i32 {
let mut total = 0i32;
for y in pos.1..pos.1 + size {
for x in pos.0..pos.0 + size {
total += grid[y][x];
}
}
total
}
fn visualize(grid: &Grid) {
for line in grid {
for ch in line {
print!("{} ", ch);
}
print!("\n");
}
}
fn main() {
let grid = build_grid();
// visualize(&grid);
let mut max_sum = std::i32::MIN;
let mut mx: usize = 0;
let mut my: usize = 0;
let mut msize: usize = 0;
for s in 1..301 {
println!("Debug: Running for size = {}", s);
for y in 0..HEIGHT - s + 1 {
for x in 0..WIDTH - s + 1 {
let sum = sum_subsquare(&grid, (x, y), s);
if sum > max_sum {
max_sum = sum;
mx = x;
my = y;
msize = s;
}
}
}
}
println!("Max sum {} at ({}, {}), size: {}", max_sum, mx + 1, my + 1, msize);
}
|