Advertisement
t_a_w

True Knight

Jan 6th, 2017
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.53 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2.  
  3. require "z3"
  4.  
  5. class TrueKnight
  6.   def initialize
  7.     @solver = Z3::Solver.new
  8.   end
  9.  
  10.   def cell_x(i)
  11.     Z3::Int("x#{i}")
  12.   end
  13.  
  14.   def cell_y(i)
  15.     Z3::Int("y#{i}")
  16.   end
  17.  
  18.   def cell_n(i)
  19.     Z3::Int("n#{i}")
  20.   end
  21.  
  22.   def solve!
  23.     (0...30).each do |i|
  24.       @solver.assert cell_x(i) >= 0
  25.       @solver.assert cell_x(i) <= 5
  26.       @solver.assert cell_y(i) >= 0
  27.       @solver.assert cell_y(i) <= 4
  28.       @solver.assert cell_n(i) == cell_x(i) + 6 * cell_y(i) + 1
  29.     end
  30.     @solver.assert cell_n(0) == 1
  31.     @solver.assert cell_n(3) == 18
  32.     @solver.assert cell_n(6) == 25
  33.     @solver.assert cell_n(10) == 12
  34.     @solver.assert cell_n(18) == 20
  35.     @solver.assert cell_n(27) == 6
  36.     (0...30).each_cons(2) do |a,b|
  37.       dx = cell_x(a) - cell_x(b)
  38.       dy = cell_y(a) - cell_y(b)
  39.       abs_dx = (dx > 0).ite(dx, -dx)
  40.       abs_dy = (dy > 0).ite(dy, -dy)
  41.       @solver.assert ((abs_dx == 1) & (abs_dy == 2)) | ((abs_dx == 2) & (abs_dy == 1))
  42.     end
  43.     @solver.assert Z3.Distinct(*(0...30).map{|i| cell_n(i)})
  44.  
  45.     if @solver.satisfiable?
  46.       model = @solver.model
  47.       puts "Oh yeah!"
  48.       (0...30).each do |i|
  49.         puts "#{i}: #{model[cell_n(i)]} (#{model[cell_x(i)]},#{model[cell_y(i)]})"
  50.       end
  51.       # 0th at (0,0) is prefilled, only clicked ones get added to solution
  52.       puts (1...30).map{|i| model[cell_n(i)].to_s }.join
  53.       # 95182921251431612232719841572028241122261321061730
  54.     else
  55.       puts "Can't be solved"
  56.     end
  57.   end
  58. end
  59.  
  60. TrueKnight.new.solve!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement