Решение на Четвърта задача от Станимира Влаева

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

Към профила на Станимира Влаева

Резултати

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

Код

class Card
attr_reader :rank, :suit
def initialize(rank, suit)
@rank = rank
@suit = suit
end
def ==(other)
self.to_s == other.to_s
end
def to_s
"#{@rank.to_s.capitalize} of #{@suit.capitalize}"
end
end
class Deck
include Enumerable
RANKS = [2, 3, 4, 5, 6, 7, 8, 9, 10, :jack, :queen, :king, :ace]
SUITS = [:spades, :hearts, :diamonds, :clubs]
def initialize(deck = default_deck)
@deck = deck
end
def size
@deck.length
end
def draw_top_card
@deck.shift
end
def draw_bottom_card
@deck.pop
end
def top_card
@deck.first
end
def bottom_card
@deck.last
end
def shuffle
@deck.shuffle!
end
def sort(ranks = RANKS)
@deck.sort! do |a, b|
comp = SUITS.index(a.suit) <=> SUITS.index(b.suit)
comp.zero? ? (ranks.index(b.rank) <=> ranks.index(a.rank)) : comp
end
end
def to_s
@deck.each { |card| card.to_s }
end
def deal(cards)
hand = cards < self.size ? @deck.take(cards) : @deck
@deck -= hand
hand
end
private
def each
@deck.each { |card| yield card }
end
def default_deck(ranks = RANKS)
ranks.collect_concat { |rank|
SUITS.map { |suit| Card.new(rank, suit) }
}
end
end
class WarDeck < Deck
CARDS_FOR_HAND = 26
def deal
WarHand.new(super CARDS_FOR_HAND)
end
end
class BeloteDeck < Deck
RANKS = [7, 8, 9, :jack, :queen, :king, 10, :ace]
CARDS_FOR_HAND = 8
def initialize(deck = default_deck(RANKS))
super(deck)
end
def deal
BeloteHand.new(super CARDS_FOR_HAND)
end
def sort
super(RANKS)
end
end
class SixtySixDeck < Deck
RANKS = [9, :jack, :queen, :king, 10, :ace]
CARDS_FOR_HAND = 6
def initialize(deck = default_deck(RANKS))
super(deck)
end
def deal
SixtySixHand.new(super CARDS_FOR_HAND)
end
def sort
super(RANKS)
end
end
class Hand
SUITS = [:spades, :hearts, :diamonds, :clubs]
attr_reader :cards
def initialize(cards)
@cards = cards
end
def size
@cards.length
end
end
class WarHand < Hand
def play_card
@cards.shift
end
def allow_face_up?
self.size <= 3
end
end
class BeloteHand < Hand
RANKS = [7, 8, 9, :jack, :queen, :king, 10, :ace]
def highest_of_suit(suit)
@cards.select { |card| card.suit == suit }.
sort { |a, b| RANKS.index(a.rank) <=> RANKS.index(b.rank) }.
last
end
def belote?
split_by_suit(@cards).
map { |suit| suit.include? :queen and suit.include? :king }.
any?
end
def tierce?
consecutive? 3
end
def quarte?
consecutive? 4
end
def quint?
consecutive? 5
end
def carre_of_jacks?
carre?(:jack)
end
def carre_of_nines?
carre?(9)
end
def carre_of_aces?
carre?(:ace)
end
private
def consecutive?(number_of_cons)
sorted_cards = sort(@cards)
ranks = split_by_suit(sorted_cards).
map { |group| group.map { |rank| RANKS.index(rank) } }
ranks.map do |suit|
suit.each_cons(number_of_cons).
map { |arr| consecutive_numbers?(arr) }.
any?
end.
any?
end
def consecutive_numbers?(arr)
arr.each_cons(2).all? { |a, b| a == b + 1 }
end
def split_by_suit(cards)
cards.group_by { |card| card.suit }.
map { |group| group.last }.
map { |group| group.map { |card| card.rank } }
end
def sort(cards)
cards.sort! do |a, b|
sort = SUITS.index(a.suit) <=> SUITS.index(b.suit)
sort.zero? ? (RANKS.index(b.rank) <=> RANKS.index(a.rank)) : sort
end
end
def carre?(rank)
@cards.select { |card| card.rank == rank }.count == 4
end
end
class SixtySixHand < Hand
def twenty?(trump_suit)
@cards.select { |card| card.suit != trump_suit }.
group_by { |card| card.suit }.
map { |group| group.last }.
map { |suit| suit.map! { |card| card.rank } }.
map { |suit| suit.include? :queen and suit.include? :king }.
any?
end
def forty?(trump_suit)
trumps = @cards.select { |card| card.suit == trump_suit }.
map { |card| card.rank }
trumps.include? :queen and trumps.include? :king
end
end

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

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

Failures:

  1) WarDeck behaves like a deck implements Enumerable
     Failure/Error: expect(small_deck).to respond_to(:each)
       expected #<WarDeck:0x007fd60c955f30 @deck=[#<Card:0x007fd60c955ff8 @rank=:ace, @suit=:spades>, #<Card:0x007fd60c955f80 @rank=9, @suit=:clubs>]> to respond to :each
     Shared Example Group: "a deck" called from /tmp/d20151112-27349-bglbcg/spec.rb:140
     # /tmp/d20151112-27349-bglbcg/spec.rb:10:in `block (2 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) WarDeck behaves like a deck #to_s returns the names of the cards, each on its own line
     Failure/Error: expect(small_deck.to_s.strip).to eq "Ace of Spades\n9 of Clubs"
     NoMethodError:
       undefined method `strip' for #<Array:0x007fd60d2a33a8>
     Shared Example Group: "a deck" called from /tmp/d20151112-27349-bglbcg/spec.rb:140
     # /tmp/d20151112-27349-bglbcg/spec.rb:68: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 behaves like a deck implements Enumerable
     Failure/Error: expect(small_deck).to respond_to(:each)
       expected #<BeloteDeck:0x007fd60d1a3ac0 @deck=[#<Card:0x007fd60d1a3bb0 @rank=:ace, @suit=:spades>, #<Card:0x007fd60d1a3b88 @rank=9, @suit=:clubs>]> to respond to :each
     Shared Example Group: "a deck" called from /tmp/d20151112-27349-bglbcg/spec.rb:191
     # /tmp/d20151112-27349-bglbcg/spec.rb:10:in `block (2 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) BeloteDeck behaves like a deck #to_s returns the names of the cards, each on its own line
     Failure/Error: expect(small_deck.to_s.strip).to eq "Ace of Spades\n9 of Clubs"
     NoMethodError:
       undefined method `strip' for #<Array:0x007fd60d145df8>
     Shared Example Group: "a deck" called from /tmp/d20151112-27349-bglbcg/spec.rb:191
     # /tmp/d20151112-27349-bglbcg/spec.rb:68: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)>'

  5) SixtySixDeck behaves like a deck implements Enumerable
     Failure/Error: expect(small_deck).to respond_to(:each)
       expected #<SixtySixDeck:0x007fd60d5ba5c8 @deck=[#<Card:0x007fd60d5ba668 @rank=:ace, @suit=:spades>, #<Card:0x007fd60d5ba640 @rank=9, @suit=:clubs>]> to respond to :each
     Shared Example Group: "a deck" called from /tmp/d20151112-27349-bglbcg/spec.rb:400
     # /tmp/d20151112-27349-bglbcg/spec.rb:10:in `block (2 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)>'

  6) SixtySixDeck behaves like a deck #to_s returns the names of the cards, each on its own line
     Failure/Error: expect(small_deck.to_s.strip).to eq "Ace of Spades\n9 of Clubs"
     NoMethodError:
       undefined method `strip' for #<Array:0x007fd60d70be18>
     Shared Example Group: "a deck" called from /tmp/d20151112-27349-bglbcg/spec.rb:400
     # /tmp/d20151112-27349-bglbcg/spec.rb:68: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.05988 seconds
57 examples, 6 failures

Failed examples:

rspec /tmp/d20151112-27349-bglbcg/spec.rb:8 # WarDeck behaves like a deck implements Enumerable
rspec /tmp/d20151112-27349-bglbcg/spec.rb:67 # WarDeck behaves like a deck #to_s returns the names of the cards, each on its own line
rspec /tmp/d20151112-27349-bglbcg/spec.rb:8 # BeloteDeck behaves like a deck implements Enumerable
rspec /tmp/d20151112-27349-bglbcg/spec.rb:67 # BeloteDeck behaves like a deck #to_s returns the names of the cards, each on its own line
rspec /tmp/d20151112-27349-bglbcg/spec.rb:8 # SixtySixDeck behaves like a deck implements Enumerable
rspec /tmp/d20151112-27349-bglbcg/spec.rb:67 # SixtySixDeck behaves like a deck #to_s returns the names of the cards, each on its own line

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

Станимира обнови решението на 08.11.2015 17:27 (преди над 8 години)

+class Card
+ attr_reader :rank, :suit
+
+ def initialize(rank, suit)
+ @rank = rank
+ @suit = suit
+ end
+
+ def ==(other)
+ self.to_s == other.to_s
+ end
+
+ def to_s
+ "#{@rank.to_s.capitalize} of #{@suit.capitalize}"
+ end
+end
+
+class Deck
+ include Enumerable
+
+ RANKS = [2, 3, 4, 5, 6, 7, 8, 9, 10, :jack, :queen, :king, :ace]
+ SUITS = [:spades, :hearts, :diamonds, :clubs]
+
+ def initialize(deck = default_deck)
+ @deck = deck
+ end
+
+ def size
+ @deck.length
+ end
+
+ def draw_top_card
+ @deck.shift!
+ end
+
+ def draw_bottom_card
+ @deck.pop!
+ end
+
+ def top_card
+ @deck.first
+ end
+
+ def bottom_card
+ @deck.last
+ end
+
+ def shuffle
+ @deck.shuffle!
+ end
+
+ def sort
+ @deck.sort! do |a, b|
+ comp = SUITS.index(b.suit) <=> SUITS.index(a.suit)
+ comp.zero? ? (RANKS.index(b.rank) <=> RANKS.index(a.rank)) : comp
+ end
+ end
+
+ def to_s
+ @deck.each { |card| card.to_s }
+ end
+
+ def deal(cards)
+ cards < self.size ? @deck.take(cards) : @deck
+ end
+
+ private
+ def each
+ @deck.each { |card| yield card }
+ end
+
+ def default_deck(ranks = RANKS)
+ ranks.collect_concat { |rank|
+ SUITS.map { |suit| Card.new(rank, suit) }
+ }
+ end
+end
+
+class WarDeck < Deck
+ CARDS_FOR_HAND = 26
+
+ def deal
+ WarHand.new(super CARDS_FOR_HAND)
+ end
+end
+
+class BeloteDeck < Deck
+ RANKS = [7, 8, 9, :jack, :queen, :king, 10, :ace]
+ CARDS_FOR_HAND = 8
+
+ def initialize(deck = default_deck(RANKS))
+ super(deck)
+ end
+
+ def deal
+ BeloteHand.new(super CARDS_FOR_HAND)
+ end
+end
+
+class SixtySixDeck < Deck
+ RANKS = [9, :jack, :queen, :king, 10, :ace]
+ CARDS_FOR_HAND = 6
+
+ def initialize(deck = default_deck(RANKS))
+ super(deck)
+ end
+
+ def deal
+ SixtySixHand.new(super CARDS_FOR_HAND)
+ end
+end
+
+class Hand
+ SUITS = [:spades, :hearts, :diamonds, :clubs]
+ attr_reader :cards
+
+ def initialize(cards)
+ @cards = cards
+ end
+
+ def size
+ @cards.length
+ end
+end
+
+class WarHand < Hand
+ def play_card
+ @cards.shift!
+ end
+
+ def allow_face_up?
+ self.size <= 3
+ end
+end
+
+class BeloteHand < Hand
+ RANKS = [7, 8, 9, :jack, :queen, :king, 10, :ace]
+
+ def highest_of_suit(suit)
+ @cards.select { |card| card.suit == suit }.
+ sort { |a, b| RANKS.index(a.rank) <=> RANKS.index(b.rank) }.
+ last
+ end
+
+ def belote?
+ split_by_suit(@cards).
+ map { |suit| suit.include? :queen and suit.include? :king }.
+ any?
+ end
+
+ def tierce?
+ consecutive? 3
+ end
+
+ def quarte?
+ consecutive? 4
+ end
+
+ def quint?
+ consecutive? 5
+ end
+
+ def carre_of_jacks?
+ carre?(:jack)
+ end
+
+ def carre_of_nines?
+ carre?(9)
+ end
+
+ def carre_of_aces?
+ carre?(:ace)
+ end
+
+ private
+ def consecutive?(number_of_cons)
+ sorted_cards = sort(@cards)
+
+ ranks = split_by_suit(sorted_cards).
+ map { |group| group.map { |rank| RANKS.index(rank) } }
+
+ ranks.map do |suit|
+ suit.each_cons(number_of_cons).
+ map { |arr| consecutive_numbers?(arr) }.
+ any?
+ end.
+ any?
+ end
+
+ def consecutive_numbers?(arr)
+ arr.each_cons(2).all? { |a, b| a == b + 1 }
+ end
+
+ def split_by_suit(cards)
+ cards.group_by { |card| card.suit }.
+ map { |group| group.last }.
+ map { |group| group.map { |card| card.rank } }
+ end
+
+ def sort(cards)
+ cards.sort do |a, b|
+ sort = SUITS.index(b.suit) <=> SUITS.index(a.suit)
+ sort.zero? ? (RANKS.index(b.rank) <=> RANKS.index(a.rank)) : sort
+ end
+ end
+
+ def carre?(rank)
+ @cards.select { |card| card.rank == rank }.count == 4
+ end
+end
+
+class SixtySixHand < Hand
+ def twenty?(trump_suit)
+ @cards.select { |card| card.suit != trump_suit }.
+ group_by { |card| card.suit }.
+ map { |group| group.last }.
+ map { |suit| suit.map! { |card| card.rank } }.
+ map { |suit| suit.include? :queen and suit.include? :king }.
+ any?
+ end
+
+ def forty?(trump_suit)
+ trumps = @cards.select { |card| card.suit == trump_suit }.
+ map { |card| card.rank }
+ trumps.include? :queen and trumps.include? :king
+ end
+end

Станимира обнови решението на 09.11.2015 22:21 (преди над 8 години)

class Card
attr_reader :rank, :suit
def initialize(rank, suit)
@rank = rank
@suit = suit
end
def ==(other)
self.to_s == other.to_s
end
def to_s
"#{@rank.to_s.capitalize} of #{@suit.capitalize}"
end
end
class Deck
include Enumerable
RANKS = [2, 3, 4, 5, 6, 7, 8, 9, 10, :jack, :queen, :king, :ace]
SUITS = [:spades, :hearts, :diamonds, :clubs]
def initialize(deck = default_deck)
@deck = deck
end
def size
@deck.length
end
def draw_top_card
- @deck.shift!
+ @deck.shift
end
def draw_bottom_card
- @deck.pop!
+ @deck.pop
end
def top_card
@deck.first
end
def bottom_card
@deck.last
end
def shuffle
@deck.shuffle!
end
- def sort
+ def sort(ranks = RANKS)
@deck.sort! do |a, b|
- comp = SUITS.index(b.suit) <=> SUITS.index(a.suit)
- comp.zero? ? (RANKS.index(b.rank) <=> RANKS.index(a.rank)) : comp
+ comp = SUITS.index(a.suit) <=> SUITS.index(b.suit)
+ comp.zero? ? (ranks.index(b.rank) <=> ranks.index(a.rank)) : comp
end
end
def to_s
@deck.each { |card| card.to_s }
end
def deal(cards)
- cards < self.size ? @deck.take(cards) : @deck
+ hand = cards < self.size ? @deck.take(cards) : @deck
+ @deck -= hand
+ hand
end
private
def each
@deck.each { |card| yield card }
end
def default_deck(ranks = RANKS)
ranks.collect_concat { |rank|
SUITS.map { |suit| Card.new(rank, suit) }
}
end
end
class WarDeck < Deck
CARDS_FOR_HAND = 26
def deal
WarHand.new(super CARDS_FOR_HAND)
end
end
class BeloteDeck < Deck
RANKS = [7, 8, 9, :jack, :queen, :king, 10, :ace]
CARDS_FOR_HAND = 8
def initialize(deck = default_deck(RANKS))
super(deck)
end
def deal
BeloteHand.new(super CARDS_FOR_HAND)
end
+
+ def sort
+ super(RANKS)
+ end
end
class SixtySixDeck < Deck
RANKS = [9, :jack, :queen, :king, 10, :ace]
CARDS_FOR_HAND = 6
def initialize(deck = default_deck(RANKS))
super(deck)
end
def deal
SixtySixHand.new(super CARDS_FOR_HAND)
end
+
+ def sort
+ super(RANKS)
+ end
end
class Hand
SUITS = [:spades, :hearts, :diamonds, :clubs]
attr_reader :cards
def initialize(cards)
@cards = cards
end
def size
@cards.length
end
end
class WarHand < Hand
def play_card
- @cards.shift!
+ @cards.shift
end
def allow_face_up?
self.size <= 3
end
end
class BeloteHand < Hand
RANKS = [7, 8, 9, :jack, :queen, :king, 10, :ace]
def highest_of_suit(suit)
@cards.select { |card| card.suit == suit }.
sort { |a, b| RANKS.index(a.rank) <=> RANKS.index(b.rank) }.
last
end
def belote?
split_by_suit(@cards).
map { |suit| suit.include? :queen and suit.include? :king }.
any?
end
def tierce?
consecutive? 3
end
def quarte?
consecutive? 4
end
def quint?
consecutive? 5
end
def carre_of_jacks?
carre?(:jack)
end
def carre_of_nines?
carre?(9)
end
def carre_of_aces?
carre?(:ace)
end
private
def consecutive?(number_of_cons)
sorted_cards = sort(@cards)
ranks = split_by_suit(sorted_cards).
map { |group| group.map { |rank| RANKS.index(rank) } }
ranks.map do |suit|
suit.each_cons(number_of_cons).
map { |arr| consecutive_numbers?(arr) }.
any?
end.
any?
end
def consecutive_numbers?(arr)
arr.each_cons(2).all? { |a, b| a == b + 1 }
end
def split_by_suit(cards)
cards.group_by { |card| card.suit }.
map { |group| group.last }.
map { |group| group.map { |card| card.rank } }
end
def sort(cards)
- cards.sort do |a, b|
- sort = SUITS.index(b.suit) <=> SUITS.index(a.suit)
+ cards.sort! do |a, b|
+ sort = SUITS.index(a.suit) <=> SUITS.index(b.suit)
sort.zero? ? (RANKS.index(b.rank) <=> RANKS.index(a.rank)) : sort
end
end
def carre?(rank)
@cards.select { |card| card.rank == rank }.count == 4
end
end
class SixtySixHand < Hand
def twenty?(trump_suit)
@cards.select { |card| card.suit != trump_suit }.
group_by { |card| card.suit }.
map { |group| group.last }.
map { |suit| suit.map! { |card| card.rank } }.
map { |suit| suit.include? :queen and suit.include? :king }.
any?
end
def forty?(trump_suit)
trumps = @cards.select { |card| card.suit == trump_suit }.
map { |card| card.rank }
trumps.include? :queen and trumps.include? :king
end
end

На ред 111 няма нужда да подаваш аргументи на super изрично.

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

Не ползвай { ... } за многоредови блокове.

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