Guest User

Untitled

a guest
Dec 11th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.40 KB | None | 0 0
  1. use std::iter::repeat;
  2. use std::cmp::max;
  3.  
  4. const GRID_SIZE: i32 = 300;
  5.  
  6. #[derive(Debug, Clone)]
  7. struct Coord {
  8. x: i32,
  9. y: i32,
  10. square_lvls: Vec<i32>,
  11. }
  12.  
  13. impl Coord {
  14. fn new(x: i32, y: i32) -> Self {
  15. Coord {
  16. x,
  17. y,
  18. square_lvls: Vec::with_capacity((GRID_SIZE - max(x, y) + 1) as usize),
  19. }
  20. }
  21.  
  22. fn calc_square_lvls(&mut self, lvls: &[i32], serial: i32) {
  23. assert!(self.square_lvls.is_empty());
  24. let mut pow = 0;
  25. for sz in 1..=(GRID_SIZE - max(self.x, self.y) + 1) {
  26. for d in 0..sz {
  27. //println!("x {} y {} sz {} d {}", self.x, self.y, sz, d);
  28. pow += lvls[(self.x - 1 + sz - 1 + (self.y - 1 + d) * sz) as usize];
  29. pow += lvls[(self.x - 1 + d + (self.y - 1 + sz - 1) * sz) as usize];
  30. }
  31. self.square_lvls.push(pow);
  32. }
  33. }
  34. }
  35.  
  36. fn power(x: i32, y: i32, serial: i32) -> i32 {
  37. let rack_id: i32 = x + 10;
  38. (rack_id * y + serial) * rack_id / 100 % 10 - 5
  39. }
  40.  
  41. fn square_power(x: i32, y: i32, serial: i32, size: i32) -> i32 {
  42. let mut pow = 0;
  43. for x in x..=x + size {
  44. for y in y..=y + size {
  45. pow += power(x, y, serial);
  46. }
  47. }
  48. pow
  49. }
  50.  
  51. fn square_power_v2(pows: &[i32], x: i32, y: i32, serial: i32, size: i32) -> i32 {
  52. let mut pow = 0;
  53. for y in y..y + size {
  54. for x in x..x + size {
  55. pow += pows[((x - 1) + (y - 1) * 300) as usize];
  56. }
  57. }
  58. pow
  59. }
  60.  
  61. fn main() {
  62. const SERIAL: i32 = 8141;
  63.  
  64. let (mut coords, lvls): (Vec<Coord>, Vec<i32>) = (1..=300)
  65. .flat_map(|y| repeat(y).zip(1..=300))
  66. .map(|(y, x)| (Coord::new(x, y), power(x, y, SERIAL)))
  67. .unzip();
  68.  
  69. for c in &mut coords {
  70. c.calc_square_lvls(&lvls, SERIAL);
  71. }
  72.  
  73. /* Part 2 v3 */
  74. //let coords = vec![Coord { square_lvls: Vec::new() }; 300 * 300];
  75. let max = (1..=300)
  76. .flat_map(|x| repeat(x).zip(1..=300));
  77.  
  78. /* Part 1 v2 */
  79. //let max = (1..=300 - 2)
  80. // .flat_map(|x| repeat(x).zip(1..=300 - 2))
  81. // .max_by_key(|(x, y)| square_power_v2(&lvls, *x, *y, SERIAL, 3))
  82. // .expect("no maximum found");
  83. //println!("Part 1: {},{}", max.0, max.1);
  84.  
  85. /* Part 2 v2 */
  86. //let max = (1..=300)
  87. // .flat_map(|sz| repeat(sz).zip(1..300 - sz + 1))
  88. // .flat_map(|(sz, x)| repeat((sz, x)).zip(1..300 - sz + 1))
  89. // .map(|((sz, x), y)| (sz, (x, y)))
  90. // .max_by_key(|(sz, (x, y))| square_power_v2(&lvls, *x, *y, SERIAL, *sz))
  91. // .expect("no maximum found");
  92. //println!("Part 2: {},{},{}", (max.1).0, (max.1).1, max.0);
  93.  
  94. /* Part 1 v1 */
  95. //let max = (1..=300 - 2)
  96. // .flat_map(|x| repeat(x).zip(1..=300 - 2))
  97. // .max_by_key(|(x, y)| square_power(*x, *y, SERIAL, 3))
  98. // .expect("no maximum found");
  99. //println!("Part 1: {},{}", max.0, max.1);
  100.  
  101. /* Part 2 v1 */
  102. //let max = (1..=300)
  103. // .flat_map(|sz| repeat(sz).zip(1..300 - sz + 1))
  104. // .flat_map(|(sz, x)| repeat((sz, x)).zip(1..300 - sz + 1))
  105. // .map(|((sz, x), y)| (sz, (x, y)))
  106. // .max_by_key(|(sz, (x, y))| square_power(*x, *y, SERIAL, *sz))
  107. // .expect("no maximum found");
  108. //println!("Part 2: {},{},{}", (max.1).0, (max.1).1, max.0);
  109.  
  110. assert_eq!(power(3, 5, 8), 4);
  111. assert_eq!(power(122, 79, 57), -5);
  112. assert_eq!(power(217, 196, 39), 0);
  113. assert_eq!(power(101, 153, 71), 4);
  114. }
Add Comment
Please, Sign In to add comment