@@ -19,7 +19,7 @@ class Person:
1919 name : str
2020 age : int
2121 # Sorted in order of preference, most preferred is first.
22- preferred_operating_system : List [ OperatingSystem ]
22+ preferred_operating_system : tuple
2323
2424
2525@dataclass (frozen = True )
@@ -31,7 +31,7 @@ class Laptop:
3131 operating_system : OperatingSystem
3232
3333# ============================================================================
34- # HELPER FUNCTIONS
34+ # HELPER FUNCTION
3535# ============================================================================
3636"""
3737 Calculates how "sad" a person would be with a given laptop allocation.
@@ -50,12 +50,6 @@ class Laptop:
5050 Returns:
5151 An integer representing sadness (0 = most happy, 100 = not in preferences)
5252 """
53- def find_preferred_laptops (person :Person , laptops : List [Laptop ]) -> list [Laptop ]:
54- preferred_laptops = []
55- for laptop in laptops :
56- if laptop .operating_system in person .preferred_operating_system :
57- preferred_laptops .append (laptop )
58- return preferred_laptops
5953
6054def calculate_sadness (person :Person , laptop :Laptop )-> int :
6155 if laptop .operating_system in person .preferred_operating_system :
@@ -90,23 +84,47 @@ def calculate_sadness(person:Person, laptop:Laptop)-> int:
9084]
9185
9286people = [
93- Person (name = "Imran" , age = 22 , preferred_operating_system = [ OperatingSystem .UBUNTU , OperatingSystem .MACOS ] ),
94- Person (name = "Eliza" , age = 34 , preferred_operating_system = [ OperatingSystem .ARCH , OperatingSystem .UBUNTU ] ),
95- Person (name = "Marcus" , age = 28 , preferred_operating_system = [ OperatingSystem .MACOS , OperatingSystem .UBUNTU ] ),
96- Person (name = "Sofia" , age = 31 , preferred_operating_system = [ OperatingSystem .UBUNTU ] ),
97- Person (name = "James" , age = 25 , preferred_operating_system = [ OperatingSystem .ARCH , OperatingSystem .MACOS ] ),
98- Person (name = "Nina" , age = 29 , preferred_operating_system = [ OperatingSystem .MACOS , OperatingSystem .ARCH , OperatingSystem .UBUNTU ] ),
87+ Person (name = "Imran" , age = 22 , preferred_operating_system = ( OperatingSystem .UBUNTU , OperatingSystem .MACOS ) ),
88+ Person (name = "Eliza" , age = 34 , preferred_operating_system = ( OperatingSystem .ARCH , OperatingSystem .UBUNTU ) ),
89+ Person (name = "Marcus" , age = 28 , preferred_operating_system = ( OperatingSystem .MACOS , OperatingSystem .UBUNTU ) ),
90+ Person (name = "Sofia" , age = 31 , preferred_operating_system = ( OperatingSystem .UBUNTU ,) ),
91+ Person (name = "James" , age = 25 , preferred_operating_system = ( OperatingSystem .ARCH , OperatingSystem .MACOS ) ),
92+ Person (name = "Nina" , age = 29 , preferred_operating_system = ( OperatingSystem .MACOS , OperatingSystem .ARCH , OperatingSystem .UBUNTU ) ),
9993]
10094
10195
10296
10397# ============================================================================
10498# TESTING
10599# ============================================================================
106- # Test the helper functions
107- for person in people :
108- print (f"\n { person .name } 's preferences: { [os .value for os in person .preferred_operating_system ]} " )
109- for laptop in laptops :
110- sadness = calculate_sadness (person , laptop )
111- print (f"Laptop { laptop .id } ({ laptop .operating_system .value } ): sadness = { sadness } " )
112-
100+
101+ def allocate_laptops (people : List [Person ], laptops : List [Laptop ]) -> Dict [Person ,Laptop ]:
102+ result = {}
103+ available_laptops = laptops .copy ()
104+
105+ for person in people :
106+ smallest_sadness = float ("inf" )
107+ best_laptop = None
108+
109+ for laptop in available_laptops :
110+ sadness = calculate_sadness (person , laptop )
111+ if sadness < smallest_sadness :
112+ smallest_sadness = sadness
113+ best_laptop = laptop
114+
115+ result [person ]= best_laptop
116+ available_laptops .remove (best_laptop )
117+
118+ return result
119+
120+ allocate_laptops (people , laptops )
121+ allocation = allocate_laptops (people , laptops )
122+
123+ print ("\n " + "=" * 50 )
124+ print ("FINAL ALLOCATION:" )
125+ print ("=" * 50 )
126+ for person , laptop in allocation .items ():
127+ print (f"{ person .name } : { laptop .manufacturer } { laptop .model } ({ laptop .operating_system .value } )" )
128+
129+
130+
0 commit comments