Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
overloaded method for defender solution in Clear category for The Defenders by roman.bratishchev
from dataclasses import dataclass
from collections import deque
from typing import Self
@dataclass
class Warrior:
health:int=50
attack:int=5
@property
def is_alive(self) -> bool: return self.health>0
def attacked_by(self, w:Self) -> None: self.health-=w.attack
@dataclass
class Knight(Warrior):
attack:int=7
@dataclass
class Defender(Warrior):
health:int=60
attack:int=3
defence:int=2
def attacked_by(self, w:Warrior) -> None: self.health-=max(0,w.attack-self.defence)
def fight(*warriors:Warrior, who:int=0) -> bool:
warriors[~who].attacked_by(warriors[who])
return fight(*warriors, who=~who) if all(w.is_alive for w in warriors) else warriors[0].is_alive
class Army(deque[Warrior]):
def add_units(self, cls:type[Warrior], count:int) -> None: super().extend(cls() for _ in range(count))
class Battle:
@classmethod
def fight(_, *armies:Army) -> bool:
while all(armies): armies[fight(*(a[0] for a in armies))].popleft()
return bool(armies[0])
if __name__ == "__main__":
# These "asserts" using only for self-checking and not necessary for auto-testing
chuck = Warrior()
bruce = Warrior()
carl = Knight()
dave = Warrior()
mark = Warrior()
assert fight(chuck, bruce) == True
assert fight(dave, carl) == False
assert chuck.is_alive == True
assert bruce.is_alive == False
assert carl.is_alive == True
assert dave.is_alive == False
assert fight(carl, mark) == False
assert carl.is_alive == False
print("Coding complete? Let's try tests!")
if __name__ == "__main__":
# These "asserts" using only for self-checking and not necessary for auto-testing
# fight tests
chuck = Warrior()
bruce = Warrior()
carl = Knight()
dave = Warrior()
mark = Warrior()
assert fight(chuck, bruce) == True
assert fight(dave, carl) == False
assert chuck.is_alive == True
assert bruce.is_alive == False
assert carl.is_alive == True
assert dave.is_alive == False
assert fight(carl, mark) == False
assert carl.is_alive == False
# battle tests
my_army = Army()
my_army.add_units(Knight, 3)
enemy_army = Army()
enemy_army.add_units(Warrior, 3)
army_3 = Army()
army_3.add_units(Warrior, 20)
army_3.add_units(Knight, 5)
army_4 = Army()
army_4.add_units(Warrior, 30)
battle = Battle()
assert battle.fight(my_army, enemy_army) == True
assert battle.fight(army_3, army_4) == False
print("Coding complete? Let's try tests!")
if __name__ == "__main__":
# These "asserts" using only for self-checking and not necessary for auto-testing
# fight tests
chuck = Warrior()
bruce = Warrior()
carl = Knight()
dave = Warrior()
mark = Warrior()
bob = Defender()
mike = Knight()
rog = Warrior()
lancelot = Defender()
assert fight(chuck, bruce) == True
assert fight(dave, carl) == False
assert chuck.is_alive == True
assert bruce.is_alive == False
assert carl.is_alive == True
assert dave.is_alive == False
assert fight(carl, mark) == False
assert carl.is_alive == False
assert fight(bob, mike) == False
assert fight(lancelot, rog) == True
# battle tests
my_army = Army()
my_army.add_units(Defender, 1)
enemy_army = Army()
enemy_army.add_units(Warrior, 2)
army_3 = Army()
army_3.add_units(Warrior, 1)
army_3.add_units(Defender, 1)
army_4 = Army()
army_4.add_units(Warrior, 2)
battle = Battle()
assert battle.fight(my_army, enemy_army) == False
assert battle.fight(army_3, army_4) == True
print("Coding complete? Let's try tests!")
Sept. 17, 2024