[2024][ruby][12.2]
change xpsmtllwnvwupszsxpyxpykoskvnsvkz
commit 97a9b09a5d1e455b886aa707ffde6acc02da5360
author Alpha Chen <alpha@kejadlen.dev>
date
parent uvppmvvy
diff --git a/2024/ruby/day_12.rb b/2024/ruby/day_12.rb
index 4d53774..74becc0 100644
--- a/2024/ruby/day_12.rb
+++ b/2024/ruby/day_12.rb
@@ -35,11 +35,36 @@ perimeter = ->(plot) {
 }
 
 pp plots
-  .map { [garden.fetch(_1.first), _1.size, perimeter[_1].size] }
-  .sum { _2 * _3 }
+  .map { [_1.size, perimeter[_1]] }
+  .sum { _1 * _2.length }
+
+sides = ->(plot) {
+  id = garden.fetch(plot.first)
+  rows = plot.group_by(&:first).values.flat_map {|row|
+    [-1, 1].flat_map {|dy|
+      row
+        .map {|y,x| [y+dy, x] }
+        .reject { garden.fetch(_1, nil) == id }
+        .map(&:last)
+        .sort
+        .chunk_while { _1 + 1 == _2 }
+    }
+  }
+  cols = plot.group_by(&:last).values.flat_map {|row|
+    [-1, 1].flat_map {|dx|
+      row
+        .map {|y,x| [y, x+dx] }
+        .reject { garden.fetch(_1, nil) == id }
+        .map(&:first)
+        .sort
+        .chunk_while { _1 + 1 == _2 }
+    }
+  }
+  rows + cols
+}
+
+pp plots
+  .map { [garden.fetch(_1.first), _1.size, sides[_1]] }
+  .sum { _2 * _3.sum(&:count) }
 
 __END__
-AAAA
-BBCD
-BBCC
-EEEC