From: James Edward Gray II Date: 2007-03-07T00:30:28+09:00 Subject: Re: [QUIZ] GOPS (#116) On Mar 4, 2007, at 3:55 PM, Christoffer Lern� wrote: > Here is an example of what can be done with a static strategy. Here's my favorite strategy I've been able to come up with. The idea is to toss little cards until we notice sure wins. For example, after the opponent has played his King, ours is a sure win. At that point we find the highest bid card remaining and set the King aside for winning that. Then we start watching for the Queen... It's pretty dependent on the bid card order, so muppet still does pretty well against it and even random gets the better of it from time to time. Here's the code: #!/usr/bin/env ruby -w class Player CARDS = (1..13).to_a def initialize @cards_left = CARDS.dup @wins = Array.new end attr_reader :cards_left protected :cards_left def play_card(card) @cards_left.delete(card) end def win_card(bid_card) @wins << bid_card end end class Planner < Player def initialize super @bids_left = CARDS.dup @opponent = Player.new @sure_wins = Hash.new end def bid_on_card(card) @bidding_for = card @last_play = choose_a_card end def record_result(opponents_card) if @last_play > opponents_card win_card(@bidding_for) elsif opponents_card > @last_play @opponent.win_card(@bidding_for) end @bids_left.delete(@bidding_for) play_card(@last_play) @opponent.play_card(opponents_card) end private def choose_a_card find_sure_wins @sure_wins[@bidding_for] || @cards_left.min end def find_sure_wins ((@opponent.cards_left.last + 1)..13).to_a.reverse_each do |card| next unless @cards_left.include? card next if @sure_wins.values.include? card next unless targets = @bids_left - @sure_wins.keys @sure_wins[targets.max] = card end end end if __FILE__ == $PROGRAM_NAME planner = Planner.new 13.times do $stdout.puts planner.bid_on_card($stdin.gets[/\d+/].to_i) $stdout.flush planner.record_result($stdin.gets[/\d+/].to_i) end end __END__ James Edward Gray II