1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

How to run a ruby program

  1. Jun 23, 2008 #1
    I wrote the below code in a text editor, saved it as foo.rb Now I assume to run it, I simply go into the terminal and enter ruby foo.rb, yet nothing happens.

    module Sudoku

    class Puzzle
    ASCII = ".123456789"
    BIN = "\000\001\002\003\004\005\006\007\010\011"
    def initialize(lines)
    if (lines.respond_to? :join)
    s = lines.join
    else
    s = lines.dup
    end
    s.gsub!(/\s/, "") # /\s/ is a Regexp that matches any whitespace

    raise Invalid, "Grid is the wrong size" unless s.size == 81
    if i = s.index(/[^123456789\.]/)
    raise Invalid, "Illegal character #{s[i,1]} in puzzle"
    end
    s.tr!(ASCII, BIN)
    @grid = s.unpack('c*')

    raise Invalid, "Initial puzzle has duplicates" if has_duplicates?
    end
    def to_s
    (0..8).collect{|r| @grid[r*9,9].pack('c9')}.join("\n").tr(BIN,ASCII)
    end
    def dup
    copy = super
    @grid = @grid.dup
    copy
    end
    def [](row, col)
    @grid[row*9 + col]
    end
    def []=(row, col, newvalue)
    unless (0..9).include? newvalue
    raise Invalid, "illegal cell value"
    end
    @grid[row*9 + col] = newline
    end
    BoxOfIndex = [
    0,0,0,1,1,1,2,2,2,0,0,0,1,1,1,2,2,2,0,0,0,1,1,1,2,2,2,
    3,3,3,4,4,4,5,5,5,3,3,3,4,4,4,5,5,5,3,3,3,4,4,4,5,5,5,
    6,6,6,7,7,7,8,8,8,6,6,6,7,7,7,8,8,8,6,6,6,7,7,7,8,8,8
    ].freeze
    def each_unknown
    0.upto 8 do |row|
    0.upto 8 do |col|
    index = row*9+col
    next if @grid[index] !=0
    box = BoxofIndex[index]
    yield row, col, box
    end
    end
    end
    def has_duplicates?
    0.upto(8) {|row| return true if rowdigits(row).uniq! }
    0.upto(8) {|col| return true if coldigits(col).uniq! }
    0.upto(8) {|box| return true if boxdigits(box).uniq! }
    false
    end
    AllDigits = [1,2,3,4,5,6,7,8,9].freeze
    def possible(row, col, box)
    AllDigits - (rowdigits(row) + coldigits(col) + boxdigits(box))
    end
    private
    def rowdigits(row)
    @grid[row*9,9] - [0]
    end
    def coldigits(col)
    result = []
    col.step(80, 9) {|i|
    v = @grid
    result << v if (v != 0)
    }
    result
    end
    BoxToIndex = [0, 3, 6, 27, 30, 33, 54, 57, 60].freeze
    def boxdigits(b)
    i = BoxToIndex
    [
    @grid, @grid[i+1], @grid[i+2],
    @grid[i+9], @grid[i+10], @grid[i+11],
    @grid[i+18], @grid[i+19], @grid[i+20]
    ] - [0]
    end
    end
    class Invalid < StandardError
    end
    class Impossible < StandardError
    end
    def Sudoku.scan(puzzle)
    unchanged = false
    until unchanged
    unchanged = true
    rmin,cmin,pmin = nil
    min = 10
    puzzle.each_unknown do |row, col, box|
    case p.size
    when 0
    raise Impossible
    when 1
    puzzle[row,col] = p[0]
    unchanged = false
    else
    if unchanged && p.size < min
    min = p.size
    rmin, cmin, pmin = row, col, p
    end
    end
    end
    end
    return rmin, cmin, pmin
    end
    def Sudoku.solve(puzzle)
    puzzle = puzzle.dup
    r,c,p = scan(puzzle)
    return puzzle if r == nil
    p.each do |guess|
    puzzle[r,c] = guess

    begin
    return solve(puzzle)
    rescue Impossible
    next
    end
    end
    raise Impossible
    end
    end
     
  2. jcsd
  3. Jun 24, 2008 #2
    Although you didn't make this clear, that code is from Example 1-1 of "The Ruby Programming Language" by David Flanagan and Yukihiro Matsumoto. Did you try reading the very first comment in the example?
     
  4. Jun 24, 2008 #3
    I guess that was a bit unclear for me. It says that it is a "module to solve Sudoku puzzles." I am not really certain what exactly that is.
     
  5. Jun 24, 2008 #4
    I was referring to this:

    Code (Text):
    # Use this module to solve Sudoku puzzles with code like this:
    #
    #  require 'sudoku'
    #  puts Sudoku.solve(Sudoku::Puzzle.new(ARGF.readlines))
    Put that in a new file called "sudoku_solver.rb" or something and run it. You'll need to supply the input filename on the command line.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?