use std::io; use std::io::BufRead; use std::ops::Range; fn power(x: i32, y: i32, serial: i32) -> i32 { (y * (x + 10) + serial) * (x + 10) / 100 % 10 - 5 } fn optimise(grid: [[i32; 300]; 300], srange: Range) -> (usize, usize, usize) { let mut maxval = i32::min_value(); let mut maxat = (0, 0, 0); for s in srange { for y in 0..301-s { for x in 0..301-s { let tot = (0..s).map(|dy| (0..s).map(|dx| grid[y+dy][x+dx]).sum::()).sum(); if tot > maxval { maxval = tot; maxat = (x, y, s); } } } } maxat } pub fn main(reader: T) -> io::Result<(String, String)> { let serial = reader.lines().next().unwrap().unwrap().parse::().unwrap(); let mut grid = [[0; 300]; 300]; for y in 0..300 { for x in 0..300 { grid[y][x] = power(x as i32, y as i32, serial); } } let maxat = optimise(grid, 3..4); let part1 = format!("{},{}", maxat.0, maxat.1); let maxat = optimise(grid, 1..301); let part2 = format!("{},{},{}", maxat.0, maxat.1, maxat.2); Ok((part1, part2)) }