Created
August 26, 2009 09:11
-
-
Save plindberg/175413 to your computer and use it in GitHub Desktop.
Koden som fiskade fram vinnare i glasstävlingen på Jaiku
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rubygems' | |
require 'ruby-debug' | |
require 'hpricot' | |
require 'open-uri' | |
require 'icecream_checker' | |
checker = IcecreamChecker.new [2, 5, 6, 11, 15, 21, 22, 23, 30, 39] | |
checker.disqualify('snoleoparden') | |
checker.disqualify('fleecelabs') | |
checker.disqualify('alla') | |
doc = Hpricot(open('http://fleecelabs.jaiku.com/presence/8b669baae9b54495bab71ff808384493')) | |
(doc/'#comments .meta a:nth-child(1)').each_with_index do |a, i| | |
checker.add(a.innerText) | |
# puts "#{i+1}\t#{a.innerText}" | |
puts "#{i+1}\t#{a.innerText}\t#{checker.disqualified.map{|x| "@#{x}"}.join(', ')}\t#{checker.winners.map{|x| "@#{x}"}.join(', ')}" | |
end | |
puts "disqualified: @#{checker.disqualified.join(', @')}" | |
puts "winners: @#{checker.winners.join(', @')}" | |
puts "numbers: #{checker.numbers.join(' ')}" | |
puts "contenders: #{checker.potentials.map{|x| "@#{x}"}.sort.join(', ')}" | |
puts "chance!!: #{checker.potential_winners.map{|x| "@#{x}"}.join(', ')}" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class IcecreamChecker | |
def initialize(numbers) | |
@numbers = numbers | |
@entries = [] | |
@potentials = [] | |
@winners = [] | |
@disqualified = [] | |
@manually_disqualified = [] | |
end | |
attr_reader :numbers, :entries, :winners, :disqualified, :potentials | |
def add(entry) | |
if not disqualified?(entry) and not @winners.include?(entry) | |
if @potentials.include?(entry) | |
@disqualified << entry | |
@potentials.delete(entry) | |
@disqualified.shift if @disqualified.size == 4 | |
else | |
@potentials << entry | |
end | |
end | |
@entries << entry | |
if i = @numbers.index(@entries.size) | |
unless disqualified?(entry) or @winners.include?(entry) | |
@winners << entry | |
@potentials.delete(entry) | |
else | |
@numbers << @numbers.last + (@numbers[i] - @numbers[i-1]) | |
end | |
end | |
end | |
def disqualify(contestant) | |
@manually_disqualified << contestant | |
@winners.delete(contestant) if @winners.include?(contestant) | |
end | |
def disqualified?(contestant) | |
(@manually_disqualified + @disqualified).include?(contestant) | |
end | |
def potential_winners | |
(@entries - @potentials - @disqualified - @manually_disqualified - @winners).sort.uniq | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rubygems' | |
require 'test/unit' | |
require 'shoulda' | |
require 'icecream_checker' | |
require 'ruby-debug' | |
class IcecreamCheckerTest < Test::Unit::TestCase | |
context "5 entries" do | |
setup do | |
@checker = IcecreamChecker.new [2, 5, 6, 11, 15, 21, 22, 23, 30, 39] | |
%w{moonhouse KALSTROM fleecelabs jocap JOCAP}.each do |e| | |
@checker.add(e.downcase) | |
end | |
end | |
should "pick @kalstrom as winner" do | |
assert_equal 'kalstrom', @checker.winners.first | |
end | |
should "disqualify @jocap" do | |
assert @checker.disqualified?('jocap') | |
end | |
should "not pick @jocap as winner as he was disqualified" do | |
assert !@checker.winners.include?('jocap') | |
end | |
end | |
context "25 entries" do | |
setup do | |
@checker = IcecreamChecker.new [2, 5, 6, 11, 15, 21, 22, 23, 30, 39] | |
@checker.disqualify('fleecelabs') | |
@checker.disqualify('snoleoparden') | |
%w{ | |
moonhouse KALSTROM fleecelabs jocap JOCAP | |
KALSTROM lemonad jocap moonhouse jocap | |
LEMONAD alexz kalstrom jocap FLEECELABS | |
agaton kalstrom jocap osserpse HejGustav | |
FLEECELABS MYMLANSOFIA SNOLEOPARDEN jocap snoleoparden | |
ahlstrominfo peterrosdahl kalstrom lemonad FLEECELABS | |
}.each do |e| | |
@checker.add(e.downcase) | |
end | |
end | |
should "not disqualify @kalstrom as he has already won" do | |
assert !@checker.disqualified?('kalstrom') | |
end | |
should "disqualify @moonhouse" do | |
assert @checker.disqualified?('moonhouse') | |
end | |
should "disqualify @lemonad" do | |
assert @checker.disqualified?('lemonad') | |
end | |
should "not pick @lemonad as winners he was disqualified" do | |
assert !@checker.winners.include?('lemonad') | |
end | |
should "pick @mymlansofia as winner" do | |
assert_equal 'mymlansofia', @checker.winners[1] | |
end | |
should "manually disqualify @snoleoparden" do | |
assert @checker.disqualified?('snoleoparden') | |
assert !@checker.winners.include?('snoleoparden') | |
end | |
should "disqualify only once" do | |
assert_equal 1, @checker.disqualified.select {|e| e == 'jocap'}.size | |
end | |
end | |
context "40 entries" do | |
setup do | |
@checker = IcecreamChecker.new [2, 5, 6, 11, 15, 21, 22, 23, 30, 39] | |
@checker.disqualify('fleecelabs') | |
@checker.disqualify('snoleoparden') | |
%w{ | |
moonhouse KALSTROM fleecelabs jocap JOCAP | |
KALSTROM lemonad jocap moonhouse jocap | |
LEMONAD alexz kalstrom jocap FLEECELABS | |
agaton kalstrom jocap osserpse HejGustav | |
FLEECELABS MYMLANSOFIA SNOLEOPARDEN jocap snoleoparden | |
ahlstrominfo peterrosdahl kalstrom lemonad FLEECELABS | |
johaneje pelles osserpse ahlstrominfo osserpse | |
osserpse perkovich golrup VIDEREN klura | |
}.each do |e| | |
@checker.add(e.downcase) | |
end | |
end | |
should "disqualify @osserpse" do | |
assert @checker.disqualified?('osserpse') | |
end | |
should "no longer consider @moonhouse as disqualified" do | |
assert !@checker.disqualified?('moonhouse') | |
end | |
should "pick @videren as winner" do | |
assert @checker.winners.include?('videren') | |
end | |
end | |
context "52 entries" do | |
setup do | |
@checker = IcecreamChecker.new [2, 5, 6, 11, 15, 21, 22, 23, 30, 39] | |
# . . . . . . . | |
@checker.disqualify('fleecelabs') | |
@checker.disqualify('snoleoparden') | |
%w{ | |
moonhouse KALSTROM fleecelabs jocap JOCAP | |
KALSTROM lemonad jocap moonhouse jocap | |
LEMONAD alexz kalstrom jocap FLEECELABS | |
agaton kalstrom jocap osserpse HejGustav | |
FLEECELABS MYMLANSOFIA SNOLEOPARDEN jocap snoleoparden | |
ahlstrominfo peterrosdahl kalstrom lemonad FLEECELABS | |
johaneje pelles osserpse ahlstrominfo osserpse | |
osserpse perkovich golrup VIDEREN klura | |
bolstad MISMISIMOS UCHMAN kalstrom ahlstrominfo | |
fleecelabs martinekman FLEECELABS ahlstrominfo fleecelabs | |
lemonad AHLSTROMINFO fleecelabs videren fleecelabs | |
moonhouse alla LEMONAD GOLRUP klura | |
palace fleecelabs carlberg mismisimos alla | |
HEJGUSTAV hepp fleecelabs fleecelabs fleecelabs | |
AHLSTROMINFO | |
}.each do |e| | |
@checker.add(e.downcase) | |
end | |
end | |
should "pick @mismisimos as winner (extra no. 39+5-2 = 42)" do | |
assert @checker.winners.include?('mismisimos') | |
end | |
should "pick @uchman as winner (extra no. 42+6-5 = 43)" do | |
assert @checker.winners.include?('uchman') | |
end | |
should "add extra nos. 48, 52, 58, 59, 66, 71" do | |
# | |
[48, 52, 58, 59, 66, 71].each do |n| | |
assert @checker.numbers.include?(n), "should include #{n}" | |
end | |
# . . . . . . . . . . . . | |
# 2 5 6 11 15 21 22 23 30 39 42 43 48 52 58 59 66 71 75 81 82 89 93 99 100 | |
43 + 11 - 6 = 48 + 15 - 11 = 52 + 21 - 15 = 58 + 23 - 22 = 59 + 30 - 23 = 66 + 48 - 43 = 71 | |
43 + 11 - 6 + 15 - 11 + 21 - 15 + 23 - 22 + 30 - 23 + 48 - 43 = 71 | |
end | |
should "pick @ahlstrominfo as winner" do | |
assert_equal 'ahlstrominfo', @checker.winners.last | |
end | |
end | |
context "disqualification bug" do | |
setup do | |
@checker = IcecreamChecker.new [1, 9, 10, 13] | |
@checker.add('first') | |
2.times { @checker.add('jeff') } | |
2.times { @checker.add('scooter') } | |
2.times { @checker.add('bogart') } | |
end | |
should "not disqualify @jeff" do | |
2.times { @checker.add('outrun') } | |
assert !@checker.disqualified?('jeff') | |
end | |
should "pick @jeff as winner" do | |
2.times { @checker.add('outrun') } | |
@checker.add('jeff') | |
assert_equal 'jeff', @checker.winners.last | |
end | |
should "pick @jeff as winner even though he has posted entries during his disqualification" do | |
# debugger | |
3.times { @checker.add('jeff') } | |
2.times { @checker.add('outrun') } | |
@checker.add('jeff') | |
assert_equal 'jeff', @checker.winners.last | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment