@@ -16,6 +16,9 @@ class Person:
1616 # Sorted in order of preference, most preferred is first.
1717 preferred_operating_system : List [OperatingSystem ]
1818
19+ def __hash__ (self ):
20+ return hash ((self .name , self .age , tuple (self .preferred_operating_system )))
21+
1922
2023@dataclass (frozen = True )
2124class Laptop :
@@ -56,18 +59,55 @@ class Laptop:
5659 operating_system = OperatingSystem .MACOS ,
5760 ),
5861]
62+ users = [
63+ Person (
64+ name = "Andrei" ,
65+ age = 20 ,
66+ preferred_operating_system = [OperatingSystem .MACOS , OperatingSystem .UBUNTU ],
67+ ),
68+ Person (
69+ name = "Eyuel" ,
70+ age = 20 ,
71+ preferred_operating_system = [
72+ OperatingSystem .MACOS ,
73+ OperatingSystem .UBUNTU ,
74+ OperatingSystem .ARCH ,
75+ ],
76+ ),
77+ Person (
78+ name = "Priscilla" ,
79+ age = 30 ,
80+ preferred_operating_system = [OperatingSystem .ARCH , OperatingSystem .UBUNTU ],
81+ ),
82+ Person (
83+ name = "Miki" ,
84+ age = 21 ,
85+ preferred_operating_system = [OperatingSystem .MACOS , OperatingSystem .UBUNTU ],
86+ ),
87+ ]
88+
89+ sadness = 0
5990
6091
6192def allocate_laptops (
6293 people : List [Person ], laptops : List [Laptop ]
6394) -> dict [Person , Laptop ]:
6495 allocation = {}
96+ global sadness
6597 laptops_copy = laptops .copy ()
6698 for person in people :
67- for laptop in laptops_copy :
68- for index in range (len (person .preferred_operating_system )):
69- if laptop .operating_system == person .preferred_operating_system :
99+ for index in range (len (person .preferred_operating_system )):
100+ if person in allocation :
101+ break
102+ for laptop in laptops_copy :
103+ if laptop .operating_system == person .preferred_operating_system [index ]:
70104 allocation [person ] = laptop
71- # elif
105+ laptops_copy .remove (laptop )
106+ sadness += index
107+ break
108+ elif laptop .operating_system != person .preferred_operating_system [
109+ index
110+ ] and index + 1 == len (person .preferred_operating_system ):
111+ sadness += 100
72112
73113 return allocation
0 commit comments