Решение на Четвърта задача от Борис Монев

Обратно към всички решения

Към профила на Борис Монев

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 53 успешни тест(а)
  • 4 неуспешни тест(а)

Код

class Card
def initialize(rank, suit)
@rank = rank
@suit = suit
end
def rank
@rank
end
def suit
@suit
end
def to_s
return "#{rank.to_s.capitalize} of #{suit.to_s.capitalize}"
end
def ==(other_card)
self.rank == other_card.rank and self.suit == other_card.suit
end
end
class Deck
include Enumerable
def each
@deck.each { |card| yield card }
end
def size
@deck.size
end
def draw_top_card
@deck.unshift
end
def draw_bottom_card
@deck.slice!(-1)
end
def top_card
@deck.first
end
def bottom_card
@deck.last
end
def to_s
@deck.each { |card| card.to_s }.join"\n"
end
def shuffle
@deck.shuffle!
self
end
end
class WarDeck < Deck
def initialize(deck = [])
@card_gen = [1,2,3,4].product([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13])
@card_gen.reverse!.each { |n| n.reverse! }
@suits = { clubs: 1, diamonds: 2, hearts: 3, spades: 4 }
@ranks = Hash[2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9, 8, 10, 9]
@ranks.merge!({jack: 10, queen: 11, king: 12, ace: 13})
@deck = deck
generate_deck if @deck.empty?
end
def deal
WarDeck.new(@deck.shift(26))
end
def play_card
@deck.shift
end
def allow_face_up?
return true if @deck.size <= 3
false
end
def sort
card_gen = @card_gen & @deck.map { |n| [@ranks[n.rank], @suits[n.suit]] }
@deck.clear
while card_gen.any?
rank = card_gen.first[0]
suit = card_gen.shift[1]
card = Card.new(@ranks.invert[rank], @suits.invert[suit])
@deck.push(card)
end
self
end
private
def generate_deck
card_gen = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13].product([1,2,3,4])
card_gen.shuffle!
while @deck.size < 52
rank = card_gen.first[0]
suit = card_gen.shift[1]
card = Card.new(@ranks.invert[rank], @suits.invert[suit])
@deck.push(card)
end
end
end
class BeloteDeck < Deck
def initialize(deck = [])
@card_gen = [1, 2, 3, 4].product([1, 2, 3, 4, 5, 6, 7, 8])
@card_gen.reverse!.each { |n| n.reverse! }
@suits = { clubs: 1, diamonds: 2, hearts: 3, spades: 4 }
@ranks = Hash[7, 1, 8, 2, 9, 3, 10, 7]
@ranks.merge!({jack: 4, queen: 5, king: 6, ace: 8})
@deck = deck
generate_deck if @deck.empty?
end
def deal
BeloteDeck.new(@deck.shift(8))
end
def sort
card_gen = @card_gen & @deck.map { |n| [@ranks[n.rank], @suits[n.suit]] }
@deck.clear
while card_gen.any?
rank = card_gen.first[0]
suit = card_gen.shift[1]
card = Card.new(@ranks.invert[rank], @suits.invert[suit])
@deck.push(card)
end
self
end
def belote?
@deck.select { |card| card.rank == :king or card.rank == :queen }.
collect { |card| card.suit }.uniq! != nil
end
def tierce?
get_cards = @card_gen & @deck.map { |n| [@ranks[n.rank], @suits[n.suit]] }
while get_cards.size > 2
d = get_cards.first(3)
diff = [d[0][0] - d[1][0], d[1][0] - d[2][0]]
return true if (d.all? {|m| m[1] == d[0][1]}) and (diff.all? {|m| m == 1})
get_cards.shift
end
false
end
def quarte?
get_cards = @card_gen & @deck.map { |n| [@ranks[n.rank], @suits[n.suit]] }
while get_cards.size > 3
d = get_cards.first(4)
diff = [d[0][0] - d[1][0], d[1][0] - d[2][0], d[2][0] - d[3][0]]
return true if (d.all? {|m| m[1] == d[0][1]}) and (diff.all? {|m| m == 1})
get_cards.shift
end
false
end
def quint?
get_cards = @card_gen & @deck.map { |n| [@ranks[n.rank], @suits[n.suit]] }
while get_cards.size > 4
d = get_cards.first(5)
diff = [d[0][0] - d[1][0], d[1][0] - d[2][0], d[2][0] - d[3][0]]
diff << (d[3][0] - d[4][0])
return true if (d.all? {|m| m[1] == d[0][1]}) and (diff.all? {|m| m == 1})
get_cards.shift
end
false
end
def highest_of_suit(suit)
highest_rank = @deck.select { |card| card.suit == suit }.
map { |card| @ranks[card.rank] }.sort.reverse.shift
@deck.select do
|card| card.suit == suit and @ranks[card.rank] == highest_rank
end
end
def carre_of_jacks?
@deck.select { |card| card.rank == :jack }.size == 4
end
def carre_of_aces?
@deck.select { |card| card.rank == :ace }.size == 4
end
def carre_of_nines?
@deck.select { |card| card.rank == 9 }.size == 4
end
private
def generate_deck
card_gen = [1, 2, 3, 4, 5, 6, 7, 8].product([1, 2, 3, 4])
card_gen.shuffle!
while @deck.size < 32
rank = card_gen.first[0]
suit = card_gen.shift[1]
card = Card.new(@ranks.invert[rank], @suits.invert[suit])
@deck.push(card)
end
end
end
class SixtySixDeck < Deck
def initialize(deck = [])
@card_gen = [1, 2, 3, 4].product([1, 2, 3, 4, 5, 6])
@card_gen.reverse!.each { |n| n.reverse! }
@suits = { clubs: 1, diamonds: 2, hearts: 3, spades: 4 }
@ranks = Hash[9, 1, 10, 5]
@ranks.merge!({jack: 2, queen: 3, king: 4, ace: 6})
@deck = deck
generate_deck if @deck.empty?
end
def deal
SixtySixDeck.new(@deck.shift(6))
end
def sort
card_gen = @card_gen & @deck.map { |n| [@ranks[n.rank], @suits[n.suit]] }
@deck.clear
while card_gen.any?
rank = card_gen.first[0]
suit = card_gen.shift[1]
card = Card.new(@ranks.invert[rank], @suits.invert[suit])
@deck.push(card)
end
self
end
def twenty?(trump_suit)
@deck.select { |card| card.rank == :king or card.rank == :queen }.
select { |card| card.suit != trump_suit }.
map { |card| card.suit }.uniq! != nil
end
def forty?(trump_suit)
@deck.select { |card| card.rank == :king or card.rank == :queen }.
select { |card| card.suit == trump_suit }.size == 2
end
private
def generate_deck
card_gen = [1, 2, 3, 4, 5, 6].product([1, 2, 3, 4])
card_gen.shuffle!
while @deck.size < 24
rank = card_gen.first[0]
suit = card_gen.shift[1]
card = Card.new(@ranks.invert[rank], @suits.invert[suit])
@deck.push(card)
end
end
end

Лог от изпълнението

......F............F.......F..................F..........

Failures:

  1) WarDeck behaves like a deck #draw_top_card pops the top-most card
     Failure/Error: expect(small_deck.draw_top_card).to eq ace_of_spades
       
       expected: #<Card:0x007f41971c97d0 @rank=:ace, @suit=:spades>
            got: [#<Card:0x007f41971c97d0 @rank=:ace, @suit=:spades>, #<Card:0x007f41971c97a8 @rank=9, @suit=:clubs>]
       
       (compared using ==)
       
       Diff:
       @@ -1,2 +1,3 @@
       -#<Card:0x007f41971c97d0 @rank=:ace, @suit=:spades>
       +[#<Card:0x007f41971c97d0 @rank=:ace, @suit=:spades>,
       + #<Card:0x007f41971c97a8 @rank=9, @suit=:clubs>]
     Shared Example Group: "a deck" called from /tmp/d20151112-27349-wcoid6/spec.rb:140
     # /tmp/d20151112-27349-wcoid6/spec.rb:29:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) BeloteDeck behaves like a deck #draw_top_card pops the top-most card
     Failure/Error: expect(small_deck.draw_top_card).to eq ace_of_spades
       
       expected: #<Card:0x007f4197136160 @rank=:ace, @suit=:spades>
            got: [#<Card:0x007f4197136160 @rank=:ace, @suit=:spades>, #<Card:0x007f4197136138 @rank=9, @suit=:clubs>]
       
       (compared using ==)
       
       Diff:
       @@ -1,2 +1,3 @@
       -#<Card:0x007f4197136160 @rank=:ace, @suit=:spades>
       +[#<Card:0x007f4197136160 @rank=:ace, @suit=:spades>,
       + #<Card:0x007f4197136138 @rank=9, @suit=:clubs>]
     Shared Example Group: "a deck" called from /tmp/d20151112-27349-wcoid6/spec.rb:191
     # /tmp/d20151112-27349-wcoid6/spec.rb:29:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  3) BeloteDeck hand #highest_of_suit returns the strongest card of the specified suit
     Failure/Error: expect(hand.highest_of_suit(:clubs)).to eq Card.new(:ace, :clubs)
       
       expected: #<Card:0x007f419705e8a0 @rank=:ace, @suit=:clubs>
            got: [#<Card:0x007f419706c400 @rank=:ace, @suit=:clubs>]
       
       (compared using ==)
       
       Diff:
       @@ -1,2 +1,2 @@
       -#<Card:0x007f419705e8a0 @rank=:ace, @suit=:clubs>
       +[#<Card:0x007f419706c400 @rank=:ace, @suit=:clubs>]
     # /tmp/d20151112-27349-wcoid6/spec.rb:232:in `block (4 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  4) SixtySixDeck behaves like a deck #draw_top_card pops the top-most card
     Failure/Error: expect(small_deck.draw_top_card).to eq ace_of_spades
       
       expected: #<Card:0x007f4196bb62d0 @rank=:ace, @suit=:spades>
            got: [#<Card:0x007f4196bb62d0 @rank=:ace, @suit=:spades>, #<Card:0x007f4196bb62a8 @rank=9, @suit=:clubs>]
       
       (compared using ==)
       
       Diff:
       @@ -1,2 +1,3 @@
       -#<Card:0x007f4196bb62d0 @rank=:ace, @suit=:spades>
       +[#<Card:0x007f4196bb62d0 @rank=:ace, @suit=:spades>,
       + #<Card:0x007f4196bb62a8 @rank=9, @suit=:clubs>]
     Shared Example Group: "a deck" called from /tmp/d20151112-27349-wcoid6/spec.rb:400
     # /tmp/d20151112-27349-wcoid6/spec.rb:29:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.05045 seconds
57 examples, 4 failures

Failed examples:

rspec /tmp/d20151112-27349-wcoid6/spec.rb:28 # WarDeck behaves like a deck #draw_top_card pops the top-most card
rspec /tmp/d20151112-27349-wcoid6/spec.rb:28 # BeloteDeck behaves like a deck #draw_top_card pops the top-most card
rspec /tmp/d20151112-27349-wcoid6/spec.rb:220 # BeloteDeck hand #highest_of_suit returns the strongest card of the specified suit
rspec /tmp/d20151112-27349-wcoid6/spec.rb:28 # SixtySixDeck behaves like a deck #draw_top_card pops the top-most card

История (1 версия и 1 коментар)

Борис обнови решението на 11.11.2015 00:09 (преди над 8 години)

+class Card
+ def initialize(rank, suit)
+ @rank = rank
+ @suit = suit
+ end
+ def rank
+ @rank
+ end
+ def suit
+ @suit
+ end
+ def to_s
+ return "#{rank.to_s.capitalize} of #{suit.to_s.capitalize}"
+ end
+ def ==(other_card)
+ self.rank == other_card.rank and self.suit == other_card.suit
+ end
+end
+
+class Deck
+ include Enumerable
+
+ def each
+ @deck.each { |card| yield card }
+ end
+
+ def size
+ @deck.size
+ end
+
+ def draw_top_card
+ @deck.unshift
+ end
+
+ def draw_bottom_card
+ @deck.slice!(-1)
+ end
+
+ def top_card
+ @deck.first
+ end
+
+ def bottom_card
+ @deck.last
+ end
+
+ def to_s
+ @deck.each { |card| card.to_s }.join"\n"
+ end
+
+ def shuffle
+ @deck.shuffle!
+ self
+ end
+end
+
+class WarDeck < Deck
+
+ def initialize(deck = [])
+ @card_gen = [1,2,3,4].product([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13])
+ @card_gen.reverse!.each { |n| n.reverse! }
+ @suits = { clubs: 1, diamonds: 2, hearts: 3, spades: 4 }
+ @ranks = Hash[2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9, 8, 10, 9]
+ @ranks.merge!({jack: 10, queen: 11, king: 12, ace: 13})
+ @deck = deck
+ generate_deck if @deck.empty?
+ end
+
+ def deal
+ WarDeck.new(@deck.shift(26))
+ end
+
+ def play_card
+ @deck.shift
+ end
+
+ def allow_face_up?
+ return true if @deck.size <= 3
+ false
+ end
+
+ def sort
+ card_gen = @card_gen & @deck.map { |n| [@ranks[n.rank], @suits[n.suit]] }
+ @deck.clear
+ while card_gen.any?
+ rank = card_gen.first[0]
+ suit = card_gen.shift[1]
+ card = Card.new(@ranks.invert[rank], @suits.invert[suit])
+ @deck.push(card)
+ end
+ self
+ end
+
+ private
+ def generate_deck
+ card_gen = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13].product([1,2,3,4])
+ card_gen.shuffle!
+ while @deck.size < 52
+ rank = card_gen.first[0]
+ suit = card_gen.shift[1]
+ card = Card.new(@ranks.invert[rank], @suits.invert[suit])
+ @deck.push(card)
+ end
+ end
+end
+
+class BeloteDeck < Deck
+
+ def initialize(deck = [])
+ @card_gen = [1, 2, 3, 4].product([1, 2, 3, 4, 5, 6, 7, 8])
+ @card_gen.reverse!.each { |n| n.reverse! }
+ @suits = { clubs: 1, diamonds: 2, hearts: 3, spades: 4 }
+ @ranks = Hash[7, 1, 8, 2, 9, 3, 10, 7]
+ @ranks.merge!({jack: 4, queen: 5, king: 6, ace: 8})
+ @deck = deck
+ generate_deck if @deck.empty?
+ end
+
+ def deal
+ BeloteDeck.new(@deck.shift(8))
+ end
+
+ def sort
+ card_gen = @card_gen & @deck.map { |n| [@ranks[n.rank], @suits[n.suit]] }
+ @deck.clear
+ while card_gen.any?
+ rank = card_gen.first[0]
+ suit = card_gen.shift[1]
+ card = Card.new(@ranks.invert[rank], @suits.invert[suit])
+ @deck.push(card)
+ end
+ self
+ end
+
+ def belote?
+ @deck.select { |card| card.rank == :king or card.rank == :queen }.
+ collect { |card| card.suit }.uniq! != nil
+ end
+
+ def tierce?
+ get_cards = @card_gen & @deck.map { |n| [@ranks[n.rank], @suits[n.suit]] }
+ while get_cards.size > 2
+ d = get_cards.first(3)
+ diff = [d[0][0] - d[1][0], d[1][0] - d[2][0]]
+ return true if (d.all? {|m| m[1] == d[0][1]}) and (diff.all? {|m| m == 1})
+ get_cards.shift
+ end
+ false
+ end
+
+ def quarte?
+ get_cards = @card_gen & @deck.map { |n| [@ranks[n.rank], @suits[n.suit]] }
+ while get_cards.size > 3
+ d = get_cards.first(4)
+ diff = [d[0][0] - d[1][0], d[1][0] - d[2][0], d[2][0] - d[3][0]]
+ return true if (d.all? {|m| m[1] == d[0][1]}) and (diff.all? {|m| m == 1})
+ get_cards.shift
+ end
+ false
+ end
+
+ def quint?
+ get_cards = @card_gen & @deck.map { |n| [@ranks[n.rank], @suits[n.suit]] }
+ while get_cards.size > 4
+ d = get_cards.first(5)
+ diff = [d[0][0] - d[1][0], d[1][0] - d[2][0], d[2][0] - d[3][0]]
+ diff << (d[3][0] - d[4][0])
+ return true if (d.all? {|m| m[1] == d[0][1]}) and (diff.all? {|m| m == 1})
+ get_cards.shift
+ end
+ false
+ end
+
+ def highest_of_suit(suit)
+ highest_rank = @deck.select { |card| card.suit == suit }.
+ map { |card| @ranks[card.rank] }.sort.reverse.shift
+ @deck.select do
+ |card| card.suit == suit and @ranks[card.rank] == highest_rank
+ end
+ end
+
+ def carre_of_jacks?
+ @deck.select { |card| card.rank == :jack }.size == 4
+ end
+
+ def carre_of_aces?
+ @deck.select { |card| card.rank == :ace }.size == 4
+ end
+
+ def carre_of_nines?
+ @deck.select { |card| card.rank == 9 }.size == 4
+ end
+
+ private
+
+ def generate_deck
+ card_gen = [1, 2, 3, 4, 5, 6, 7, 8].product([1, 2, 3, 4])
+ card_gen.shuffle!
+ while @deck.size < 32
+ rank = card_gen.first[0]
+ suit = card_gen.shift[1]
+ card = Card.new(@ranks.invert[rank], @suits.invert[suit])
+ @deck.push(card)
+ end
+ end
+end
+
+class SixtySixDeck < Deck
+
+ def initialize(deck = [])
+ @card_gen = [1, 2, 3, 4].product([1, 2, 3, 4, 5, 6])
+ @card_gen.reverse!.each { |n| n.reverse! }
+ @suits = { clubs: 1, diamonds: 2, hearts: 3, spades: 4 }
+ @ranks = Hash[9, 1, 10, 5]
+ @ranks.merge!({jack: 2, queen: 3, king: 4, ace: 6})
+ @deck = deck
+ generate_deck if @deck.empty?
+ end
+
+ def deal
+ SixtySixDeck.new(@deck.shift(6))
+ end
+
+ def sort
+ card_gen = @card_gen & @deck.map { |n| [@ranks[n.rank], @suits[n.suit]] }
+ @deck.clear
+ while card_gen.any?
+ rank = card_gen.first[0]
+ suit = card_gen.shift[1]
+ card = Card.new(@ranks.invert[rank], @suits.invert[suit])
+ @deck.push(card)
+ end
+ self
+ end
+
+ def twenty?(trump_suit)
+ @deck.select { |card| card.rank == :king or card.rank == :queen }.
+ select { |card| card.suit != trump_suit }.
+ map { |card| card.suit }.uniq! != nil
+ end
+
+ def forty?(trump_suit)
+ @deck.select { |card| card.rank == :king or card.rank == :queen }.
+ select { |card| card.suit == trump_suit }.size == 2
+ end
+
+ private
+
+ def generate_deck
+ card_gen = [1, 2, 3, 4, 5, 6].product([1, 2, 3, 4])
+ card_gen.shuffle!
+ while @deck.size < 24
+ rank = card_gen.first[0]
+ suit = card_gen.shift[1]
+ card = Card.new(@ranks.invert[rank], @suits.invert[suit])
+ @deck.push(card)
+ end
+ end
+end

На ръба си да ти отнема точка за проблеми със стила.

В allow_face_up? if-ът е съвсем излишен.

Слагай празни редове между дефинициите на методи.

На места кодът ти може да се подобри.

Прегледай решенията на колеги и нашето примерно решение за алтернативни идеи.