Skip to content

Commit 4afdc9f

Browse files
committed
feat: implement laptop allocation using permutation and sadness matrix
1 parent 4350f48 commit 4afdc9f

1 file changed

Lines changed: 95 additions & 0 deletions

File tree

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
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

Comments
 (0)