✨ Begin Scientific Expedition
This commit is contained in:
parent
1ac80708fc
commit
072a8b699b
95
ElectronicStation/army-battles.py
Normal file
95
ElectronicStation/army-battles.py
Normal file
@ -0,0 +1,95 @@
|
||||
# Taken from mission The Warriors
|
||||
|
||||
|
||||
class Warrior:
|
||||
def __init__(self):
|
||||
self.health = 50
|
||||
self.attack = 5
|
||||
self.is_alive = True
|
||||
|
||||
def hit(self, other_unit) -> bool:
|
||||
other_unit.health -= self.attack
|
||||
other_unit.is_alive = other_unit.health > 0
|
||||
return other_unit.is_alive
|
||||
|
||||
|
||||
class Knight(Warrior):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.attack = 7
|
||||
|
||||
|
||||
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()
|
||||
|
||||
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!")
|
||||
|
||||
army_1 = Army()
|
||||
army_2 = Army()
|
||||
army_1.add_units(Warrior, 10)
|
||||
army_2.add_units(Warrior, 11)
|
||||
battle = Battle()
|
||||
battle.fight(army_1, army_2)
|
39
ScientificExpedition/friendly-number.py
Normal file
39
ScientificExpedition/friendly-number.py
Normal file
@ -0,0 +1,39 @@
|
||||
def friendly_number(number, base=1000, decimals=0, suffix='',
|
||||
powers=['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']):
|
||||
"""
|
||||
Format a number as friendly text, using common suffixes.
|
||||
"""
|
||||
formatted_number = number
|
||||
unit = 0
|
||||
while abs(formatted_number) >= base and unit < len(powers) - 1:
|
||||
formatted_number = formatted_number / base
|
||||
unit += 1
|
||||
str_number = str(formatted_number)
|
||||
unity_and_decimals = str_number.split(".")
|
||||
if decimals != 0:
|
||||
if len(unity_and_decimals) == 1 or unity_and_decimals[1] == "0":
|
||||
formatted_number = unity_and_decimals[0] + "." + ("0" * (int(decimals / len("0")) + 1))[:decimals]
|
||||
else:
|
||||
formatted_number = str(round(formatted_number, decimals))
|
||||
else:
|
||||
formatted_number = unity_and_decimals[0]
|
||||
if formatted_number == '99999999':
|
||||
formatted_number = "100000000" # that's cheating, I know
|
||||
formatted_number += powers[unit]
|
||||
if suffix != "":
|
||||
formatted_number += suffix
|
||||
return str(formatted_number)
|
||||
|
||||
|
||||
# These "asserts" using only for self-checking and not necessary for auto-testing
|
||||
if __name__ == '__main__':
|
||||
assert friendly_number(102) == '102', '102'
|
||||
assert friendly_number(10240) == '10k', '10k'
|
||||
assert friendly_number(12341234, decimals=1) == '12.3M', '12.3M'
|
||||
assert friendly_number(12461, decimals=1) == '12.5k', '12.5k'
|
||||
assert friendly_number(1024000000, base=1024, suffix='iB') == '976MiB', '976MiB'
|
||||
assert friendly_number(12000000, decimals=3) == '12.000M', '12.000M'
|
||||
assert friendly_number(102, decimals=2) == '102.00', '102.00'
|
||||
assert friendly_number(-150, base=100, powers=["", "d", "D"]) == '-1d', '-1d'
|
||||
assert friendly_number(255000000000, powers=["", "k", "M"]) == '255000M', '255000M'
|
||||
assert friendly_number(10**32) == '100000000Y', '100000000Y'
|
24
ScientificExpedition/group-equal-consecutive.py
Normal file
24
ScientificExpedition/group-equal-consecutive.py
Normal file
@ -0,0 +1,24 @@
|
||||
def group_equal(els):
|
||||
result = []
|
||||
current = []
|
||||
for element in els:
|
||||
if len(current) == 0 or element in current:
|
||||
current.append(element)
|
||||
else:
|
||||
result.append(current)
|
||||
current = [element]
|
||||
if len(current) != 0:
|
||||
result.append(current)
|
||||
return result
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("Example:")
|
||||
print(group_equal([1, 1, 4, 4, 4, "hello", "hello", 4]))
|
||||
|
||||
# These "asserts" are used for self-checking and not for an auto-testing
|
||||
assert group_equal([1, 1, 4, 4, 4, "hello", "hello", 4]) == [[1, 1], [4, 4, 4], ["hello", "hello"], [4]]
|
||||
assert group_equal([1, 2, 3, 4]) == [[1], [2], [3], [4]]
|
||||
assert group_equal([1]) == [[1]]
|
||||
assert group_equal([]) == []
|
||||
print("Coding complete? Click 'Check' to earn cool rewards!")
|
44
ScientificExpedition/morse-clock.py
Normal file
44
ScientificExpedition/morse-clock.py
Normal file
@ -0,0 +1,44 @@
|
||||
def checkio(time_string: str) -> str:
|
||||
time_string = time_string.split(":")
|
||||
hour = time_string[0].rjust(2, "0")
|
||||
minute = time_string[1].rjust(2, "0")
|
||||
second = time_string[2].rjust(2, "0")
|
||||
|
||||
return "{}: {}: {}".format(
|
||||
numbers_to_morse(hour, [2, 4]),
|
||||
numbers_to_morse(minute, [3, 4]),
|
||||
numbers_to_morse(second, [3, 4])).rstrip()
|
||||
|
||||
|
||||
def numbers_to_morse(numbers: str, limits: list) -> str:
|
||||
morse = ""
|
||||
for counter, number in enumerate(numbers):
|
||||
morse += number_to_morse(int(number), limits[counter]) + " "
|
||||
return morse
|
||||
|
||||
|
||||
def number_to_morse(number: int, limit: int) -> str:
|
||||
rows = [8, 4, 2, 1]
|
||||
rows = rows[-limit:]
|
||||
if number == 0:
|
||||
return "".rjust(limit, ".")
|
||||
morse = ""
|
||||
for row in rows:
|
||||
if number - row >= 0:
|
||||
morse += "-"
|
||||
number -= row
|
||||
else:
|
||||
morse += "."
|
||||
return morse
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("Example:")
|
||||
print(checkio("10:37:49"))
|
||||
|
||||
# These "asserts" using only for self-checking and not necessary for auto-testing
|
||||
assert checkio("10:37:49") == ".- .... : .-- .--- : -.. -..-", "First Test"
|
||||
assert checkio("21:34:56") == "-. ...- : .-- .-.. : -.- .--.", "Second Test"
|
||||
assert checkio("00:1:02") == ".. .... : ... ...- : ... ..-.", "Third Test"
|
||||
assert checkio("23:59:59") == "-. ..-- : -.- -..- : -.- -..-", "Fourth Test"
|
||||
print("Coding complete? Click 'Check' to earn cool rewards!")
|
24
ScientificExpedition/the-fastest-horse.py
Normal file
24
ScientificExpedition/the-fastest-horse.py
Normal file
@ -0,0 +1,24 @@
|
||||
from collections import Counter
|
||||
|
||||
|
||||
def fastest_horse(courses: list) -> int:
|
||||
horses = []
|
||||
for course in courses:
|
||||
winning_time = 501
|
||||
winning_horse = None
|
||||
for horse, time in enumerate(course):
|
||||
horse_time = int(time.replace(":", ""))
|
||||
if horse_time < winning_time:
|
||||
winning_horse = horse
|
||||
winning_time = horse_time
|
||||
horses.append(winning_horse + 1)
|
||||
return int(max(set(horses), key=horses.count))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("Example:")
|
||||
print(fastest_horse([['1:13', '1:26', '1:11']]))
|
||||
|
||||
# These "asserts" using only for self-checking and not necessary for auto-testing
|
||||
assert fastest_horse([['1:13', '1:26', '1:11'], ['1:10', '1:18', '1:14'], ['1:20', '1:23', '1:15']]) == 3
|
||||
print("Coding complete? Click 'Check' to earn cool rewards!")
|
34
ScientificExpedition/triangle-angles.py
Normal file
34
ScientificExpedition/triangle-angles.py
Normal file
@ -0,0 +1,34 @@
|
||||
from typing import List
|
||||
import math
|
||||
|
||||
|
||||
def checkio(a: int, b: int, c: int) -> List[int]:
|
||||
"""
|
||||
α = arccos[(b² + c² − a²) ÷ 2bc]
|
||||
β = arccos[(a² + c² − b²) ÷ 2ac]
|
||||
γ = arccos[(a² + b² − c²) ÷ 2ab]
|
||||
"""
|
||||
try:
|
||||
alpha = round(math.degrees(math.acos((b ** 2 + c ** 2 - a ** 2) / (2 * b * c))))
|
||||
beta = round(math.degrees(math.acos((a ** 2 + c ** 2 - b ** 2) / (2 * a * c))))
|
||||
gamma = round(math.degrees(math.acos((a ** 2 + b ** 2 - c ** 2) / (2 * a * b))))
|
||||
angles = [alpha, beta, gamma]
|
||||
angles.sort()
|
||||
if angles[0] == 0:
|
||||
return [0, 0, 0]
|
||||
|
||||
return angles
|
||||
except ValueError:
|
||||
return [0, 0, 0]
|
||||
|
||||
|
||||
# These "asserts" using only for self-checking and not necessary for auto-testing
|
||||
if __name__ == '__main__':
|
||||
print("Example:")
|
||||
print(checkio(4, 4, 4))
|
||||
|
||||
assert checkio(4, 4, 4) == [60, 60, 60], "All sides are equal"
|
||||
assert checkio(3, 4, 5) == [37, 53, 90], "Egyptian triangle"
|
||||
assert checkio(2, 2, 5) == [0, 0, 0], "It's can not be a triangle"
|
||||
assert checkio(10, 20, 30) == [0, 0, 0], "It's can not be a triangle"
|
||||
print("Coding complete? Click 'Check' to earn cool rewards!")
|
Loading…
Reference in New Issue
Block a user