Решение на От ливадите до Лас Вегас (и назад) от Петър Петров

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

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

Резултати

  • 9 точки от тестове
  • 0 бонус точки
  • 9 точки общо
  • 13 успешни тест(а)
  • 2 неуспешни тест(а)

Код

import random
SUITS = ['clubs', 'diamonds', 'hearts', 'spades']
FACES = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
class Card:
def __init__(self, suit, face):
# Those are "private" because the class will never be inhered
self._suit = suit
self._face = face
def get_suit(self):
return self._suit
def get_face(self):
return self._face
class Deck:
# Those are "private" because the class will never be inhered
def __init__(self, face_filter=None):
self._deck = []
if face_filter:
self._face_filter = face_filter
else:
self._face_filter = FACES
for _card_face in self._face_filter:
for _card_suit in SUITS:
self._deck.append(Card(_card_suit, _card_face))
def cut(self):
cards_cutting_number = random.randint(1, len(self._deck) - 1)
self._deck = self._deck[cards_cutting_number:] + self._deck[:cards_cutting_number]
def shuffle(self):
random.shuffle(self._deck)
def get_cards(self):
return self._deck
class Player:
# Those are "private" because the class will never be inhered
def __init__(self):
self._deck = Deck()
self._deck.get_cards().clear()
def get_cards(self):
return self._deck.get_cards()
class Game:
# Those are "protected" because the class will be inhered
def __init__(self, number_of_players, dealing_direction, dealing_instructions):
self._deck = Deck()
# Create empty list from Players
self._players = []
self._number_of_players = number_of_players
self._dealing_direction = dealing_direction
self._dealing_instructions = dealing_instructions
# Add players in the list
for _player in range(self._number_of_players):
self._players.append(Player())
def get_players(self):
return self._players
def prepare_deck(self):
for player in self._players:
for player_card in player.get_cards():
self._deck.get_cards().append(player_card)
player.get_cards().clear()
self._deck.shuffle()
self._deck.cut()
def deal(self, player):
index_of_player = self._players.index(player)
if self._dealing_direction == 'ltr':
ltr_players = self._players[index_of_player:] + self._players[:index_of_player]
for number_of_cards_to_deal in self._dealing_instructions:
for player_to_deal in ltr_players:
for i in range(number_of_cards_to_deal):
player_to_deal.get_cards().append(self._deck.get_cards()[0])
self._deck.get_cards().pop(0)
else:
rtl_players = [player for player in reversed(self._players[:index_of_player])] + \
[player for player in reversed(self._players[index_of_player:])]
for number_of_cards_to_deal in self._dealing_instructions:
for player_to_deal in rtl_players:
for i in range(number_of_cards_to_deal):
player_to_deal.get_cards().append(self._deck.get_cards()[0])
self._deck.get_cards().pop(0)
def get_deck(self):
return self._deck
class Belot(Game):
def __init__(self):
self._number_of_players = 4
self._dealing_direction = 'ltr'
self._dealing_instructions = (2, 3, 3)
super().__init__(self._number_of_players, self._dealing_direction, self._dealing_instructions)
self._deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
class Poker(Game):
def __init__(self):
self._number_of_players = 9
self._dealing_direction = 'rtl'
self._dealing_instructions = (1, 1, 1, 1, 1)
super().__init__(self._number_of_players, self._dealing_direction, self._dealing_instructions)

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

..........F...F
======================================================================
FAIL: test_dealing_rtl (test.TestGame)
Test dealing the cards right to left.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
    raise result
AssertionError: {('spades', '4'), ('spades', '3'), ('hearts', '3')} not found in ({('diamonds', '2'), ('clubs', '4'), ('clubs', '2')}, {('hearts', 'A'), ('spades', 'Q'), ('spades', 'A')})

======================================================================
FAIL: test_correct_direction_and_players_deal (test.TestPoker)
Test dealing with correct direction and players.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
    raise result
AssertionError: {('clubs', 'K'), ('clubs', '4'), ('diamonds', '6'), ('spades', '10'), ('hearts', '8')} not found in ({('diamonds', '4'), ('spades', '8'), ('clubs', '2'), ('hearts', '6'), ('clubs', 'J')}, {('clubs', '8'), ('spades', '5'), ('spades', 'A'), ('hearts', 'Q'), ('diamonds', '10')})

----------------------------------------------------------------------
Ran 15 tests in 0.166s

FAILED (failures=2)

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

Петър обнови решението на 15.11.2022 15:55 (преди над 1 година)

+import random
+
+SUITS = ['clubs', 'diamonds', 'hearts', 'spades']
+FACES = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
+
+
+class Card:
+ def __init__(self, suit, face):
+ # Those are "private" because the class will never be inhered
+ self.__suit = suit
+ self.__face = face
+
+ def get_suit(self):
+ return self.__suit
+
+ def get_face(self):
+ return self.__face
+
+
+class Deck:
+ # Those are "private" because the class will never be inhered
+ def __init__(self, face_filter=None):
+ self.__deck = []
+ self.__face_filter = face_filter
+ if self.__face_filter:

Ако предварително подготвиш променлива, в която да седят всички лица, които ти трябват, ще си спестиш почти идентичните блокове код по-долу.

+ # If there is a face_filter, the deck will contain only cards in th filter
+ for card_face in self.__face_filter:
+ self.__deck.append(Card(SUITS[0], card_face))
+ self.__deck.append(Card(SUITS[1], card_face))
+ self.__deck.append(Card(SUITS[2], card_face))
+ self.__deck.append(Card(SUITS[3], card_face))
+ else:
+ # If there is no face_filter, the deck will contain all cards
+ for card_face in FACES:
+ self.__deck.append(Card(SUITS[0], card_face))
+ self.__deck.append(Card(SUITS[1], card_face))
+ self.__deck.append(Card(SUITS[2], card_face))
+ self.__deck.append(Card(SUITS[3], card_face))
+
+ def cut(self):
+ cards_cutting_number = random.randint(1, len(self.__deck) - 1)
+ cut_deck = []
+ # Append all card from random index to the end
+ for cut_card in self.__deck[cards_cutting_number:]:
+ cut_deck.append(cut_card)
+ # Append all card from the beginning to the random index from above
+ for cut_card in self.__deck[:cards_cutting_number]:
+ cut_deck.append(cut_card)
+ self.__deck = cut_deck
+ return self.__deck
+
+ def shuffle(self):
+ random.shuffle(self.__deck)
+ return self.__deck
+
+ def get_cards(self):
+ return self.__deck
+
+
+class Player:
+ # Those are "private" because the class will never be inhered
+ def __init__(self):
+ self.__deck = Deck()
+ self.__deck.get_cards().clear()
+
+ def get_cards(self):
+ return self.__deck.get_cards()
+
+
+class Game:
+ # Those are "protected" because the class will be inhered
+ def __init__(self, number_of_players, dealing_direction, dealing_instructions):
+ self._deck = Deck()
+ # Create empty list from Players
+ self._players = []
+ self._number_of_players = number_of_players
+ self._dealing_direction = dealing_direction
+ self._dealing_instructions = dealing_instructions
+ # Add players in the list
+ for player in range(self._number_of_players):
+ self._players.append(Player())
+
+ def get_players(self):
+ ltr_random_players = []

self._players е частен случай на същото, така че просто можеш да върнеш него. Причината да дефинираме условието със прозиволен играч е, че не знаем как ще пазите играчите в данните, но като цяло просто искаме списъка с играчи.

+ random_number_for_player = random.randint(0, len(self._players) - 1)
+ for player in self._players[random_number_for_player:]:
+ ltr_random_players.append(player)
+ for player in self._players[:random_number_for_player]:
+ ltr_random_players.append(player)
+ return ltr_random_players
+
+ def prepare_deck(self):
+ for player in self._players:
+ for player_card in player.get_cards():
+ self._deck.get_cards().append(player_card)
+ player.get_cards().clear()
+ self._deck.shuffle()
+ self._deck.cut()
+
+ def deal(self, player):
+ # Get the index of a player, who will be first
+ index_of_player = self._players.index(player)
+ # Check if the direction is left to right
+ if self._dealing_direction == 'ltr':
+ # Iterate over all elements in dealing_instruction
+ for number_of_cards_to_deal in self._dealing_instructions:
+ # Iterate over the players, so every player will receive number of card from the instructions
+ # The iteration starts from index_of_player to the end
+ for player_to_deal in self._players[index_of_player:]:
+ for i in range(number_of_cards_to_deal):
+ # Player gets(append) the first card from the deck
+ player_to_deal.get_cards().append(self._deck.get_cards()[0])
+ # Remove the first card from the deck
+ self._deck.get_cards().pop(0)
+ # The iteration starts form the beginning to the index_of_player
+ for player_to_deal in self._players[:index_of_player]:
+ for i in range(number_of_cards_to_deal):
+ player_to_deal.get_cards().append(self._deck.get_cards()[0])
+ self._deck.get_cards().pop(0)
+ else:
+ for number_of_cards_to_deal in self._dealing_instructions:
+ # To get the direction (right to left), iterate from the beginning to the index_of_player, but reversed
+ for player_to_deal in reversed(self._players[:index_of_player]):
+ for i in range(number_of_cards_to_deal):
+ player_to_deal.get_cards().append(self._deck.get_cards()[0])
+ self._deck.get_cards().pop(0)
+ # To get the direction (right to left), iterate from the index_of_player to the end, but reversed
+ for player_to_deal in reversed(self._players[index_of_player:]):
+ for i in range(number_of_cards_to_deal):
+ player_to_deal.get_cards().append(self._deck.get_cards()[0])
+ self._deck.get_cards().pop(0)
+
+ def get_deck(self):
+ return self._deck
+
+
+class Belot(Game):
+ def __init__(self):
+ self.__number_of_players = 4
+ self.__dealing_direction = 'ltr'
+ self.__dealing_instructions = (2, 3, 3)
+ super().__init__(self.__number_of_players, self.__dealing_direction, self.__dealing_instructions)
+ self._deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
+
+
+class Poker(Game):
+ def __init__(self):
+ self.__number_of_players = 9
+ self.__dealing_direction = 'rtl'
+ self.__dealing_instructions = (1, 1, 1, 1, 1)
+ super().__init__(self.__number_of_players, self.__dealing_direction, self.__dealing_instructions)

Петър обнови решението на 15.11.2022 17:18 (преди над 1 година)

import random
SUITS = ['clubs', 'diamonds', 'hearts', 'spades']
FACES = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
class Card:
def __init__(self, suit, face):
# Those are "private" because the class will never be inhered
- self.__suit = suit
- self.__face = face
+ self._suit = suit
+ self._face = face
def get_suit(self):
- return self.__suit
+ return self._suit
def get_face(self):
- return self.__face
+ return self._face
class Deck:
# Those are "private" because the class will never be inhered
def __init__(self, face_filter=None):
- self.__deck = []
- self.__face_filter = face_filter
- if self.__face_filter:
- # If there is a face_filter, the deck will contain only cards in th filter
- for card_face in self.__face_filter:
- self.__deck.append(Card(SUITS[0], card_face))
- self.__deck.append(Card(SUITS[1], card_face))
- self.__deck.append(Card(SUITS[2], card_face))
- self.__deck.append(Card(SUITS[3], card_face))
+ self._deck = []
+ if face_filter:
+ self._face_filter = face_filter
else:
- # If there is no face_filter, the deck will contain all cards
- for card_face in FACES:
- self.__deck.append(Card(SUITS[0], card_face))
- self.__deck.append(Card(SUITS[1], card_face))
- self.__deck.append(Card(SUITS[2], card_face))
- self.__deck.append(Card(SUITS[3], card_face))
+ self._face_filter = FACES
+ for _card_face in self._face_filter:
+ for _card_suit in SUITS:
+ self._deck.append(Card(_card_suit, _card_face))
def cut(self):
- cards_cutting_number = random.randint(1, len(self.__deck) - 1)
- cut_deck = []
- # Append all card from random index to the end
- for cut_card in self.__deck[cards_cutting_number:]:
- cut_deck.append(cut_card)
- # Append all card from the beginning to the random index from above
- for cut_card in self.__deck[:cards_cutting_number]:
- cut_deck.append(cut_card)
- self.__deck = cut_deck
- return self.__deck
+ cards_cutting_number = random.randint(1, len(self._deck) - 1)
+ self._deck = self._deck[cards_cutting_number:] + self._deck[:cards_cutting_number]
def shuffle(self):
- random.shuffle(self.__deck)
- return self.__deck
+ random.shuffle(self._deck)
def get_cards(self):
- return self.__deck
+ return self._deck
class Player:
# Those are "private" because the class will never be inhered
def __init__(self):
- self.__deck = Deck()
- self.__deck.get_cards().clear()
+ self._deck = Deck()
+ self._deck.get_cards().clear()
def get_cards(self):
- return self.__deck.get_cards()
+ return self._deck.get_cards()
class Game:
# Those are "protected" because the class will be inhered
def __init__(self, number_of_players, dealing_direction, dealing_instructions):
self._deck = Deck()
# Create empty list from Players
self._players = []
self._number_of_players = number_of_players
self._dealing_direction = dealing_direction
self._dealing_instructions = dealing_instructions
# Add players in the list
- for player in range(self._number_of_players):
+ for _player in range(self._number_of_players):
self._players.append(Player())
def get_players(self):
- ltr_random_players = []
- random_number_for_player = random.randint(0, len(self._players) - 1)
- for player in self._players[random_number_for_player:]:
- ltr_random_players.append(player)
- for player in self._players[:random_number_for_player]:
- ltr_random_players.append(player)
- return ltr_random_players
+ return self._players
def prepare_deck(self):
- for player in self._players:
- for player_card in player.get_cards():
+ for _player in self._players:
+ for player_card in _player.get_cards():
self._deck.get_cards().append(player_card)
- player.get_cards().clear()
+ _player.get_cards().clear()
self._deck.shuffle()
self._deck.cut()
def deal(self, player):
- # Get the index of a player, who will be first
- index_of_player = self._players.index(player)
- # Check if the direction is left to right
+ _index_of_player = self._players.index(player)
if self._dealing_direction == 'ltr':
- # Iterate over all elements in dealing_instruction
- for number_of_cards_to_deal in self._dealing_instructions:
- # Iterate over the players, so every player will receive number of card from the instructions
- # The iteration starts from index_of_player to the end
- for player_to_deal in self._players[index_of_player:]:
- for i in range(number_of_cards_to_deal):
- # Player gets(append) the first card from the deck
- player_to_deal.get_cards().append(self._deck.get_cards()[0])
- # Remove the first card from the deck
+ _ltr_players = self._players[_index_of_player:] + self._players[:_index_of_player]
+ for _number_of_cards_to_deal in self._dealing_instructions:
+ for _player_to_deal in _ltr_players:
+ for _i in range(_number_of_cards_to_deal):
+ _player_to_deal.get_cards().append(self._deck.get_cards()[0])
self._deck.get_cards().pop(0)
- # The iteration starts form the beginning to the index_of_player
- for player_to_deal in self._players[:index_of_player]:
- for i in range(number_of_cards_to_deal):
- player_to_deal.get_cards().append(self._deck.get_cards()[0])
- self._deck.get_cards().pop(0)
else:
- for number_of_cards_to_deal in self._dealing_instructions:
- # To get the direction (right to left), iterate from the beginning to the index_of_player, but reversed
- for player_to_deal in reversed(self._players[:index_of_player]):
- for i in range(number_of_cards_to_deal):
- player_to_deal.get_cards().append(self._deck.get_cards()[0])
+ _rtl_players = [_player for _player in reversed(self._players[:_index_of_player])] + \
+ [_player for _player in reversed(self._players[_index_of_player:])]
+ for _number_of_cards_to_deal in self._dealing_instructions:
+ for _player_to_deal in _rtl_players:
+ for _i in range(_number_of_cards_to_deal):
+ _player_to_deal.get_cards().append(self._deck.get_cards()[0])
self._deck.get_cards().pop(0)
- # To get the direction (right to left), iterate from the index_of_player to the end, but reversed
- for player_to_deal in reversed(self._players[index_of_player:]):
- for i in range(number_of_cards_to_deal):
- player_to_deal.get_cards().append(self._deck.get_cards()[0])
- self._deck.get_cards().pop(0)
def get_deck(self):
return self._deck
class Belot(Game):
def __init__(self):
- self.__number_of_players = 4
- self.__dealing_direction = 'ltr'
- self.__dealing_instructions = (2, 3, 3)
- super().__init__(self.__number_of_players, self.__dealing_direction, self.__dealing_instructions)
+ self._number_of_players = 4
+ self._dealing_direction = 'ltr'
+ self._dealing_instructions = (2, 3, 3)
+ super().__init__(self._number_of_players, self._dealing_direction, self._dealing_instructions)
self._deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
class Poker(Game):
def __init__(self):
- self.__number_of_players = 9
- self.__dealing_direction = 'rtl'
+ self._number_of_players = 9
- self.__dealing_instructions = (1, 1, 1, 1, 1)
+ self._dealing_direction = 'rtl'
- super().__init__(self.__number_of_players, self.__dealing_direction, self.__dealing_instructions)
+ self._dealing_instructions = (1, 1, 1, 1, 1)
+ super().__init__(self._number_of_players, self._dealing_direction, self._dealing_instructions)

Петър обнови решението на 15.11.2022 17:27 (преди над 1 година)

import random
SUITS = ['clubs', 'diamonds', 'hearts', 'spades']
FACES = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
class Card:
def __init__(self, suit, face):
# Those are "private" because the class will never be inhered
self._suit = suit
self._face = face
def get_suit(self):
return self._suit
def get_face(self):
return self._face
class Deck:
# Those are "private" because the class will never be inhered
def __init__(self, face_filter=None):
self._deck = []
if face_filter:
self._face_filter = face_filter
else:
self._face_filter = FACES
for _card_face in self._face_filter:
for _card_suit in SUITS:
self._deck.append(Card(_card_suit, _card_face))
def cut(self):
cards_cutting_number = random.randint(1, len(self._deck) - 1)
self._deck = self._deck[cards_cutting_number:] + self._deck[:cards_cutting_number]
def shuffle(self):
random.shuffle(self._deck)
def get_cards(self):
return self._deck
class Player:
# Those are "private" because the class will never be inhered
def __init__(self):
self._deck = Deck()
self._deck.get_cards().clear()
def get_cards(self):
return self._deck.get_cards()
class Game:
# Those are "protected" because the class will be inhered
def __init__(self, number_of_players, dealing_direction, dealing_instructions):
self._deck = Deck()
# Create empty list from Players
self._players = []
self._number_of_players = number_of_players
self._dealing_direction = dealing_direction
self._dealing_instructions = dealing_instructions
# Add players in the list
for _player in range(self._number_of_players):
self._players.append(Player())
def get_players(self):
return self._players
def prepare_deck(self):
- for _player in self._players:
- for player_card in _player.get_cards():
+ for player in self._players:
+ for player_card in player.get_cards():
self._deck.get_cards().append(player_card)
- _player.get_cards().clear()
+ player.get_cards().clear()
self._deck.shuffle()
self._deck.cut()
def deal(self, player):
- _index_of_player = self._players.index(player)
+ index_of_player = self._players.index(player)
if self._dealing_direction == 'ltr':
- _ltr_players = self._players[_index_of_player:] + self._players[:_index_of_player]
- for _number_of_cards_to_deal in self._dealing_instructions:
- for _player_to_deal in _ltr_players:
- for _i in range(_number_of_cards_to_deal):
- _player_to_deal.get_cards().append(self._deck.get_cards()[0])
+ ltr_players = self._players[index_of_player:] + self._players[:index_of_player]
+ for number_of_cards_to_deal in self._dealing_instructions:
+ for player_to_deal in ltr_players:
+ for i in range(number_of_cards_to_deal):
+ player_to_deal.get_cards().append(self._deck.get_cards()[0])
self._deck.get_cards().pop(0)
else:
- _rtl_players = [_player for _player in reversed(self._players[:_index_of_player])] + \
- [_player for _player in reversed(self._players[_index_of_player:])]
- for _number_of_cards_to_deal in self._dealing_instructions:
- for _player_to_deal in _rtl_players:
- for _i in range(_number_of_cards_to_deal):
- _player_to_deal.get_cards().append(self._deck.get_cards()[0])
+ rtl_players = [player for player in reversed(self._players[:index_of_player])] + \
+ [player for player in reversed(self._players[index_of_player:])]
+ for number_of_cards_to_deal in self._dealing_instructions:
+ for player_to_deal in rtl_players:
+ for i in range(number_of_cards_to_deal):
+ player_to_deal.get_cards().append(self._deck.get_cards()[0])
self._deck.get_cards().pop(0)
def get_deck(self):
return self._deck
class Belot(Game):
def __init__(self):
self._number_of_players = 4
self._dealing_direction = 'ltr'
self._dealing_instructions = (2, 3, 3)
super().__init__(self._number_of_players, self._dealing_direction, self._dealing_instructions)
self._deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
class Poker(Game):
def __init__(self):
self._number_of_players = 9
self._dealing_direction = 'rtl'
self._dealing_instructions = (1, 1, 1, 1, 1)
super().__init__(self._number_of_players, self._dealing_direction, self._dealing_instructions)