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

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

Към профила на Слави Боянов

Резултати

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

Код

class Card
attr_reader :rank, :suit
def initialize(rank, suit)
@rank = rank
@suit = suit
end
def ==(other)
@rank == other.rank && @suit == other.suit
end
def to_s
"#{@rank.to_s.capitalize} of #{@suit.to_s.capitalize}"
end
end
class Deck
include Enumerable
@@suits = [:spades, :hearts, :diamonds, :clubs]
def initialize(deck)
@deck = deck
end
def each
@deck.each { |item| yield item }
end
def size
@deck.size
end
def draw_top_card
@deck.delete_at(0)
end
def draw_bottom_card
@deck.delete_at(-1)
end
def top_card
@deck[0]
end
def bottom_card
@deck[-1]
end
def shuffle
@deck.shuffle!
end
def to_s
@deck.join("\n")
end
end
class WarDeck < Deck
@@ranks = [:ace, :king, :queen, :jack, 10, 9, 8, 7, 6, 5, 4, 3, 2]
def initialize(deck = base_deck)
super
end
def deal
WarHand.new(@deck.pop(26))
end
def sort
@deck.sort! { |first, second| base_deck.index(first) <=>
base_deck.index(second) }
end
private
def base_deck
@@suits.product(@@ranks).map { |item| Card.new(*item.reverse) }
end
end
class WarHand
def initialize(hand)
@hand = WarDeck.new(hand)
end
def size
@hand.size
end
def play_card
@hand.draw_top_card
end
def allow_face_up?
@hand.size <= 3
end
end
class BeloteDeck < Deck
@@ranks = [:ace, 10, :king, :queen, :jack, 9, 8, 7]
def initialize(deck = base_deck)
super
end
def deal
BeloteHand.new(@deck.pop(8))
end
def sort
@deck.sort! { |first, second| base_deck.index(first) <=>
base_deck.index(second) }
end
private
def base_deck
@@suits.product(@@ranks).map { |item| Card.new(*item.reverse) }
end
end
class BeloteHand
@@suits = [:spades, :hearts, :diamonds, :clubs]
@@ranks = [:ace, :king, :queen, :jack, 10, 9, 8, 7]
def initialize(hand)
@hand = BeloteDeck.new(hand)
end
def size
@hand.size
end
def base_sequence
@@suits.product(@@ranks).map { |item| Card.new(*item.reverse) }
end
def suit_sequence(suit)
[suit].product(@@ranks).map { |item| Card.new(*item.reverse) }
end
def highest_of_suit(suit)
@hand.sort.select { |item| item.suit == suit }[0]
end
def belote?
@@suits.reduce(false) do |result, suit|
result or
@hand.select { |card| card.rank == :king or card.rank == :queen }.
select { |card| card.suit == suit }.size == 2
end
end
def tierce?
end
def quarte?
end
def quint?
end
def carre_of_jacks?
@hand.select { |item| item.rank == :jack }.szie == 4
end
def carre_of_nines?
@hand.select { |item| item.rank == 9 }.szie == 4
end
def carre_of_aces?
@hand.select { |item| item.rank == :ace }.size == 4
end
def to_s
@hand.to_s
end
end
class SixtySixDeck < Deck
@@ranks = [:ace, 10, :king, :queen, :jack, 9]
def initialize(deck = base_deck)
super
end
def deal
SixtySixHand.new(@deck.pop(6))
end
def sort
@deck.sort! { |first, second| base_deck.index(first) <=>
base_deck.index(second) }
end
private
def base_deck
@@suits.product(@@ranks).map { |item| Card.new(*item.reverse) }
end
end
class SixtySixHand
def initialize(hand)
@hand = SixtySixDeck.new(hand)
end
def twenty?(trump_suit)
@hand.sort.select { |card| card.suit != trump_suit }.
each_cons(2) { |cards| return true if cards[0].rank == :king and
cards[1].rank == :queen }
return false
end
def forty?(trump_suit)
@hand.sort.select { |card| card.suit == trump_suit }.
select { |card| card.rank == :king or card.rank == :queen }.size == 2
end
def size
@hand.size
end
end

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

..............................FFFFFFFFFFF................

Failures:

  1) BeloteDeck hand #tierce? with tierce returns true for cards with names
     Failure/Error: expect(hand.tierce?).to be true
       
       expected #<TrueClass:20> => true
            got #<NilClass:8> => nil
       
       Compared using equal?, which compares object identity,
       but expected and actual are not the same object. Use
       `expect(actual).to eq(expected)` if you don't care about
       object identity in this example.
     # /tmp/d20151112-27349-kch7lc/spec.rb:284:in `block (5 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 hand #tierce? with tierce returns true for cards with numbers
     Failure/Error: expect(hand.tierce?).to be true
       
       expected #<TrueClass:20> => true
            got #<NilClass:8> => nil
       
       Compared using equal?, which compares object identity,
       but expected and actual are not the same object. Use
       `expect(actual).to eq(expected)` if you don't care about
       object identity in this example.
     # /tmp/d20151112-27349-kch7lc/spec.rb:299:in `block (5 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 #tierce? without tierce does not confuse cards with different suits
     Failure/Error: expect(hand.tierce?).to be false
       
       expected #<FalseClass:0> => false
            got #<NilClass:8> => nil
       
       Compared using equal?, which compares object identity,
       but expected and actual are not the same object. Use
       `expect(actual).to eq(expected)` if you don't care about
       object identity in this example.
     # /tmp/d20151112-27349-kch7lc/spec.rb:316:in `block (5 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 hand #quarte? detects four cards with increasing ranks
     Failure/Error: expect(hand.quarte?).to be true
       
       expected #<TrueClass:20> => true
            got #<NilClass:8> => nil
       
       Compared using equal?, which compares object identity,
       but expected and actual are not the same object. Use
       `expect(actual).to eq(expected)` if you don't care about
       object identity in this example.
     # /tmp/d20151112-27349-kch7lc/spec.rb:334: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)>'

  5) BeloteDeck hand #quarte? does not return true if there is no quarte
     Failure/Error: expect(hand.quarte?).to be false
       
       expected #<FalseClass:0> => false
            got #<NilClass:8> => nil
       
       Compared using equal?, which compares object identity,
       but expected and actual are not the same object. Use
       `expect(actual).to eq(expected)` if you don't care about
       object identity in this example.
     # /tmp/d20151112-27349-kch7lc/spec.rb:349: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)>'

  6) BeloteDeck hand #quint? detects five cards with increasing ranks
     Failure/Error: expect(hand.quint?).to be true
       
       expected #<TrueClass:20> => true
            got #<NilClass:8> => nil
       
       Compared using equal?, which compares object identity,
       but expected and actual are not the same object. Use
       `expect(actual).to eq(expected)` if you don't care about
       object identity in this example.
     # /tmp/d20151112-27349-kch7lc/spec.rb:366: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)>'

  7) BeloteDeck hand #quint? does not return true if there is no quint
     Failure/Error: expect(hand.quint?).to be false
       
       expected #<FalseClass:0> => false
            got #<NilClass:8> => nil
       
       Compared using equal?, which compares object identity,
       but expected and actual are not the same object. Use
       `expect(actual).to eq(expected)` if you don't care about
       object identity in this example.
     # /tmp/d20151112-27349-kch7lc/spec.rb:381: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)>'

  8) BeloteDeck hand #carre_of_jacks? behaves like carre-checking method returns true when there is a carre
     Failure/Error: expect(hand.public_send(method)).to be true
     NoMethodError:
       undefined method `szie' for #<Array:0x007f67f57f2ee8>
     Shared Example Group: "carre-checking method" called from /tmp/d20151112-27349-kch7lc/spec.rb:386
     # /tmp/d20151112-27349-kch7lc/solution.rb:165:in `carre_of_jacks?'
     # /tmp/d20151112-27349-kch7lc/spec.rb:86:in `public_send'
     # /tmp/d20151112-27349-kch7lc/spec.rb:86: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)>'

  9) BeloteDeck hand #carre_of_jacks? behaves like carre-checking method returns false when there is no carre
     Failure/Error: expect(hand.public_send(method)).to be false
     NoMethodError:
       undefined method `szie' for #<Array:0x007f67f57e37e0>
     Shared Example Group: "carre-checking method" called from /tmp/d20151112-27349-kch7lc/spec.rb:386
     # /tmp/d20151112-27349-kch7lc/solution.rb:165:in `carre_of_jacks?'
     # /tmp/d20151112-27349-kch7lc/spec.rb:101:in `public_send'
     # /tmp/d20151112-27349-kch7lc/spec.rb:101: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)>'

  10) BeloteDeck hand #carre_of_nines? behaves like carre-checking method returns true when there is a carre
     Failure/Error: expect(hand.public_send(method)).to be true
     NoMethodError:
       undefined method `szie' for #<Array:0x007f67f57da208>
     Shared Example Group: "carre-checking method" called from /tmp/d20151112-27349-kch7lc/spec.rb:390
     # /tmp/d20151112-27349-kch7lc/solution.rb:169:in `carre_of_nines?'
     # /tmp/d20151112-27349-kch7lc/spec.rb:86:in `public_send'
     # /tmp/d20151112-27349-kch7lc/spec.rb:86: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)>'

  11) BeloteDeck hand #carre_of_nines? behaves like carre-checking method returns false when there is no carre
     Failure/Error: expect(hand.public_send(method)).to be false
     NoMethodError:
       undefined method `szie' for #<Array:0x007f67f5811140>
     Shared Example Group: "carre-checking method" called from /tmp/d20151112-27349-kch7lc/spec.rb:390
     # /tmp/d20151112-27349-kch7lc/solution.rb:169:in `carre_of_nines?'
     # /tmp/d20151112-27349-kch7lc/spec.rb:101:in `public_send'
     # /tmp/d20151112-27349-kch7lc/spec.rb:101: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)>'

Finished in 0.1021 seconds
57 examples, 11 failures

Failed examples:

rspec /tmp/d20151112-27349-kch7lc/spec.rb:272 # BeloteDeck hand #tierce? with tierce returns true for cards with names
rspec /tmp/d20151112-27349-kch7lc/spec.rb:287 # BeloteDeck hand #tierce? with tierce returns true for cards with numbers
rspec /tmp/d20151112-27349-kch7lc/spec.rb:304 # BeloteDeck hand #tierce? without tierce does not confuse cards with different suits
rspec /tmp/d20151112-27349-kch7lc/spec.rb:322 # BeloteDeck hand #quarte? detects four cards with increasing ranks
rspec /tmp/d20151112-27349-kch7lc/spec.rb:337 # BeloteDeck hand #quarte? does not return true if there is no quarte
rspec /tmp/d20151112-27349-kch7lc/spec.rb:354 # BeloteDeck hand #quint? detects five cards with increasing ranks
rspec /tmp/d20151112-27349-kch7lc/spec.rb:369 # BeloteDeck hand #quint? does not return true if there is no quint
rspec /tmp/d20151112-27349-kch7lc/spec.rb:74 # BeloteDeck hand #carre_of_jacks? behaves like carre-checking method returns true when there is a carre
rspec /tmp/d20151112-27349-kch7lc/spec.rb:89 # BeloteDeck hand #carre_of_jacks? behaves like carre-checking method returns false when there is no carre
rspec /tmp/d20151112-27349-kch7lc/spec.rb:74 # BeloteDeck hand #carre_of_nines? behaves like carre-checking method returns true when there is a carre
rspec /tmp/d20151112-27349-kch7lc/spec.rb:89 # BeloteDeck hand #carre_of_nines? behaves like carre-checking method returns false when there is no carre

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

Слави обнови решението на 11.11.2015 17:03 (преди около 9 години)

+class Card
+
+ attr_reader :rank, :suit
+
+ def initialize(rank, suit)
+ @rank = rank
+ @suit = suit
+ end
+
+ def ==(other)
+ @rank == other.rank && @suit == other.suit
+ end
+
+ def to_s
+ "#{@rank.to_s.capitalize} of #{@suit.to_s.capitalize}"
+ end
+
+end
+
+class Deck
+
+ include Enumerable
+
+ @@suits = [:spades, :hearts, :diamonds, :clubs]
+
+ def initialize(deck)
+ @deck = deck
+ end
+
+ def each
+ @deck.each { |item| yield item }
+ end
+
+ def size
+ @deck.size
+ end
+
+ def draw_top_card
+ @deck.delete_at(0)
+ end
+
+ def draw_bottom_card
+ @deck.delete_at(-1)
+ end
+
+ def top_card
+ @deck[0]
+ end
+
+ def bottom_card
+ @deck[-1]
+ end
+
+ def shuffle
+ @deck.shuffle!
+ end
+
+ def to_s
+ @deck.join("\n")
+ end
+
+end
+
+class WarDeck < Deck
+
+ @@ranks = [:ace, :king, :queen, :jack, 10, 9, 8, 7, 6, 5, 4, 3, 2]
+
+ def initialize(deck = base_deck)
+ super
+ end
+
+ def deal
+ WarHand.new(@deck.pop(26))
+ end
+
+ def sort
+ @deck.sort! { |first, second| base_deck.index(first) <=>
+ base_deck.index(second) }
+ end
+
+ private
+
+ def base_deck
+ @@suits.product(@@ranks).map { |item| Card.new(*item.reverse) }
+ end
+end
+
+class WarHand
+
+ def initialize(hand)
+ @hand = WarDeck.new(hand)
+ end
+
+ def size
+ @hand.size
+ end
+
+ def play_card
+ @hand.draw_top_card
+ end
+
+ def allow_face_up?
+ @hand.size <= 3
+ end
+
+end
+
+class BeloteDeck < Deck
+
+ @@ranks = [:ace, 10, :king, :queen, :jack, 9, 8, 7]
+
+ def initialize(deck = base_deck)
+ super
+ end
+
+ def deal
+ BeloteHand.new(@deck.pop(8))
+ end
+
+ def sort
+ @deck.sort! { |first, second| base_deck.index(first) <=>
+ base_deck.index(second) }
+ end
+
+ private
+
+ def base_deck
+ @@suits.product(@@ranks).map { |item| Card.new(*item.reverse) }
+ end
+
+end
+
+class BeloteHand
+
+ @@suits = [:spades, :hearts, :diamonds, :clubs]
+ @@ranks = [:ace, :king, :queen, :jack, 10, 9, 8, 7]
+
+ def initialize(hand)
+ @hand = BeloteDeck.new(hand)
+ end
+ def size
+ @hand.size
+ end
+
+ def base_sequence
+ @@suits.product(@@ranks).map { |item| Card.new(*item.reverse) }
+ end
+
+ def suit_sequence(suit)
+ [suit].product(@@ranks).map { |item| Card.new(*item.reverse) }
+ end
+
+ def highest_of_suit(suit)
+ @hand.sort.select { |item| item.suit == suit }[0]
+ end
+
+ def belote?
+ @@suits.reduce(false) do |result, suit|
+ result or
+ @hand.select { |card| card.rank == :king or card.rank == :queen }.
+ select { |card| card.suit == suit }.size == 2
+ end
+ end
+
+ def tierce?
+ end
+
+ def quarte?
+ end
+
+ def quint?
+ end
+
+ def carre_of_jacks?
+ @hand.select { |item| item.rank == :jack }.szie == 4
+ end
+
+ def carre_of_nines?
+ @hand.select { |item| item.rank == 9 }.szie == 4
+ end
+
+ def carre_of_aces?
+ @hand.select { |item| item.rank == :ace }.size == 4
+ end
+
+ def to_s
+ @hand.to_s
+ end
+
+ private
+
+end
+
+class SixtySixDeck < Deck
+
+ @@ranks = [:ace, 10, :king, :queen, :jack, 9]
+
+ def initialize(deck = base_deck)
+ super
+ end
+
+ def deal
+ SixtySixHand.new(@deck.pop(6))
+ end
+
+ def sort
+ @deck.sort! { |first, second| base_deck.index(first) <=>
+ base_deck.index(second) }
+ end
+
+ private
+
+ def base_deck
+ @@suits.product(@@ranks).map { |item| Card.new(*item.reverse) }
+ end
+
+end
+
+class SixtySixHand
+
+ def initialize(hand)
+ @hand = SixtySixDeck.new(hand)
+ end
+
+ def twenty?(trump_suit)
+ @hand.sort.select { |card| card.suit != trump_suit }.
+ each_cons(2) { |cards| return true if cards[0].rank == :king and
+ cards[1].rank == :queen }
+ return false
+ end
+
+ def forty?(trump_suit)
+ @hand.sort.select { |card| card.suit == trump_suit }.
+ select { |card| card.rank == :king or card.rank == :queen }.size == 2
+ end
+
+ def size
+ @hand.size
+ end
+
+end
+
+b = BeloteDeck.new
+b.shuffle
+
+h = b.deal
+puts h.belote?
+puts h.tierce?
+puts h.quarte?
+puts h.quint?
+puts h

Слави обнови решението на 11.11.2015 17:05 (преди около 9 години)

class Card
-
attr_reader :rank, :suit
def initialize(rank, suit)
@rank = rank
@suit = suit
end
def ==(other)
@rank == other.rank && @suit == other.suit
end
def to_s
"#{@rank.to_s.capitalize} of #{@suit.to_s.capitalize}"
end
-
end
class Deck
-
include Enumerable
@@suits = [:spades, :hearts, :diamonds, :clubs]
def initialize(deck)
@deck = deck
end
def each
@deck.each { |item| yield item }
end
def size
@deck.size
end
def draw_top_card
@deck.delete_at(0)
end
def draw_bottom_card
@deck.delete_at(-1)
end
def top_card
@deck[0]
end
def bottom_card
@deck[-1]
end
def shuffle
@deck.shuffle!
end
def to_s
@deck.join("\n")
end
-
end
class WarDeck < Deck
-
@@ranks = [:ace, :king, :queen, :jack, 10, 9, 8, 7, 6, 5, 4, 3, 2]
def initialize(deck = base_deck)
super
end
def deal
WarHand.new(@deck.pop(26))
end
def sort
@deck.sort! { |first, second| base_deck.index(first) <=>
base_deck.index(second) }
end
private
def base_deck
@@suits.product(@@ranks).map { |item| Card.new(*item.reverse) }
end
end
class WarHand
-
def initialize(hand)
@hand = WarDeck.new(hand)
end
def size
@hand.size
end
def play_card
@hand.draw_top_card
end
def allow_face_up?
@hand.size <= 3
end
-
end
class BeloteDeck < Deck
-
@@ranks = [:ace, 10, :king, :queen, :jack, 9, 8, 7]
def initialize(deck = base_deck)
super
end
def deal
BeloteHand.new(@deck.pop(8))
end
def sort
@deck.sort! { |first, second| base_deck.index(first) <=>
base_deck.index(second) }
end
private
def base_deck
@@suits.product(@@ranks).map { |item| Card.new(*item.reverse) }
end
-
end
class BeloteHand
-
@@suits = [:spades, :hearts, :diamonds, :clubs]
@@ranks = [:ace, :king, :queen, :jack, 10, 9, 8, 7]
def initialize(hand)
@hand = BeloteDeck.new(hand)
end
def size
@hand.size
end
def base_sequence
@@suits.product(@@ranks).map { |item| Card.new(*item.reverse) }
end
def suit_sequence(suit)
[suit].product(@@ranks).map { |item| Card.new(*item.reverse) }
end
def highest_of_suit(suit)
@hand.sort.select { |item| item.suit == suit }[0]
end
def belote?
@@suits.reduce(false) do |result, suit|
result or
@hand.select { |card| card.rank == :king or card.rank == :queen }.
select { |card| card.suit == suit }.size == 2
end
end
def tierce?
end
def quarte?
end
def quint?
end
def carre_of_jacks?
@hand.select { |item| item.rank == :jack }.szie == 4
end
def carre_of_nines?
@hand.select { |item| item.rank == 9 }.szie == 4
end
def carre_of_aces?
@hand.select { |item| item.rank == :ace }.size == 4
end
def to_s
@hand.to_s
end
-
- private
-
end
class SixtySixDeck < Deck
-
@@ranks = [:ace, 10, :king, :queen, :jack, 9]
def initialize(deck = base_deck)
super
end
def deal
SixtySixHand.new(@deck.pop(6))
end
def sort
@deck.sort! { |first, second| base_deck.index(first) <=>
base_deck.index(second) }
end
private
def base_deck
@@suits.product(@@ranks).map { |item| Card.new(*item.reverse) }
end
-
end
class SixtySixHand
-
def initialize(hand)
@hand = SixtySixDeck.new(hand)
end
def twenty?(trump_suit)
@hand.sort.select { |card| card.suit != trump_suit }.
each_cons(2) { |cards| return true if cards[0].rank == :king and
cards[1].rank == :queen }
return false
end
def forty?(trump_suit)
@hand.sort.select { |card| card.suit == trump_suit }.
select { |card| card.rank == :king or card.rank == :queen }.size == 2
end
def size
@hand.size
end
-
-end
+end
-
-b = BeloteDeck.new
-b.shuffle
-
-h = b.deal
-puts h.belote?
-puts h.tierce?
-puts h.quarte?
-puts h.quint?
-puts h