diff --git a/Incinerator/binary-count.py b/Incinerator/binary-count.py new file mode 100644 index 0000000..74ecffe --- /dev/null +++ b/Incinerator/binary-count.py @@ -0,0 +1,11 @@ +def checkio(number: int) -> int: + return list(str(bin(number))).count('1') + + +# These "asserts" using only for self-checking and not necessary for auto-testing +if __name__ == '__main__': + assert checkio(4) == 1 + assert checkio(15) == 4 + assert checkio(1) == 1 + assert checkio(1022) == 9 + print("Coding complete? Click 'Check' to review your tests and earn cool rewards!") diff --git a/Incinerator/dialogues.py b/Incinerator/dialogues.py new file mode 100644 index 0000000..f4d02ca --- /dev/null +++ b/Incinerator/dialogues.py @@ -0,0 +1,60 @@ +VOWELS = "aeiou" + + +class User: + def __init__(self, name): + self.name = name + self.chat = None + + def connect_on_chat(self, o_chat): + self.chat = o_chat + + def send(self, text): + self.chat.human_chat += "{} said: {}\n".format(self.name, text) + robot_text = text.lower() + robot_text = "".join(["0" if x in VOWELS else "1" for x in robot_text]) + self.chat.robot_chat += "{} said: {}\n".format(self.name, robot_text) + + +class Human(User): + pass + + +class Robot(User): + pass + + +class Chat: + def __init__(self): + self.human_chat = "" + self.robot_chat = "" + + def connect_human(self, human: Human): + human.connect_on_chat(self) + + def show_human_dialogue(self) -> str: + return self.human_chat.strip('\n') + + def connect_robot(self, robot: Robot): + robot.connect_on_chat(self) + + def show_robot_dialogue(self) -> str: + return self.robot_chat.strip('\n') + + +if __name__ == '__main__': + # These "asserts" using only for self-checking and not necessary for auto-testing + + chat = Chat() + karl = Human("Karl") + bot = Robot("R2D2") + chat.connect_human(karl) + chat.connect_robot(bot) + karl.send("Hi! What's new?") + bot.send("Hello, human. Could we speak later about it?") + assert chat.show_human_dialogue() == """Karl said: Hi! What's new? +R2D2 said: Hello, human. Could we speak later about it?""" + assert chat.show_robot_dialogue() == """Karl said: 101111011111011 +R2D2 said: 10110111010111100111101110011101011010011011""" + + print("Coding complete? Let's try tests!") diff --git a/Incinerator/morse-decoder.py b/Incinerator/morse-decoder.py new file mode 100644 index 0000000..fd792c8 --- /dev/null +++ b/Incinerator/morse-decoder.py @@ -0,0 +1,41 @@ +MORSE = {'.-': 'a', '-...': 'b', '-.-.': 'c', + '-..': 'd', '.': 'e', '..-.': 'f', + '--.': 'g', '....': 'h', '..': 'i', + '.---': 'j', '-.-': 'k', '.-..': 'l', + '--': 'm', '-.': 'n', '---': 'o', + '.--.': 'p', '--.-': 'q', '.-.': 'r', + '...': 's', '-': 't', '..-': 'u', + '...-': 'v', '.--': 'w', '-..-': 'x', + '-.--': 'y', '--..': 'z', '-----': '0', + '.----': '1', '..---': '2', '...--': '3', + '....-': '4', '.....': '5', '-....': '6', + '--...': '7', '---..': '8', '----.': '9' + } + + +def morse_decoder(code: str) -> str: + sentence = "" + while len(code) > 0: + if code[0] == " ": + sentence += " " + code = code[2:] + next_space = code.find(" ") + if next_space != -1: + letter = code[0:next_space] + code = code[next_space+1:] + sentence += MORSE[letter] + else: + sentence += MORSE[code] + code = "" + return sentence[0].upper() + sentence[1:] + + +if __name__ == '__main__': + print("Example:") + print(morse_decoder('... --- ...')) + + # These "asserts" using only for self-checking and not necessary for auto-testing + assert morse_decoder("... --- -- . - . -..- -") == "Some text" + assert morse_decoder("..--- ----- .---- ---..") == "2018" + assert morse_decoder(".. - .-- .- ... .- --. --- --- -.. -.. .- -.--") == "It was a good day" + print("Coding complete? Click 'Check' to earn cool rewards!") diff --git a/OReilly/the-vampires.py b/OReilly/the-vampires.py new file mode 100644 index 0000000..67c14be --- /dev/null +++ b/OReilly/the-vampires.py @@ -0,0 +1,137 @@ +# Taken from mission The Defenders +# Taken from mission Army Battles +# Taken from mission The Warriors + + +class Warrior: + def __init__(self): + self.health = 50 + self.attack = 5 + self.is_alive = True + self.defense = 0 + self.vampirism = 0 + + def hit(self, other_unit) -> bool: + hit_points = self.attack - other_unit.defense + hit_points = hit_points if hit_points > 0 else 0 + other_unit.health -= hit_points + other_unit.is_alive = other_unit.health > 0 + + self.health += (hit_points * self.vampirism) + return other_unit.is_alive + + +class Knight(Warrior): + def __init__(self): + super().__init__() + self.attack = 7 + + +class Defender(Warrior): + def __init__(self): + super().__init__() + self.health = 60 + self.attack = 3 + self.defense = 2 + + +class Vampire(Warrior): + def __init__(self): + super().__init__() + self.health = 40 + self.attack = 4 + self.vampirism = 0.5 + + +class Rookie(Warrior): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.health = 50 + self.attack = 1 + + +def fight(unit_1, unit_2): + while unit_1.is_alive and unit_2.is_alive: + if not unit_1.hit(unit_2): + return True + if not unit_2.hit(unit_1): + return False + + +class Army: + def __init__(self): + self.units = [] + + def add_units(self, unit_type, quantity): + for i in range(quantity): + self.units.append(unit_type()) + + +class Battle: + @staticmethod + def fight(army_1: Army, army_2: Army) -> bool: + while len(army_1.units) > 0 and len(army_2.units) > 0: + current_unit_1 = army_1.units[0] + current_unit_2 = army_2.units[0] + if fight(current_unit_1, current_unit_2): + army_2.units.pop(0) + else: + army_1.units.pop(0) + return len(army_1.units) > 0 + + +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() + eric = Vampire() + adam = Vampire() + richard = Defender() + ogre = 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 + assert fight(bob, mike) == False + assert fight(lancelot, rog) == True + assert fight(eric, richard) == False + assert fight(ogre, adam) == True + + # battle tests + my_army = Army() + my_army.add_units(Defender, 2) + my_army.add_units(Vampire, 2) + my_army.add_units(Warrior, 1) + + enemy_army = Army() + enemy_army.add_units(Warrior, 2) + enemy_army.add_units(Defender, 2) + enemy_army.add_units(Vampire, 3) + + army_3 = Army() + army_3.add_units(Warrior, 1) + army_3.add_units(Defender, 4) + + army_4 = Army() + army_4.add_units(Vampire, 3) + 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!") diff --git a/ScientificExpedition/the-defenders.py b/ScientificExpedition/the-defenders.py new file mode 100644 index 0000000..579ac46 --- /dev/null +++ b/ScientificExpedition/the-defenders.py @@ -0,0 +1,118 @@ +# Taken from mission Army Battles +# Taken from mission The Warriors + + +class Warrior: + def __init__(self): + self.health = 50 + self.attack = 5 + self.is_alive = True + self.defense = 0 + + def hit(self, other_unit) -> bool: + hit_points = self.attack - other_unit.defense + hit_points = hit_points if hit_points > 0 else 0 + other_unit.health -= hit_points + other_unit.is_alive = other_unit.health > 0 + return other_unit.is_alive + + +class Knight(Warrior): + def __init__(self): + super().__init__() + self.attack = 7 + + +class Defender(Warrior): + def __init__(self): + super().__init__() + self.health = 60 + self.attack = 3 + self.defense = 2 + + +class Rookie(Warrior): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.health = 50 + self.attack = 1 + + +def fight(unit_1, unit_2): + while unit_1.is_alive and unit_2.is_alive: + if not unit_1.hit(unit_2): + return True + if not unit_2.hit(unit_1): + return False + + +class Army: + def __init__(self): + self.units = [] + + def add_units(self, unit_type, quantity): + for i in range(quantity): + self.units.append(unit_type()) + + +class Battle: + def fight(self, army_1: Army, army_2: Army) -> bool: + while len(army_1.units) > 0 and len(army_2.units) > 0: + current_unit_1 = army_1.units[0] + current_unit_2 = army_2.units[0] + if fight(current_unit_1, current_unit_2): + army_2.units.pop(0) + else: + army_1.units.pop(0) + return len(army_1.units) > 0 + + +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!") + + unit_1 = Defender() + unit_2 = Rookie() + fight(unit_1, unit_2) + assert unit_1.health == 60 \ No newline at end of file