day10_part2.carbon 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. // https://adventofcode.com/2024/day/10
  5. import Core library "io";
  6. import library "day10_common";
  7. import library "io_utils";
  8. class PathsToTop {
  9. fn Make(terrain: Terrain) -> PathsToTop {
  10. returned var me: PathsToTop;
  11. var y: i32 = 0;
  12. while (y < 43) {
  13. var x: i32 = 0;
  14. while (x < 43) {
  15. // TODO: We shouldn't need an explicit cast here.
  16. me.paths[x][y] =
  17. if terrain.height[x][y] == 9 then 1 as i64 else 0;
  18. ++x;
  19. }
  20. ++y;
  21. }
  22. return var;
  23. }
  24. fn AddLevel[addr self: Self*](terrain: Terrain, level: i32) -> i64 {
  25. var total: i64 = 0;
  26. let adj: [(i32, i32); 4] = ((-1, 0), (0, -1), (1, 0), (0, 1));
  27. var y: i32 = 0;
  28. while (y < 43) {
  29. var x: i32 = 0;
  30. while (x < 43) {
  31. if (terrain.height[x][y] == level) {
  32. var paths: i64 = 0;
  33. var i: i32 = 0;
  34. while (i < 4) {
  35. let adj_x: i32 = x + adj[i].0;
  36. let adj_y: i32 = y + adj[i].1;
  37. if (adj_x >= 0 and adj_x < 43 and
  38. adj_y >= 0 and adj_y < 43 and
  39. terrain.height[adj_x][adj_y] == level + 1) {
  40. paths = paths + self->paths[adj_x][adj_y];
  41. }
  42. ++i;
  43. }
  44. self->paths[x][y] = paths;
  45. total = total + paths;
  46. }
  47. ++x;
  48. }
  49. ++y;
  50. }
  51. return total;
  52. }
  53. var paths: [[i64; 43]; 43];
  54. }
  55. fn Run() {
  56. var terrain: Terrain = Terrain.Read();
  57. var paths: PathsToTop = PathsToTop.Make(terrain);
  58. var i: i32 = 8;
  59. var total: i64;
  60. while (i >= 0) {
  61. total = paths.AddLevel(terrain, i);
  62. --i;
  63. }
  64. PrintInt64(total);
  65. }