Skip to content

Instantly share code, notes, and snippets.

@plindberg
Created August 26, 2009 09:11
Show Gist options
  • Save plindberg/175413 to your computer and use it in GitHub Desktop.
Save plindberg/175413 to your computer and use it in GitHub Desktop.
Koden som fiskade fram vinnare i glasstävlingen på Jaiku
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(', ')}"
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
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