I have a similar solution:

SYMBOLS = [ :rock,
           :paper,
           :scissors ]
KILLER = { :rock => :paper, :paper => :scissors, :scissors => :rock }
MAXSIZE = 5

class Symbol
  def +(o) 
    return (self.to_s+o.to_s).to_sym
  end
end

class BHAdaptPlayer4 < Player

  def initialize( opponent )
    @stats = Hash.new() 
    @lastmoves = []
  end

  def get_keys
    keys = [  ]
    @lastmoves.each do |pair|
      keys.unshift( keys.empty? ? pair : (keys[0]+pair))
    end
    keys
  end

  def choose
    info = nil
    get_keys.each do |key|
      info = @stats[key]
      break if info
    end
    if ! info
      SYMBOLS[rand(3)]
    else
      max = -1
      msym = nil
      info.keys.each do |sym|
        msym,max = sym,info[sym] if(info[sym] > max)    
      end
      KILLER[msym] 
    end
  end

  # called after each choice you make to give feedback
  # you              = your choice
  # them             = opponent's choice
  # win_lose_or_draw = :win, :lose or :draw, your result
  def result( you, them, win_lose_or_draw )
    get_keys.each do |key|
      @stats[key] = create_stat if ! @stats[key]
      @stats[key][them] += 1
    end
    @lastmoves.unshift(@lastchoice)
    @lastmoves.pop if @lastmoves.size > MAXSIZE

    @lastchoice = them+you
  end

  def create_stat
    stat = {}
    SYMBOLS.each {|sym| stat[sym] = 0 }
    stat
  end

end