day12_part2.carbon 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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/12
  5. import Core library "io";
  6. import library "day12_common";
  7. import library "io_utils";
  8. fn CountExtensions(map: Map, regions: DisjointSetForest*) -> [i32; 140 * 140] {
  9. returned var extensions: [i32; 140 * 140];
  10. var i: i32 = 0;
  11. while (i < 140 * 140) {
  12. extensions[i] = 0;
  13. ++i;
  14. }
  15. var ext: [{.same: (i32, i32), .adj: (i32, i32)}; 4] = (
  16. {.same = (-1, 0), .adj = (0, -1)},
  17. {.same = (-1, 0), .adj = (0, 1)},
  18. {.same = (0, -1), .adj = (-1, 0)},
  19. {.same = (0, -1), .adj = (1, 0)},
  20. );
  21. var x: i32 = 0;
  22. while (x < 140) {
  23. var y: i32 = 0;
  24. while (y < 140) {
  25. let kind: i32 = map.At(x, y);
  26. var e: i32 = 0;
  27. while (e < 4) {
  28. if (map.At(x + ext[e].same.0, y + ext[e].same.1) == kind and
  29. map.At(x + ext[e].adj.0, y + ext[e].adj.1) != kind and
  30. map.At(x + ext[e].same.0 + ext[e].adj.0,
  31. y + ext[e].same.1 + ext[e].adj.1) != kind) {
  32. ++extensions[regions->Lookup(y * 140 + x)];
  33. }
  34. ++e;
  35. }
  36. ++y;
  37. }
  38. ++x;
  39. }
  40. return var;
  41. }
  42. fn Run() {
  43. var map: Map = Map.Read();
  44. var regions: DisjointSetForest = MakeRegions(map);
  45. var ext: [i32; 140 * 140] = CountExtensions(map, &regions);
  46. var total: i32 = 0;
  47. var i: i32 = 0;
  48. while (i < 140 * 140) {
  49. if (regions.Lookup(i) == i) {
  50. let area: i32 = regions.Weight(i);
  51. let internal_edges: i32 = regions.Unions(i);
  52. let extensions: i32 = ext[i];
  53. let perimeter: i32 = area * 4 - internal_edges * 2 - extensions;
  54. total += area * perimeter;
  55. }
  56. ++i;
  57. }
  58. Core.Print(total);
  59. }