[2025][ruby][8.x] refactored
change kwvzkyrwyqnvwptqxptorotpuottmvxn
commit 5dea3e921ffb0a98dc9dee065b85ee83893656b4
author Alpha Chen <alpha@kejadlen.dev>
date
parent tmszxtrn
diff --git a/2025/ruby/day_08.rb b/2025/ruby/day_08.rb
index 516ee0b..6edb487 100644
--- a/2025/ruby/day_08.rb
+++ b/2025/ruby/day_08.rb
@@ -1,34 +1,32 @@
 boxes = DATA.read.lines.map { it.split(?,).map(&:to_i) }
 
-circuits = boxes.to_h { [it, Set[it]] }
+Circuits = Struct.new(:circuits) do
+  def connect(a, b)
+    c_a, c_b = circuits.values_at(a, b)
+
+    circuit = c_a.merge(c_b)
+    circuit.each do |box|
+      circuits[box] = circuit
+    end
+
+    circuit
+  end
+end
 
 distances = boxes.combination(2).sort_by {|a, b|
   a.zip(b).sum { (_1 - _2) ** 2 } ** 0.5
 }
 
-# N = 10
-# N.times do
-loop do
-  a, b = distances.shift
-
-  c_a = circuits[a]
-  c_b = circuits[b]
+circuits = Circuits.new(boxes.to_h { [it, Set[it]] })
 
-  connected = c_a | c_b
-
-  if connected.size == boxes.size
-    pp a[0] * b[0]
-    exit
-  end
-
-  connected.each do |box|
-    circuits[box] = connected
-  end
+# part one
+distances[0...10].each do |pair|
+  circuits.connect(*pair)
 end
+pp circuits.circuits.values.uniq.map(&:size).sort[-3..].inject(:*)
 
-pp circuits.values.uniq
-  .map(&:size).sort[-3..]
-  .inject(:*)
-puts
+# part two
+a, b = distances[10..].find {|pair| circuits.connect(*pair).size == boxes.size }
+pp a[0] * b[0]
 
 __END__