[2024][ruby][13.x] use matrices
change uuktmkrsprxwsktkunusrlvuonolxplw
commit ce45bf13860ccc5276f9a2aa0007335784e2fde4
author Alpha Chen <alpha@kejadlen.dev>
date
parent qxuqlkvk
diff --git a/2024/ruby/day_13.rb b/2024/ruby/day_13.rb
index 1784773..f4005e7 100644
--- a/2024/ruby/day_13.rb
+++ b/2024/ruby/day_13.rb
@@ -1,11 +1,4 @@
-require "bundler/inline"
-
-gemfile do
-  source "https://rubygems.org"
-  gem "z3"
-end
-
-require "z3"
+require "matrix"
 
 input = DATA.read
 
@@ -13,16 +6,10 @@ machines = input.split("\n\n")
   .map {|machine| machine.scan(/\d+/).map(&:to_i).each_slice(2).to_a }
 
 def wins(machine)
-  a = Z3.Int("a")
-  b = Z3.Int("b")
-
-  solver = Z3::Solver.new
-  machine.transpose.each do |a_, b_, c|
-    solver.assert a*a_ + b*b_ == c
-  end
-  if solver.satisfiable?
-    model = solver.model
-    [a, b].map { model[_1].to_i }
+  *ab, c = machine
+  a, b = (Matrix.columns(ab).inverse * Matrix.column_vector(c)).to_a.flatten
+  if [a, b].all? { _1.denominator == 1 }
+    [a, b].map(&:to_i)
   else
     nil
   end