Skip to content

Commit db24952

Browse files
committed
improve laptop allocation efficiency
1 parent 2d416f3 commit db24952

1 file changed

Lines changed: 18 additions & 11 deletions

File tree

allocate_laptop.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from dataclasses import dataclass
22
from enum import Enum
3-
from typing import Dict, List
3+
from typing import Dict, List, Optional
44

55
class OperatingSystem(Enum):
66
MACOS = "macOS"
@@ -28,24 +28,32 @@ class Laptop:
2828
operating_system: OperatingSystem
2929

3030

31-
def allocate_laptops(people: List[Person], laptops: List[Laptop]) -> Dict[Person, Laptop]:
32-
allocations: Dict[Person, Laptop] = {}
31+
def allocate_laptops(people: List[Person], laptops: List[Laptop]) -> Dict[Person, Optional[Laptop]]:
32+
allocations: Dict[Person, Optional[Laptop]] = {}
3333
available_laptops = laptops.copy()
3434

3535
for person in people:
36-
# Find laptop that gives this person minimum sadness
37-
if available_laptops:
38-
best_laptop = min(available_laptops, key=lambda l: calculate_sadness(person, l))
39-
allocations[person] = best_laptop
40-
available_laptops.remove(best_laptop) # Laptop now allocated
36+
allocated = None
37+
for preferred_os in person.preferred_operating_system:
38+
for laptop in available_laptops:
39+
if laptop.operating_system == preferred_os:
40+
allocated = laptop
41+
break
42+
if allocated:
43+
break
44+
45+
if allocated:
46+
47+
allocations[person] = allocated
48+
available_laptops.remove(allocated)
4149
else:
4250
# No laptops left, assign None or a “dummy” Laptop with sadness 100
4351
allocations[person] = None
4452

4553
return allocations
4654

4755

48-
def calculate_sadness(person: Person, laptop: Laptop) -> int:
56+
def calculate_sadness(person: Person, laptop: Optional[Laptop]) -> int:
4957
"""Return sadness for a person if given this laptop."""
5058
if laptop is None:
5159
return 100 # no laptop, maximum sadness
@@ -84,5 +92,4 @@ def calculate_sadness(person: Person, laptop: Laptop) -> int:
8492
print(f"{person.name} got {laptop.manufacturer} {laptop.model} ({laptop.operating_system.value}) "
8593
f"→ Sadness: {calculate_sadness(person, laptop)}")
8694
else:
87-
print(f"{person.name} got no laptop → Sadness: 100")
88-
95+
print(f"{person.name} got no laptop → Sadness: 100")

0 commit comments

Comments
 (0)