LoopholeAbuser
=

<!-- language: lang-ruby -->

    @rules = {
    
      'L' => %w[V P],
      'P' => %w[V R],
      'R' => %w[L S],
      'S' => %w[P L],
      'V' => %w[R S]
    }
    
    @moves = @rules.keys
    
    def defeats?(move1, move2)
      @rules[move1].include?(move2)
    end
    
    def score(move1, move2)
      if move1 == move2
        0
      elsif defeats?(move1, move2)
        1
      else
        -1
      end
    end
    
    def move
      player, opponent = ARGV
    
      case player.to_s.size
      when 0
        'P'
      when 1
        'R'*100
      when 2
        'L'
      when 3
        'S'
      when 4
        'V'
      else
        extrapolate(player, opponent)
      end
    
    end
    
    def extrapolate(player,opponent)
      likelihoods = Hash.new {0}
    
      opponent_last_move = opponent[-1]
      @moves.each { |m| likelihoods[m] += opponent.scan(opponent_last_move + m).size }
    
      my_last_move = player[-1]
      reactions = player.chars.zip(opponent.chars.drop(1))
      @moves.each { |m| likelihoods[m] += reactions.count([my_last_move, m]) }
    
      @moves.shuffle.max_by do |m|
        likelihoods.map{ |n,c| score(m,n) * c }.reduce(:+)
      end
    end
    
    puts move

Just doing these because for once I want to get to the loopholes before other people.