the_gambler 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -27,7 +27,8 @@ Right now, the following stuff works. Assume anything not mentioned in this list
27
27
 
28
28
  * Blackjack hand evaluation
29
29
  * Poker hand evaluation
30
- * 5 or 7 card hands
30
+ * 5- or 7-card hands
31
+ * 9-card hands
31
32
 
32
33
  ## Contributing to `the_gambler`
33
34
 
data/Rakefile CHANGED
@@ -43,3 +43,15 @@ task :default => :spec
43
43
 
44
44
  require 'yard'
45
45
  YARD::Rake::YardocTask.new
46
+
47
+ namespace :benchmark do
48
+ require 'the_gambler'
49
+
50
+ desc 'Test how long it takes to evaluate a given number of random hands.'
51
+ task :randoms do
52
+ 10_000_000.times do |i|
53
+ TheGambler::Hand.new(rand(52), rand(52), rand(52), rand(52), rand(52)).poker_value
54
+ end
55
+ end
56
+ end
57
+
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -8,6 +8,11 @@ module TheGambler
8
8
 
9
9
  def initialize(arg)
10
10
  case arg.class.to_s
11
+ when 'Card','TheGambler::Card'
12
+ rank, suit = arg.rank, arg.suit
13
+ when 'Fixnum'
14
+ rank = RANKS[arg.zero? ? -1 : arg % 13]
15
+ suit = SUIT_STRINGS[arg / 13]
11
16
  when 'String'
12
17
  if arg =~ /([ajqk2-9]|10)([SCHD])/i then
13
18
  rank, suit = $1.upcase, $2
@@ -26,8 +31,6 @@ module TheGambler
26
31
  else
27
32
  raise ArgumentError.new("Invalid hash: #{arg.inspect}")
28
33
  end
29
- when 'Card','TheGambler::Card'
30
- rank, suit = arg.rank, arg.suit
31
34
  else
32
35
  raise ArgumentError.new("Must supply either a String, an Array, or a Hash, not a #{arg.class.to_s}")
33
36
  end
@@ -95,19 +95,17 @@ module TheGambler
95
95
  end
96
96
 
97
97
  def straight?
98
- # values = contents.map(&:numerical_value).sort
99
- # values == (values.min..values.max).to_a or values == [2, 3, 4, 5, 14]
100
- nums = contents.map(&:numerical_value)
101
- return true if nums.sort == [2, 3, 4, 5, 14]
98
+ nums = contents.map(&:numerical_value).sort
99
+ return true if nums == [2, 3, 4, 5, 14]
102
100
 
103
- (2..14).each_cons(5) do |straight|
104
- return true if (nums & straight).count == 5
105
- end
101
+ one_different = nums[1..-1].zip(nums[0..-2]).group_by{|a, b| a - b}[1]
102
+
103
+ one_different and one_different.count >= 4
106
104
  end
107
105
 
108
106
  def flush?
109
107
  c = contents.group_by(&:suit)
110
- !! contents.group_by(&:suit).values.detect{|k| k.count == 5}
108
+ !! contents.group_by(&:suit).values.detect{|k| k.count >= 5}
111
109
  end
112
110
 
113
111
  def full_house?
@@ -124,7 +122,7 @@ module TheGambler
124
122
  end
125
123
 
126
124
  def royal_flush?
127
- contents.sort_by(&:numerical_value).map(&:to_s).join =~ %r{10([SCHD])J\1Q\1K\1A\1}i
125
+ contents.sort_by(&:numerical_value).map(&:to_s).join =~ %r{10([SCHD]).*J\1.*Q\1.*K\1.*A\1}i
128
126
  end
129
127
 
130
128
  end
@@ -20,6 +20,10 @@ module TheGambler
20
20
  it 'can take a Card as its argument' do
21
21
  (->{ Card.new(Card.new rank: 'A', suit: 'D') }).should_not raise_error
22
22
  end
23
+
24
+ it 'can take a Fixnum as its argument' do
25
+ (->{ Card.new 39 }).should_not raise_error
26
+ end
23
27
 
24
28
  describe 'with hash' do
25
29
  Card::RANKS.each do |rank|
@@ -57,6 +61,16 @@ module TheGambler
57
61
  end
58
62
  end
59
63
 
64
+ describe 'with string' do
65
+ (0..51).each do |i|
66
+ it "should correctly parse #{i}" do
67
+ card = Card.new i
68
+ card.rank.should eq(Card::RANKS[i.zero? ? -1 : i % 13])
69
+ card.suit.should eq(Card::SUIT_SYMBOLS[i / 13])
70
+ end
71
+ end
72
+ end
73
+
60
74
  end
61
75
 
62
76
  end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ module TheGambler
4
+ describe Hand do
5
+ context 'nine-card hands' do
6
+ it 'should recognize a royal flush within a nine-card hand' do
7
+ Hand.new(*%w{2D QH 3D KH 4C JH QD 10H AH}).royal_flush?.should be_true
8
+ end
9
+
10
+ it 'should recognize a straight flush within a nine-card hand' do
11
+ Hand.new(*%w{9H QH KH 4C JH 10H 2D 4H 7D}).straight_flush?.should be_true
12
+ end
13
+
14
+ context 'with four of a kind' do
15
+ it 'should recognize a four of a kind within a nine-card hand' do
16
+ Hand.new(*%w{9D 9H 9C 4C 9S 10H 5D QD 7D}).four_of_a_kind?.should be_true
17
+ end
18
+
19
+ it 'should recognize four of a kind and three of a kind at the same time as four of a kind only' do
20
+ Hand.new(*%w{9D 9H 9C 4C 9S QD 5H 4H 4D}).four_of_a_kind?.should be_true
21
+ end
22
+ end
23
+
24
+ context 'with a full house' do
25
+ it 'should recognize a full house within a nine-card hand' do
26
+ Hand.new(*%w{9D 3D 2C 9H 9H 4C 4H 10H 7D}).full_house?.should be_true
27
+ end
28
+
29
+ it 'should recognize a full house within a nine-card hand' do
30
+ Hand.new(*%w{9D 9H 9H 4C 4H 2D JH 4H 7D}).full_house?.should be_true
31
+ end
32
+ end
33
+
34
+ it 'should recognize a flush within a nine-card hand' do
35
+ Hand.new(*%w{9H QH KH 3D 10H 4C 6H 10H 7D}).flush?.should be_true
36
+ end
37
+
38
+ context 'with a straight' do
39
+ it 'should recognize a straight within a nine-card hand' do
40
+ Hand.new(*%w{9D 3C AD QH KH JC 6H 10H 7D}).straight?.should be_true
41
+ end
42
+ end
43
+
44
+ it 'should recognize a three of a kind within a nine-card hand' do
45
+ Hand.new(*%w{QD QH QC 4C 3D 6C JH 10H 7D}).three_of_a_kind?.should be_true
46
+ end
47
+
48
+ it 'should recognize a two pair within a nine-card hand' do
49
+ Hand.new(*%w{9D QH 9H 2D QC 4C 4H 10H QD}).two_pair?.should be_true
50
+ end
51
+
52
+ it 'should recognize a pair within a nine-card hand' do
53
+ Hand.new(*%w{KD QH KH 2C 5D 4C JH 10H 7D}).one_pair?.should be_true
54
+ end
55
+
56
+ it 'should recognize a high card within a nine-card hand' do
57
+ Hand.new(*%w{9D QH 3C 6D KH 4C 2H 10H 7D}).high_card?.should be_true
58
+ end
59
+
60
+ end
61
+ end
62
+ end
63
+
@@ -57,6 +57,10 @@ module TheGambler
57
57
  Hand.new(*%w{9D QH KH 4C 2H 10H 7D}).high_card?.should be_true
58
58
  end
59
59
  end
60
+
61
+
62
+
63
+
60
64
  end
61
65
  end
62
66
 
data/the_gambler.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "the_gambler"
8
- s.version = "1.1.0"
8
+ s.version = "1.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["max thom stahl"]
12
- s.date = "2012-11-20"
12
+ s.date = "2012-11-24"
13
13
  s.description = "\n Really common tasks in programs that use playing cards are a pain to implement. This is my\n implementation. Use it. Or don't.\n "
14
14
  s.email = "max@villainousindustries.com"
15
15
  s.extra_rdoc_files = [
@@ -33,7 +33,6 @@ Gem::Specification.new do |s|
33
33
  "lib/the_gambler/hand.rb",
34
34
  "lib/the_gambler/poker.rb",
35
35
  "spec/cards/initialization_spec.rb",
36
- "spec/decks/deck_spec.rb",
37
36
  "spec/hands/hands_spec.rb",
38
37
  "spec/hands/poker/hand_flush_spec.rb",
39
38
  "spec/hands/poker/hand_four_of_a_kind_spec.rb",
@@ -46,8 +45,8 @@ Gem::Specification.new do |s|
46
45
  "spec/hands/poker/hand_three_of_a_kind_spec.rb",
47
46
  "spec/hands/poker/hand_two_pair_spec.rb",
48
47
  "spec/hands/poker/kicker_cards_spec.rb",
49
- "spec/hands/seven_or_nine_card_spec.rb",
50
- "spec/players/player_spec.rb",
48
+ "spec/hands/poker/nine_card_hands_spec.rb",
49
+ "spec/hands/poker/seven_card_hands_spec.rb",
51
50
  "spec/spec_helper.rb",
52
51
  "spec/support/shared_examples/shared_poker_hands.rb",
53
52
  "spec/the_gambler_spec.rb",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: the_gambler
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-20 00:00:00.000000000 Z
12
+ date: 2012-11-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -132,7 +132,6 @@ files:
132
132
  - lib/the_gambler/hand.rb
133
133
  - lib/the_gambler/poker.rb
134
134
  - spec/cards/initialization_spec.rb
135
- - spec/decks/deck_spec.rb
136
135
  - spec/hands/hands_spec.rb
137
136
  - spec/hands/poker/hand_flush_spec.rb
138
137
  - spec/hands/poker/hand_four_of_a_kind_spec.rb
@@ -145,8 +144,8 @@ files:
145
144
  - spec/hands/poker/hand_three_of_a_kind_spec.rb
146
145
  - spec/hands/poker/hand_two_pair_spec.rb
147
146
  - spec/hands/poker/kicker_cards_spec.rb
148
- - spec/hands/seven_or_nine_card_spec.rb
149
- - spec/players/player_spec.rb
147
+ - spec/hands/poker/nine_card_hands_spec.rb
148
+ - spec/hands/poker/seven_card_hands_spec.rb
150
149
  - spec/spec_helper.rb
151
150
  - spec/support/shared_examples/shared_poker_hands.rb
152
151
  - spec/the_gambler_spec.rb
@@ -166,7 +165,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
166
165
  version: '0'
167
166
  segments:
168
167
  - 0
169
- hash: 9032265535672364
168
+ hash: -448834733471940909
170
169
  required_rubygems_version: !ruby/object:Gem::Requirement
171
170
  none: false
172
171
  requirements:
@@ -1,33 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module TheGambler
4
-
5
- describe Deck do
6
- let(:deck) { Deck.new }
7
-
8
- describe '#initialize' do
9
- it 'should accept cards as arguments' do
10
- pending
11
- end
12
-
13
- it 'should accept an array of cards as arguments' do
14
- pending
15
- end
16
-
17
- end
18
-
19
- describe '#deal' do
20
- it 'should deal the first card in the deck' do
21
- pending
22
- end
23
- end
24
-
25
- describe '#shuffle' do
26
- it 'should change the ordering of the deck in a random manner' do
27
- pending
28
- end
29
- end
30
-
31
- end
32
-
33
- end
File without changes