1+ from dataclasses import dataclass
2+ from enum import Enum
3+ from typing import List
4+ import sys
5+ from collections import Counter
6+
7+ class OperatingSystem (Enum ):
8+ MACOS = "macOS"
9+ ARCH = "Arch Linux"
10+ UBUNTU = "Ubuntu"
11+
12+ @dataclass (frozen = True )
13+ class Person :
14+ name : str
15+ age : int
16+ preferred_operating_system : OperatingSystem
17+
18+
19+ @dataclass (frozen = True )
20+ class Laptop :
21+ id : int
22+ manufacturer : str
23+ model : str
24+ screen_size_in_inches : float
25+ operating_system : OperatingSystem
26+
27+ name = input ("Insert your name :" )
28+ if len (name )== 0 :
29+ print ("Name cannot be empty!" , file = sys .stderr )
30+ exit (1 )
31+ elif len (name )> 50 :
32+ print ("Name is too long!" , file = sys .stderr )
33+ exit (1 )
34+ try :
35+ age = int (input ("Insert your age :" ))
36+ if age < 18 or age > 100 :
37+ raise ValueError ("Age out of range" )
38+ except ValueError as e :
39+ print (f"Invalid age: { e } " , file = sys .stderr )
40+ sys .exit (1 )
41+ preferred_os = input ("Insert your preferred_operating_system(macOS,Arch Linux,Ubuntu) :" )
42+ try :
43+ preferred_operating_system = OperatingSystem (preferred_os )
44+ except ValueError :
45+ print ("error in os name" ,file = sys .stderr )
46+ sys .exit (1 )
47+
48+ person = Person (name ,age ,preferred_operating_system )
49+
50+ def find_possible_laptops (laptops : List [Laptop ], person : Person ) -> List [Laptop ]:
51+ possible_laptops = []
52+ for laptop in laptops :
53+ if laptop .operating_system == person .preferred_operating_system :
54+ possible_laptops .append (laptop )
55+ return possible_laptops
56+
57+
58+ laptops = [
59+ Laptop (id = 1 , manufacturer = "Dell" , model = "XPS" , screen_size_in_inches = 13 , operating_system = OperatingSystem .ARCH ),
60+ Laptop (id = 2 , manufacturer = "Dell" , model = "XPS" , screen_size_in_inches = 15 , operating_system = OperatingSystem .UBUNTU ),
61+ Laptop (id = 3 , manufacturer = "Dell" , model = "XPS" , screen_size_in_inches = 15 , operating_system = OperatingSystem .UBUNTU ),
62+ Laptop (id = 4 , manufacturer = "Apple" , model = "macBook" , screen_size_in_inches = 13 , operating_system = OperatingSystem .MACOS ),
63+ Laptop (id = 5 , manufacturer = "Dell" , model = "XPS" , screen_size_in_inches = 13 , operating_system = OperatingSystem .ARCH ),
64+ ]
65+
66+ os_count = Counter (laptop .operating_system for laptop in laptops )
67+ max_count = max (os_count .values ())
68+ print (max_count )
69+ most_available_os = []
70+ for os in os_count :
71+ count = os_count [os ]
72+ if count == max_count :
73+ most_available_os .append (os .value )
74+ print (most_available_os )
75+ possible_laptops = find_possible_laptops (laptops , person )
76+ print (f"Count of available { person .preferred_operating_system .value } laptops for { person .name } is : { len (possible_laptops )} " )
77+
78+ if len (possible_laptops )< max_count :
79+ print (f"Note: If you are willing to accept : { " or " .join (most_available_os )} , you are more likely to get a laptop." )
0 commit comments