From 966f603c6111eaed80b3522132bd2ccb8b3bcb73 Mon Sep 17 00:00:00 2001 From: Ahmad Hmedan Date: Sun, 19 Apr 2026 20:04:39 +0100 Subject: [PATCH 1/4] Sprint 5 done --- Sprint5-exercise/classes-and-object.py | 24 +++ Sprint5-exercise/dataclass.py | 25 ++++ Sprint5-exercise/enumexercise.py | 153 ++++++++++++++++++++ Sprint5-exercise/generics.py | 25 ++++ Sprint5-exercise/methods.py | 24 +++ Sprint5-exercise/type-checking-with-mypy.py | 33 +++++ Sprint5-exercise/type-guided.py | 68 +++++++++ 7 files changed, 352 insertions(+) create mode 100644 Sprint5-exercise/classes-and-object.py create mode 100644 Sprint5-exercise/dataclass.py create mode 100644 Sprint5-exercise/enumexercise.py create mode 100644 Sprint5-exercise/generics.py create mode 100644 Sprint5-exercise/methods.py create mode 100644 Sprint5-exercise/type-checking-with-mypy.py create mode 100644 Sprint5-exercise/type-guided.py diff --git a/Sprint5-exercise/classes-and-object.py b/Sprint5-exercise/classes-and-object.py new file mode 100644 index 000000000..6ad773fb0 --- /dev/null +++ b/Sprint5-exercise/classes-and-object.py @@ -0,0 +1,24 @@ +class Person: + def __init__(self, name: str, age: int, preferred_operating_system: str): + self.name = name + self.age = age + self.preferred_operating_system = preferred_operating_system + + +def is_adult(person: Person) -> bool: + return person.age >= 18 + + +def double(person: Person) -> int: + return person.price * 2 + + +imran = Person("Imran", 22, "Ubuntu") +print(imran.name) + + +eliza = Person("Eliza", 34, "Arch Linux") +print(eliza.name) + + +print(is_adult(imran)) diff --git a/Sprint5-exercise/dataclass.py b/Sprint5-exercise/dataclass.py new file mode 100644 index 000000000..43c7caa0e --- /dev/null +++ b/Sprint5-exercise/dataclass.py @@ -0,0 +1,25 @@ +from datetime import date +from dataclasses import dataclass + + +@dataclass(frozen=True) +class Person: + name: str + date_of_birth: date + preferred_operating_system: str + + def is_adult(self) -> bool: + current_date = date.today() + age = current_date.year - self.date_of_birth.year + + if (current_date.month, current_date.day) < ( + self.date_of_birth.month, + self.date_of_birth.day, + ): + age -= 1 + + return age >= 18 + + +imran = Person("Imran", date(1995, 10, 16), "Ubuntu") +print(imran.is_adult()) diff --git a/Sprint5-exercise/enumexercise.py b/Sprint5-exercise/enumexercise.py new file mode 100644 index 000000000..dc9be3364 --- /dev/null +++ b/Sprint5-exercise/enumexercise.py @@ -0,0 +1,153 @@ +from dataclasses import dataclass +from typing import List +from enum import Enum +import sys + + +class OperatingSystem(Enum): + MACOS = "makOS" + ARCH = "Arch Linux" + UBUNTU = "Ubuntu" + + +@dataclass(frozen=True) +class Laptop: + id: int + manufacturer: str + model: str + screen_size_in_inches: int + operating_system: OperatingSystem + + +@dataclass(frozen=True) +class Person: + name: str + age: int + preferred_operating_system: OperatingSystem + + +def parse_age(age_txt: str) -> int: + try: + age = int(age_txt) + except ValueError: + print("Error:age must be a valid integer", file=sys.stderr) + sys.exit(1) + + if age < 0: + print("Error: age should be a positive number", file=sys.stderr) + sys.exit(1) + + return age + + +def parse_operating_system(op_tx: str) -> OperatingSystem: + normalized = op_tx.strip().lower() + + mapping = { + "makos": OperatingSystem.MACOS, + "ubuntu": OperatingSystem.UBUNTU, + "arch": OperatingSystem.ARCH, + "arch linux": OperatingSystem.ARCH, + } + + op: OperatingSystem = mapping.get(normalized) + + if op is None: + print( + "Error: operating system must be one of: Ubuntu, Arch Linux, macOS.", + file=sys.stderr, + ) + sys.exit(1) + + return op + + +def find_matching_laptops( + laptops: List[Laptop], operating_system: OperatingSystem +) -> int: + counter: int = 0 + for laptop in laptops: + if laptop.operating_system == operating_system: + counter += 1 + + return counter + + +def find_most_available(laptops: List[Laptop]) -> OperatingSystem: + count = {} + for laptop in laptops: + if laptop.operating_system in count: + count[laptop.operating_system] += 1 + else: + count[laptop.operating_system] = 1 + return max(count, key=count.get) + + +def main() -> None: + + laptops = [ + Laptop( + id=1, + manufacturer="Dell", + model="XPS", + screen_size_in_inches=13, + operating_system=OperatingSystem.ARCH, + ), + Laptop( + id=2, + manufacturer="Dell", + model="XPS", + screen_size_in_inches=15, + operating_system=OperatingSystem.UBUNTU, + ), + Laptop( + id=3, + manufacturer="Dell", + model="XPS", + screen_size_in_inches=15, + operating_system=OperatingSystem.UBUNTU, + ), + Laptop( + id=4, + manufacturer="Apple", + model="macBook", + screen_size_in_inches=13, + operating_system=OperatingSystem.MACOS, + ), + ] + + name = input("Enter your name: ").strip() + if name == "": + print("Error: name must not be empty", file=sys.stderr) + sys.exit(1) + age_txt = input("Enter your age: ") + operating_system_txt = input("Enter operating system: ") + + age = parse_age(age_txt) + operating_system = parse_operating_system(operating_system_txt) + + person = Person( + name=name, + age=age, + preferred_operating_system=operating_system, + ) + + matching_laptops_count = find_matching_laptops( + laptops, person.preferred_operating_system + ) + print( + f"Library has {matching_laptops_count} laptop(s) with {person.preferred_operating_system}" + ) + + most_available_os = find_most_available(laptops) + + if most_available_os != person.preferred_operating_system: + count_most_available_os = find_matching_laptops(laptops, most_available_os) + print( + f"If you're willing to accept {most_available_os.value}, " + f"you're more likely to get a laptop because the library has " + f"{count_most_available_os} with that operating system." + ) + +if __name__ == "__main__": + main() diff --git a/Sprint5-exercise/generics.py b/Sprint5-exercise/generics.py new file mode 100644 index 000000000..d07a30a1e --- /dev/null +++ b/Sprint5-exercise/generics.py @@ -0,0 +1,25 @@ +from dataclasses import dataclass +from typing import List + + +@dataclass(frozen=True) +class Person: + name: str + + age: int + children: List["Person"] + + +fatma = Person(name="Fatma", age=22, children=[]) +aisha = Person(name="Aisha", age=25, children=[]) + +imran = Person(name="Imran", age=40, children=[fatma, aisha]) + + +def print_family_tree(person: Person) -> None: + print(person.name) + for child in person.children: + print(f"- {child.name} ({child.age})") + + +print_family_tree(imran) diff --git a/Sprint5-exercise/methods.py b/Sprint5-exercise/methods.py new file mode 100644 index 000000000..608c34313 --- /dev/null +++ b/Sprint5-exercise/methods.py @@ -0,0 +1,24 @@ +from datetime import date + + +class Person: + def __init__(self, name: str, date_of_birth: date, preferred_operating_system: str): + self.name = name + self.date_of_birth = date_of_birth + self.preferred_operating_system = preferred_operating_system + + def is_adult(self) -> bool: + current_date = date.today() + age = current_date.year - self.date_of_birth.year + + if (current_date.month, current_date.day) < ( + self.date_of_birth.month, + self.date_of_birth.day, + ): + age -= 1 + + return age >= 18 + + +imran = Person("Imran", date(1995, 10, 16), "Ubuntu") +print(imran.is_adult()) diff --git a/Sprint5-exercise/type-checking-with-mypy.py b/Sprint5-exercise/type-checking-with-mypy.py new file mode 100644 index 000000000..885099aff --- /dev/null +++ b/Sprint5-exercise/type-checking-with-mypy.py @@ -0,0 +1,33 @@ +def open_account(balances: dict[str, int], name: str, amount: int) -> None: + balances[name] = amount + + +def sum_balances(accounts: dict[str, int]) -> int: + total = 0 + for name, pence in accounts.items(): + print(f"{name} had balance {pence}") + total += pence + return total + + +def format_pence_as_string(total_pence: int) -> str: + if total_pence < 100: + return f"{total_pence}p" + pounds = int(total_pence / 100) + pence = total_pence % 100 + return f"£{pounds}.{pence:02d}" + + +balances = { + "Sima": 700, + "Linn": 545, + "Georg": 831, +} + +open_account(balances, "Tobi", 913) +open_account(balances, "Olya", 713) + +total_pence = sum_balances(balances) +total_string = format_pence_as_string(total_pence) + +print(f"The bank accounts total {total_string}") diff --git a/Sprint5-exercise/type-guided.py b/Sprint5-exercise/type-guided.py new file mode 100644 index 000000000..ffae53078 --- /dev/null +++ b/Sprint5-exercise/type-guided.py @@ -0,0 +1,68 @@ +from dataclasses import dataclass +from typing import List + + +@dataclass(frozen=True) +class Person: + name: str + age: int + preferred_operating_systems: List[str] + + +@dataclass(frozen=True) +class Laptop: + id: int + manufacturer: str + model: str + screen_size_in_inches: float + operating_system: str + + +def find_possible_laptops(laptops: List[Laptop], person: Person) -> List[Laptop]: + possible_laptops = [] + for laptop in laptops: + + if laptop.operating_system in person.preferred_operating_systems: + possible_laptops.append(laptop) + return possible_laptops + + +people = [ + Person(name="Imran", age=22, preferred_operating_systems=["Ubuntu", "Arch Linux"]), + Person(name="Eliza", age=34, preferred_operating_systems=["Arch Linux"]), +] + +laptops = [ + Laptop( + id=1, + manufacturer="Dell", + model="XPS", + screen_size_in_inches=13, + operating_system="Arch Linux", + ), + Laptop( + id=2, + manufacturer="Dell", + model="XPS", + screen_size_in_inches=15, + operating_system="Ubuntu", + ), + Laptop( + id=3, + manufacturer="Dell", + model="XPS", + screen_size_in_inches=15, + operating_system="Ubuntu", + ), + Laptop( + id=4, + manufacturer="Apple", + model="macBook", + screen_size_in_inches=13, + operating_system="macOS", + ), +] + +for person in people: + possible_laptops = find_possible_laptops(laptops, person) + print(f"Possible laptops for {person.name}: {possible_laptops}") From a814b8dd5a02d00ee40adcaa7c224989e3706f0a Mon Sep 17 00:00:00 2001 From: Ahmad Hmedan Date: Mon, 20 Apr 2026 16:23:50 +0100 Subject: [PATCH 2/4] genrate the cases --- laptop-allocation.py | 70 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 laptop-allocation.py diff --git a/laptop-allocation.py b/laptop-allocation.py new file mode 100644 index 000000000..68e2ea64e --- /dev/null +++ b/laptop-allocation.py @@ -0,0 +1,70 @@ +from enum import Enum +from typing import List,Dict +from dataclasses import dataclass + +from itertools import permutations +import sys + +class OperatingSystem(Enum): + UBUNTU = "ubuntu" + MACOS="makos" + ARCH = "arch linux" + +@dataclass (frozen=True) +class Person: + name:str + age:int + preferred_operating_system:List[OperatingSystem] + + +@dataclass(frozen=True) +class Laptop: + id: int + manufacturer: str + model: str + screen_size_in_inches: float + operating_system: OperatingSystem + +def sadness(person:Person,operating_system:OperatingSystem)->int: + sad:int =100 + for index, os in enumerate(person.preferred_operating_system): + if(os==operating_system): + sad=index + return sad + + return sad + +def allocate_laptops(people: List[Person], laptops: List[Laptop]) -> Dict[Person, Laptop]: + how_many_people= len(people) + how_many_laptops = len(laptops) + matrix = [[0 for i in range(how_many_laptops)] for _ in range(how_many_people)] + for i, person in enumerate(people): + for j,laptop in enumerate(laptops): + matrix[i][j] = sadness(person,laptop.operating_system) + + + + for perm in permutations(range(how_many_laptops)): + print(perm) + + +people = [ + Person( + name="Imran", + age=22, + preferred_operating_system=[OperatingSystem.UBUNTU, OperatingSystem.ARCH], + ), + Person( + name="Eliza", + age=34, + preferred_operating_system=[OperatingSystem.ARCH, OperatingSystem.UBUNTU], + ), +] +laptops = [ + Laptop(id=1, manufacturer="Dell", model="XPS", screen_size_in_inches=13, operating_system=OperatingSystem.ARCH), + Laptop(id=2, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system=OperatingSystem.UBUNTU), + Laptop(id=3, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system=OperatingSystem.UBUNTU), + +] + +allocate_laptops(people,laptops) \ No newline at end of file From c77b4dfb472876720596e37b3f5890167e12ac63 Mon Sep 17 00:00:00 2001 From: Ahmad Hmedan Date: Mon, 20 Apr 2026 17:02:18 +0100 Subject: [PATCH 3/4] almost solve --- laptop-allocation.py | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/laptop-allocation.py b/laptop-allocation.py index 68e2ea64e..a1c27c918 100644 --- a/laptop-allocation.py +++ b/laptop-allocation.py @@ -41,28 +41,53 @@ def allocate_laptops(people: List[Person], laptops: List[Laptop]) -> Dict[Person for i, person in enumerate(people): for j,laptop in enumerate(laptops): matrix[i][j] = sadness(person,laptop.operating_system) - - + print(matrix) + best_prem = None + min_sadness=100000000000 for perm in permutations(range(how_many_laptops)): - print(perm) + print(perm,"dsadsadsadsa") + total =0 + for i in range(how_many_people): + + total+= matrix[i][perm[i]] + + print(total) + if total< min_sadness : + min_sadness = total + best_perm = perm + print(min_sadness,"minnnnnn") + print(best_perm,"bestttt") + + print("=================================") + print (best_perm,min_sadness) + + + + people = [ Person( name="Imran", age=22, + preferred_operating_system=[OperatingSystem.UBUNTU, OperatingSystem.ARCH,OperatingSystem.MACOS], + ), + Person( + name="Eliza", + age=34, preferred_operating_system=[OperatingSystem.UBUNTU, OperatingSystem.ARCH], ), Person( name="Eliza", age=34, - preferred_operating_system=[OperatingSystem.ARCH, OperatingSystem.UBUNTU], + preferred_operating_system=[OperatingSystem.MACOS], ), + ] laptops = [ - Laptop(id=1, manufacturer="Dell", model="XPS", screen_size_in_inches=13, operating_system=OperatingSystem.ARCH), - Laptop(id=2, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system=OperatingSystem.UBUNTU), + Laptop(id=1, manufacturer="Dell", model="XPS", screen_size_in_inches=13, operating_system=OperatingSystem.MACOS), + Laptop(id=2, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system=OperatingSystem.MACOS), Laptop(id=3, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system=OperatingSystem.UBUNTU), ] From 459b0236e6c6018a7a7399d7190c3be01b9f979d Mon Sep 17 00:00:00 2001 From: Ahmad Hmedan Date: Mon, 20 Apr 2026 18:06:49 +0100 Subject: [PATCH 4/4] feat: implement laptop allocation using permutation and sadness matrix --- laptop-allocation.py | 82 ++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/laptop-allocation.py b/laptop-allocation.py index a1c27c918..365644587 100644 --- a/laptop-allocation.py +++ b/laptop-allocation.py @@ -37,59 +37,59 @@ def sadness(person:Person,operating_system:OperatingSystem)->int: def allocate_laptops(people: List[Person], laptops: List[Laptop]) -> Dict[Person, Laptop]: how_many_people= len(people) how_many_laptops = len(laptops) + if how_many_laptops < how_many_people: + raise ValueError("Not enough laptops for all people") matrix = [[0 for i in range(how_many_laptops)] for _ in range(how_many_people)] for i, person in enumerate(people): for j,laptop in enumerate(laptops): matrix[i][j] = sadness(person,laptop.operating_system) - print(matrix) - - best_prem = None + + best_perm = None min_sadness=100000000000 for perm in permutations(range(how_many_laptops)): - print(perm,"dsadsadsadsa") + total =0 for i in range(how_many_people): total+= matrix[i][perm[i]] - print(total) + if total< min_sadness : min_sadness = total best_perm = perm - print(min_sadness,"minnnnnn") - print(best_perm,"bestttt") - - print("=================================") - print (best_perm,min_sadness) - - + results = {} + for index, person in enumerate(people): + results[person.name]= laptops[best_perm[index]] - - - -people = [ - Person( - name="Imran", - age=22, - preferred_operating_system=[OperatingSystem.UBUNTU, OperatingSystem.ARCH,OperatingSystem.MACOS], - ), - Person( - name="Eliza", - age=34, - preferred_operating_system=[OperatingSystem.UBUNTU, OperatingSystem.ARCH], - ), - Person( - name="Eliza", - age=34, - preferred_operating_system=[OperatingSystem.MACOS], - ), - -] -laptops = [ - Laptop(id=1, manufacturer="Dell", model="XPS", screen_size_in_inches=13, operating_system=OperatingSystem.MACOS), - Laptop(id=2, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system=OperatingSystem.MACOS), - Laptop(id=3, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system=OperatingSystem.UBUNTU), - -] - -allocate_laptops(people,laptops) \ No newline at end of file + + return results + +def main()->None: + people = [ + Person( + name="Imran", + age=22, + preferred_operating_system=[OperatingSystem.UBUNTU, OperatingSystem.ARCH,OperatingSystem.MACOS], + ), + Person( + name="Eliza", + age=34, + preferred_operating_system=[OperatingSystem.UBUNTU, OperatingSystem.ARCH], + ), + Person( + name="Ahmad", + age=34, + preferred_operating_system=[OperatingSystem.MACOS], + ), + + ] + laptops = [ + Laptop(id=1, manufacturer="Dell", model="XPS", screen_size_in_inches=13, operating_system=OperatingSystem.MACOS), + Laptop(id=2, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system=OperatingSystem.MACOS), + Laptop(id=3, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system=OperatingSystem.UBUNTU), + + ] + + print(allocate_laptops(people,laptops)) + +main() \ No newline at end of file