pub fn task1() { let square_size = 3; let serial = 6392; let result = (1..=300 - square_size) .flat_map(|x: i32| (1..=300 - square_size).map(move |y: i32| (x, y))) .map(|(x, y)| { let power: i32 = (x..x + square_size) .map(|x| { (y..y + square_size) .map(move |y| fuel_level(x, y, serial)) .sum::() }) .sum(); (x, y, power) }) .max_by_key(|(_, _, value)| *value); println!("{:?}", result); } pub fn task2() { let serial = 6392; let result = (1..300) .map(|square_size| { let result = (1..=300 - square_size) .flat_map(|x: i32| (1..=300 - square_size).map(move |y: i32| (x, y))) .map(|(x, y)| { let power: i32 = (x..x + square_size) .map(|x| { (y..y + square_size) .map(move |y| fuel_level(x, y, serial)) .sum::() }) .sum(); (x, y, power) }) .max_by_key(|(_, _, value)| *value) .unwrap(); (result.0, result.1, result.2, square_size) }) .max_by_key(|result| result.2); println!("{:?}", result); } fn fuel_level(x: i32, y: i32, serial: i32) -> i32 { let rack_id = x + 10; let mut power = rack_id * y; power += serial; power *= rack_id; power = power / 100 % 10; power = power - 5; power } mod test { use super::fuel_level; #[test] fn name() { assert_eq!(fuel_level(3, 5, 8), 4); assert_eq!(fuel_level(122, 79, 57), -5); assert_eq!(fuel_level(217, 196, 39), 0); assert_eq!(fuel_level(101, 153, 71), 4); } }