1+ from enum import Enum
2+ from typing import List ,Dict
3+ from dataclasses import dataclass
4+
5+ from itertools import permutations
6+ import sys
7+
8+ class OperatingSystem (Enum ):
9+ UBUNTU = "ubuntu"
10+ MACOS = "makos"
11+ ARCH = "arch linux"
12+
13+ @dataclass (frozen = True )
14+ class Person :
15+ name :str
16+ age :int
17+ preferred_operating_system :List [OperatingSystem ]
18+
19+
20+ @dataclass (frozen = True )
21+ class Laptop :
22+ id : int
23+ manufacturer : str
24+ model : str
25+ screen_size_in_inches : float
26+ operating_system : OperatingSystem
27+
28+ def sadness (person :Person ,operating_system :OperatingSystem )-> int :
29+ sad :int = 100
30+ for index , os in enumerate (person .preferred_operating_system ):
31+ if (os == operating_system ):
32+ sad = index
33+ return sad
34+
35+ return sad
36+
37+ def allocate_laptops (people : List [Person ], laptops : List [Laptop ]) -> Dict [Person , Laptop ]:
38+ how_many_people = len (people )
39+ how_many_laptops = len (laptops )
40+ if how_many_laptops < how_many_people :
41+ raise ValueError ("Not enough laptops for all people" )
42+ matrix = [[0 for i in range (how_many_laptops )] for _ in range (how_many_people )]
43+ for i , person in enumerate (people ):
44+ for j ,laptop in enumerate (laptops ):
45+ matrix [i ][j ] = sadness (person ,laptop .operating_system )
46+
47+ best_perm = None
48+ min_sadness = 100000000000
49+ for perm in permutations (range (how_many_laptops )):
50+
51+ total = 0
52+ for i in range (how_many_people ):
53+
54+ total += matrix [i ][perm [i ]]
55+
56+
57+ if total < min_sadness :
58+ min_sadness = total
59+ best_perm = perm
60+ results = {}
61+ for index , person in enumerate (people ):
62+ results [person .name ]= laptops [best_perm [index ]]
63+
64+
65+ return results
66+
67+ def main ()-> None :
68+ people = [
69+ Person (
70+ name = "Imran" ,
71+ age = 22 ,
72+ preferred_operating_system = [OperatingSystem .UBUNTU , OperatingSystem .ARCH ,OperatingSystem .MACOS ],
73+ ),
74+ Person (
75+ name = "Eliza" ,
76+ age = 34 ,
77+ preferred_operating_system = [OperatingSystem .UBUNTU , OperatingSystem .ARCH ],
78+ ),
79+ Person (
80+ name = "Ahmad" ,
81+ age = 34 ,
82+ preferred_operating_system = [OperatingSystem .MACOS ],
83+ ),
84+
85+ ]
86+ laptops = [
87+ Laptop (id = 1 , manufacturer = "Dell" , model = "XPS" , screen_size_in_inches = 13 , operating_system = OperatingSystem .MACOS ),
88+ Laptop (id = 2 , manufacturer = "Dell" , model = "XPS" , screen_size_in_inches = 15 , operating_system = OperatingSystem .MACOS ),
89+ Laptop (id = 3 , manufacturer = "Dell" , model = "XPS" , screen_size_in_inches = 15 , operating_system = OperatingSystem .UBUNTU ),
90+
91+ ]
92+
93+ print (allocate_laptops (people ,laptops ))
94+
95+ main ()
0 commit comments