From 8041fe3f70849595f8842d249760cc0141a2c052 Mon Sep 17 00:00:00 2001 From: Saulo Rodrigo Date: Thu, 19 Feb 2026 17:08:31 -0300 Subject: [PATCH 1/3] Solution --- app/main.py | 82 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 58 insertions(+), 24 deletions(-) diff --git a/app/main.py b/app/main.py index 626f41cf..6fceaa61 100644 --- a/app/main.py +++ b/app/main.py @@ -1,34 +1,68 @@ class Deck: - def __init__(self, row, column, is_alive=True): - pass + def __init__(self, row: int, column: int, is_alive: bool = True) -> None: + self.row = row + self.column = column + self.is_alive = is_alive class Ship: - def __init__(self, start, end, is_drowned=False): - # Create decks and save them to a list `self.decks` - pass + def __init__( + self, + start: tuple, + end: tuple, + is_drowned: bool = False + ) -> None: + if start[0] == end[0] and start[1] <= end[1]: + self.decks = [ + Deck(start[0], i) for i in range(start[1], end[1] + 1) + ] + elif start[0] == end[0] and start[1] > end[1]: + self.decks = [ + Deck(start[0], i) for i in range(end[1], start[1] + 1) + ] + elif start[1] == end[1] and start[0] <= end[0]: + self.decks = [ + Deck(i, start[1]) for i in range(start[0], end[0] + 1) + ] + elif start[1] == end[1] and start[0] > end[0]: + self.decks = [ + Deck(i, start[1]) for i in range(end[0], start[0] + 1) + ] + self.is_drowned = is_drowned - def get_deck(self, row, column): - # Find the corresponding deck in the list - pass + def get_deck(self, row: int, column: int) -> Deck | None: + for deck in self.decks: + if deck.column == column and deck.row == row: + return deck + return None - def fire(self, row, column): - # Change the `is_alive` status of the deck - # And update the `is_drowned` value if it's needed - pass + def fire(self, row: int, column: int) -> None: + deck_shot = self.get_deck(row, column) + if deck_shot is None: + return + deck_shot.is_alive = False + count = 0 + for deck in self.decks: + if deck.is_alive is False: + count += 1 + if len(self.decks) == count: + self.is_drowned = True class Battleship: - def __init__(self, ships): - # Create a dict `self.field`. - # Its keys are tuples - the coordinates of the non-empty cells, - # A value for each cell is a reference to the ship - # which is located in it - pass + def __init__(self, ships: list) -> None: + self.field = {} + for ship_tuple in ships: + ship_obj = Ship(ship_tuple[0], ship_tuple[1]) + for deck in ship_obj.decks: + self.field[(deck.row, deck.column)] = ship_obj - def fire(self, location: tuple): - # This function should check whether the location - # is a key in the `self.field` - # If it is, then it should check if this cell is the last alive - # in the ship or not. - pass + def fire(self, location: tuple) -> str: + if location not in self.field: + return "Miss!" + ship = self.field[location] + ship.fire(location[0], location[1]) + if ship.is_drowned: + return "Sunk!" + else: + return "Hit!" From 54d1f397130dc2841557a24d14a366b78b8d3aa7 Mon Sep 17 00:00:00 2001 From: Saulo Rodrigo Date: Thu, 19 Feb 2026 17:33:30 -0300 Subject: [PATCH 2/3] Solution --- app/main.py | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/app/main.py b/app/main.py index 6fceaa61..f3f70370 100644 --- a/app/main.py +++ b/app/main.py @@ -12,22 +12,22 @@ def __init__( end: tuple, is_drowned: bool = False ) -> None: - if start[0] == end[0] and start[1] <= end[1]: - self.decks = [ - Deck(start[0], i) for i in range(start[1], end[1] + 1) - ] - elif start[0] == end[0] and start[1] > end[1]: - self.decks = [ - Deck(start[0], i) for i in range(end[1], start[1] + 1) - ] - elif start[1] == end[1] and start[0] <= end[0]: - self.decks = [ - Deck(i, start[1]) for i in range(start[0], end[0] + 1) - ] - elif start[1] == end[1] and start[0] > end[0]: - self.decks = [ - Deck(i, start[1]) for i in range(end[0], start[0] + 1) - ] + if start[0] != end[0] and start[1] != end[1]: + raise ValueError("Ship must be placed horizontally or vertically") + for coord in (start, end): + if not (0 <= coord[0] <= 9 and 0 <= coord[1] <= 9): + raise ValueError("Ship coordinates must be between 0 and 9") + if start[0] == end[0]: + row = start[0] + col_start = min(start[1], end[1]) + col_end = max(start[1], end[1]) + self.decks = [Deck(row, c) for c in range(col_start, col_end + 1)] + else: + col = start[1] + row_start = min(start[0], end[0]) + row_end = max(start[0], end[0]) + self.decks = [Deck(r, col) for r in range(row_start, row_end + 1)] + self.is_drowned = is_drowned def get_deck(self, row: int, column: int) -> Deck | None: @@ -64,5 +64,4 @@ def fire(self, location: tuple) -> str: ship.fire(location[0], location[1]) if ship.is_drowned: return "Sunk!" - else: - return "Hit!" + return "Hit!" From 585c14bf3334b15c74e0fbfcc8490172a56ae990 Mon Sep 17 00:00:00 2001 From: Saulo Rodrigo Date: Thu, 19 Feb 2026 17:38:01 -0300 Subject: [PATCH 3/3] Solution --- app/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/main.py b/app/main.py index f3f70370..a46f8d9b 100644 --- a/app/main.py +++ b/app/main.py @@ -13,10 +13,10 @@ def __init__( is_drowned: bool = False ) -> None: if start[0] != end[0] and start[1] != end[1]: - raise ValueError("Ship must be placed horizontally or vertically") + raise ValueError("Ship must be placed horizontally or vertically!") for coord in (start, end): if not (0 <= coord[0] <= 9 and 0 <= coord[1] <= 9): - raise ValueError("Ship coordinates must be between 0 and 9") + raise ValueError("Ship coordinates must be between 0 and 9!") if start[0] == end[0]: row = start[0] col_start = min(start[1], end[1])