Skip to content

Commit 966f603

Browse files
committed
Sprint 5 done
1 parent 4350f48 commit 966f603

7 files changed

Lines changed: 352 additions & 0 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Person:
2+
def __init__(self, name: str, age: int, preferred_operating_system: str):
3+
self.name = name
4+
self.age = age
5+
self.preferred_operating_system = preferred_operating_system
6+
7+
8+
def is_adult(person: Person) -> bool:
9+
return person.age >= 18
10+
11+
12+
def double(person: Person) -> int:
13+
return person.price * 2
14+
15+
16+
imran = Person("Imran", 22, "Ubuntu")
17+
print(imran.name)
18+
19+
20+
eliza = Person("Eliza", 34, "Arch Linux")
21+
print(eliza.name)
22+
23+
24+
print(is_adult(imran))

Sprint5-exercise/dataclass.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from datetime import date
2+
from dataclasses import dataclass
3+
4+
5+
@dataclass(frozen=True)
6+
class Person:
7+
name: str
8+
date_of_birth: date
9+
preferred_operating_system: str
10+
11+
def is_adult(self) -> bool:
12+
current_date = date.today()
13+
age = current_date.year - self.date_of_birth.year
14+
15+
if (current_date.month, current_date.day) < (
16+
self.date_of_birth.month,
17+
self.date_of_birth.day,
18+
):
19+
age -= 1
20+
21+
return age >= 18
22+
23+
24+
imran = Person("Imran", date(1995, 10, 16), "Ubuntu")
25+
print(imran.is_adult())

Sprint5-exercise/enumexercise.py

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
from dataclasses import dataclass
2+
from typing import List
3+
from enum import Enum
4+
import sys
5+
6+
7+
class OperatingSystem(Enum):
8+
MACOS = "makOS"
9+
ARCH = "Arch Linux"
10+
UBUNTU = "Ubuntu"
11+
12+
13+
@dataclass(frozen=True)
14+
class Laptop:
15+
id: int
16+
manufacturer: str
17+
model: str
18+
screen_size_in_inches: int
19+
operating_system: OperatingSystem
20+
21+
22+
@dataclass(frozen=True)
23+
class Person:
24+
name: str
25+
age: int
26+
preferred_operating_system: OperatingSystem
27+
28+
29+
def parse_age(age_txt: str) -> int:
30+
try:
31+
age = int(age_txt)
32+
except ValueError:
33+
print("Error:age must be a valid integer", file=sys.stderr)
34+
sys.exit(1)
35+
36+
if age < 0:
37+
print("Error: age should be a positive number", file=sys.stderr)
38+
sys.exit(1)
39+
40+
return age
41+
42+
43+
def parse_operating_system(op_tx: str) -> OperatingSystem:
44+
normalized = op_tx.strip().lower()
45+
46+
mapping = {
47+
"makos": OperatingSystem.MACOS,
48+
"ubuntu": OperatingSystem.UBUNTU,
49+
"arch": OperatingSystem.ARCH,
50+
"arch linux": OperatingSystem.ARCH,
51+
}
52+
53+
op: OperatingSystem = mapping.get(normalized)
54+
55+
if op is None:
56+
print(
57+
"Error: operating system must be one of: Ubuntu, Arch Linux, macOS.",
58+
file=sys.stderr,
59+
)
60+
sys.exit(1)
61+
62+
return op
63+
64+
65+
def find_matching_laptops(
66+
laptops: List[Laptop], operating_system: OperatingSystem
67+
) -> int:
68+
counter: int = 0
69+
for laptop in laptops:
70+
if laptop.operating_system == operating_system:
71+
counter += 1
72+
73+
return counter
74+
75+
76+
def find_most_available(laptops: List[Laptop]) -> OperatingSystem:
77+
count = {}
78+
for laptop in laptops:
79+
if laptop.operating_system in count:
80+
count[laptop.operating_system] += 1
81+
else:
82+
count[laptop.operating_system] = 1
83+
return max(count, key=count.get)
84+
85+
86+
def main() -> None:
87+
88+
laptops = [
89+
Laptop(
90+
id=1,
91+
manufacturer="Dell",
92+
model="XPS",
93+
screen_size_in_inches=13,
94+
operating_system=OperatingSystem.ARCH,
95+
),
96+
Laptop(
97+
id=2,
98+
manufacturer="Dell",
99+
model="XPS",
100+
screen_size_in_inches=15,
101+
operating_system=OperatingSystem.UBUNTU,
102+
),
103+
Laptop(
104+
id=3,
105+
manufacturer="Dell",
106+
model="XPS",
107+
screen_size_in_inches=15,
108+
operating_system=OperatingSystem.UBUNTU,
109+
),
110+
Laptop(
111+
id=4,
112+
manufacturer="Apple",
113+
model="macBook",
114+
screen_size_in_inches=13,
115+
operating_system=OperatingSystem.MACOS,
116+
),
117+
]
118+
119+
name = input("Enter your name: ").strip()
120+
if name == "":
121+
print("Error: name must not be empty", file=sys.stderr)
122+
sys.exit(1)
123+
age_txt = input("Enter your age: ")
124+
operating_system_txt = input("Enter operating system: ")
125+
126+
age = parse_age(age_txt)
127+
operating_system = parse_operating_system(operating_system_txt)
128+
129+
person = Person(
130+
name=name,
131+
age=age,
132+
preferred_operating_system=operating_system,
133+
)
134+
135+
matching_laptops_count = find_matching_laptops(
136+
laptops, person.preferred_operating_system
137+
)
138+
print(
139+
f"Library has {matching_laptops_count} laptop(s) with {person.preferred_operating_system}"
140+
)
141+
142+
most_available_os = find_most_available(laptops)
143+
144+
if most_available_os != person.preferred_operating_system:
145+
count_most_available_os = find_matching_laptops(laptops, most_available_os)
146+
print(
147+
f"If you're willing to accept {most_available_os.value}, "
148+
f"you're more likely to get a laptop because the library has "
149+
f"{count_most_available_os} with that operating system."
150+
)
151+
152+
if __name__ == "__main__":
153+
main()

Sprint5-exercise/generics.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from dataclasses import dataclass
2+
from typing import List
3+
4+
5+
@dataclass(frozen=True)
6+
class Person:
7+
name: str
8+
9+
age: int
10+
children: List["Person"]
11+
12+
13+
fatma = Person(name="Fatma", age=22, children=[])
14+
aisha = Person(name="Aisha", age=25, children=[])
15+
16+
imran = Person(name="Imran", age=40, children=[fatma, aisha])
17+
18+
19+
def print_family_tree(person: Person) -> None:
20+
print(person.name)
21+
for child in person.children:
22+
print(f"- {child.name} ({child.age})")
23+
24+
25+
print_family_tree(imran)

Sprint5-exercise/methods.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from datetime import date
2+
3+
4+
class Person:
5+
def __init__(self, name: str, date_of_birth: date, preferred_operating_system: str):
6+
self.name = name
7+
self.date_of_birth = date_of_birth
8+
self.preferred_operating_system = preferred_operating_system
9+
10+
def is_adult(self) -> bool:
11+
current_date = date.today()
12+
age = current_date.year - self.date_of_birth.year
13+
14+
if (current_date.month, current_date.day) < (
15+
self.date_of_birth.month,
16+
self.date_of_birth.day,
17+
):
18+
age -= 1
19+
20+
return age >= 18
21+
22+
23+
imran = Person("Imran", date(1995, 10, 16), "Ubuntu")
24+
print(imran.is_adult())
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
def open_account(balances: dict[str, int], name: str, amount: int) -> None:
2+
balances[name] = amount
3+
4+
5+
def sum_balances(accounts: dict[str, int]) -> int:
6+
total = 0
7+
for name, pence in accounts.items():
8+
print(f"{name} had balance {pence}")
9+
total += pence
10+
return total
11+
12+
13+
def format_pence_as_string(total_pence: int) -> str:
14+
if total_pence < 100:
15+
return f"{total_pence}p"
16+
pounds = int(total_pence / 100)
17+
pence = total_pence % 100
18+
return f"£{pounds}.{pence:02d}"
19+
20+
21+
balances = {
22+
"Sima": 700,
23+
"Linn": 545,
24+
"Georg": 831,
25+
}
26+
27+
open_account(balances, "Tobi", 913)
28+
open_account(balances, "Olya", 713)
29+
30+
total_pence = sum_balances(balances)
31+
total_string = format_pence_as_string(total_pence)
32+
33+
print(f"The bank accounts total {total_string}")

Sprint5-exercise/type-guided.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from dataclasses import dataclass
2+
from typing import List
3+
4+
5+
@dataclass(frozen=True)
6+
class Person:
7+
name: str
8+
age: int
9+
preferred_operating_systems: List[str]
10+
11+
12+
@dataclass(frozen=True)
13+
class Laptop:
14+
id: int
15+
manufacturer: str
16+
model: str
17+
screen_size_in_inches: float
18+
operating_system: str
19+
20+
21+
def find_possible_laptops(laptops: List[Laptop], person: Person) -> List[Laptop]:
22+
possible_laptops = []
23+
for laptop in laptops:
24+
25+
if laptop.operating_system in person.preferred_operating_systems:
26+
possible_laptops.append(laptop)
27+
return possible_laptops
28+
29+
30+
people = [
31+
Person(name="Imran", age=22, preferred_operating_systems=["Ubuntu", "Arch Linux"]),
32+
Person(name="Eliza", age=34, preferred_operating_systems=["Arch Linux"]),
33+
]
34+
35+
laptops = [
36+
Laptop(
37+
id=1,
38+
manufacturer="Dell",
39+
model="XPS",
40+
screen_size_in_inches=13,
41+
operating_system="Arch Linux",
42+
),
43+
Laptop(
44+
id=2,
45+
manufacturer="Dell",
46+
model="XPS",
47+
screen_size_in_inches=15,
48+
operating_system="Ubuntu",
49+
),
50+
Laptop(
51+
id=3,
52+
manufacturer="Dell",
53+
model="XPS",
54+
screen_size_in_inches=15,
55+
operating_system="Ubuntu",
56+
),
57+
Laptop(
58+
id=4,
59+
manufacturer="Apple",
60+
model="macBook",
61+
screen_size_in_inches=13,
62+
operating_system="macOS",
63+
),
64+
]
65+
66+
for person in people:
67+
possible_laptops = find_possible_laptops(laptops, person)
68+
print(f"Possible laptops for {person.name}: {possible_laptops}")

0 commit comments

Comments
 (0)