0x002A / gmail.com wrote:
> okay here's my shot at the quiz, it's quite large for such a simple
> problem, but i couldn't resist to use
> :* in my code ;-)

now without :* but much shorter..

class Integer
    def even?
        self % 2 == 0
    end

    def odd?
        not even?
    end
end

# solves rubyquiz #60
class Solver
    def initialize(start, goal)
        @start, @goal = start, goal
        @visited = {}
        @queue = [[@goal, []]]
        @ops = []
        @ops << lambda {|x| x - 2 if x > 1 }
        @ops << lambda {|x| x * 2 if x.odd? or @goal < @start }
        @ops << lambda {|x| x / 2 if x.even? }
    end

    # are we there yet?
    def done_with?(temp_goal)
        @start == temp_goal
    end

    # transforms the carried steps into a valid solution
    def solution(steps)
        steps.reverse.unshift @start
    end

    # does all the work
    def solve
        while current = @queue.shift
            temp_goal, steps = *current

            return solution(steps) if done_with? temp_goal
            # been there, done that
            next if @visited[temp_goal]

            @visited[temp_goal] = true
            new_steps = steps + [temp_goal]

            @ops.each do |op|
                if (new_goal = op.call temp_goal)
                    @queue << [new_goal, new_steps]
                end
            end
        end
        raise "no solution found"
    end

    # creates a new solver and attempts to solve(a,b)
    def self.solve(a,b)
        new(a,b).solve
    end
end

# for the testcases
def solve(a, b)
    Solver.solve(a,b)
end