11from dataclasses import dataclass
22from enum import Enum
3- from typing import Dict , List
3+ from typing import Dict , List , Optional
44
55class 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