[2025][ruby][8.x] refactored
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__