tangled
alpha
login
or
join now
thecoded.prof
/
CMU
0
fork
atom
CMU Coding Bootcamp
0
fork
atom
overview
issues
pulls
pipelines
feat: oct10 Rooms challenge
thecoded.prof
5 months ago
e6c70271
e3c84be5
verified
This commit was signed with the committer's
known signature
.
thecoded.prof
SSH Key Fingerprint:
SHA256:ePn0u8NlJyz3J4Zl9MHOYW3f4XKoi5K1I4j53bwpG0U=
+204
1 changed file
expand all
collapse all
unified
split
python
oct10
Rooms
main.py
+204
python/oct10/Rooms/main.py
···
1
1
+
from typing import override
2
2
+
3
3
+
4
4
+
class Room:
5
5
+
name: str
6
6
+
length: float
7
7
+
width: float
8
8
+
9
9
+
def __init__(self, name: str, length: float, width: float):
10
10
+
self.name = name
11
11
+
self.length = length
12
12
+
self.width = width
13
13
+
14
14
+
@override
15
15
+
def __repr__(self) -> str:
16
16
+
return f"Room({self.length}'x{self.width}' {self.name})"
17
17
+
18
18
+
def getArea(self) -> float:
19
19
+
return self.length * self.width
20
20
+
21
21
+
22
22
+
class Floor:
23
23
+
name: str
24
24
+
room_map: dict[str, Room]
25
25
+
26
26
+
def __init__(self, name: str):
27
27
+
self.name = name
28
28
+
self.room_map = dict()
29
29
+
30
30
+
@override
31
31
+
def __repr__(self) -> str:
32
32
+
return f"Floor({self.name} with {len(self.room_map)} room(s))"
33
33
+
34
34
+
def addRoom(self, room: Room) -> None:
35
35
+
if room.name in self.room_map:
36
36
+
raise LookupError(f"{room.name} already exists on this floor")
37
37
+
else:
38
38
+
self.room_map[room.name] = room
39
39
+
40
40
+
def getRoomCount(self) -> int:
41
41
+
return len(self.room_map)
42
42
+
43
43
+
def getRoom(self, name: str) -> Room | None:
44
44
+
return self.room_map.get(name, None)
45
45
+
46
46
+
def getRoomNames(self) -> list[str]:
47
47
+
return sorted(self.room_map.keys())
48
48
+
49
49
+
def getArea(self) -> float:
50
50
+
return sum([r.getArea() for r in self.room_map.values()])
51
51
+
52
52
+
53
53
+
class House:
54
54
+
floors: dict[str, Floor]
55
55
+
56
56
+
def __init__(self) -> None:
57
57
+
self.floors = dict()
58
58
+
59
59
+
@override
60
60
+
def __repr__(self) -> str:
61
61
+
return f"House({self.getFloorCount()} floor(s), {self.getRoomCount()} room(s), {self.getArea()} sq feet)"
62
62
+
63
63
+
def addFloor(self, floor: Floor) -> None:
64
64
+
if floor.name in self.floors:
65
65
+
raise LookupError(f"{floor.name} already exists on this floor")
66
66
+
else:
67
67
+
self.floors[floor.name] = floor
68
68
+
69
69
+
def getFloorCount(self) -> int:
70
70
+
return len(self.floors)
71
71
+
72
72
+
def getRoomCount(self) -> int:
73
73
+
return sum([f.getRoomCount() for f in self.floors.values()])
74
74
+
75
75
+
def getArea(self) -> float:
76
76
+
return sum([f.getArea() for f in self.floors.values()])
77
77
+
78
78
+
def getRoomFloor(self, room_name: str) -> Floor | None:
79
79
+
for floor in self.floors.values():
80
80
+
if room_name in floor.getRoomNames():
81
81
+
return floor
82
82
+
else:
83
83
+
return None
84
84
+
85
85
+
def getRoom(self, room_name: str) -> Room | None:
86
86
+
floor = self.getRoomFloor(room_name)
87
87
+
if floor == None:
88
88
+
return None
89
89
+
else:
90
90
+
return floor.getRoom(room_name)
91
91
+
92
92
+
93
93
+
def testLevel1():
94
94
+
print("Testing Level 1 (Core) material...", end="")
95
95
+
96
96
+
# Note: a Room represents a room, on a Floor, in a House.
97
97
+
98
98
+
room1 = Room("Living Room", 15, 15) # name, length, width
99
99
+
assert str(room1) == "Room(15'x15' Living Room)"
100
100
+
assert str([room1]) == "[Room(15'x15' Living Room)]"
101
101
+
assert room1.getArea() == 225 # 15 * 15
102
102
+
103
103
+
room2 = Room("Kitchen", 10, 20)
104
104
+
assert str(room2) == "Room(10'x20' Kitchen)"
105
105
+
assert room2.getArea() == 200 # 10 * 20
106
106
+
107
107
+
# Notes:
108
108
+
# * Each Floor can contain 0 or more rooms.
109
109
+
# * Store the rooms in floor.roomMap, which is a dictionary
110
110
+
# mapping the room name to the room instance.
111
111
+
# * Do not store a floor's roomCount or roomNames separately.
112
112
+
# Instead, compute these based on the keys in floor.roomMap.
113
113
+
114
114
+
floor1 = Floor("1st Floor")
115
115
+
assert str(floor1) == "Floor(1st Floor with 0 room(s))"
116
116
+
assert floor1.getRoomCount() == 0
117
117
+
assert floor1.getRoomNames() == []
118
118
+
assert floor1.getArea() == 0
119
119
+
120
120
+
floor1.addRoom(room1)
121
121
+
assert str(floor1) == "Floor(1st Floor with 1 room(s))"
122
122
+
assert floor1.getRoomCount() == 1
123
123
+
assert floor1.getRoomNames() == ["Living Room"]
124
124
+
assert floor1.getArea() == 225
125
125
+
126
126
+
floor1.addRoom(room2)
127
127
+
assert str(floor1) == "Floor(1st Floor with 2 room(s))"
128
128
+
assert floor1.getRoomCount() == 2
129
129
+
130
130
+
# Note that getRoomNames returns a *sorted* list of room names:
131
131
+
assert floor1.getRoomNames() == ["Kitchen", "Living Room"]
132
132
+
assert floor1.getArea() == 425
133
133
+
134
134
+
# We will try to add the Kitchen room again.
135
135
+
# We are not allowed to add the same room twice,
136
136
+
# nor even two rooms with the same name on any floor.
137
137
+
error = None
138
138
+
try:
139
139
+
floor1.addRoom(room2)
140
140
+
except Exception as e:
141
141
+
error = str(e)
142
142
+
assert error == "Kitchen already exists on this floor"
143
143
+
144
144
+
assert floor1.getRoom("Living Room") == room1
145
145
+
assert floor1.getRoom("Kitchen") == room2
146
146
+
assert floor1.getRoom("Study") == None
147
147
+
148
148
+
room3 = Room("Attic", 20, 30)
149
149
+
assert str(room3) == "Room(20'x30' Attic)"
150
150
+
assert room3.getArea() == 600 # 20 * 30
151
151
+
152
152
+
floor2 = Floor("2nd Floor")
153
153
+
floor2.addRoom(room3)
154
154
+
assert str(floor2) == "Floor(2nd Floor with 1 room(s))"
155
155
+
assert floor2.getArea() == 600 # 20 * 30
156
156
+
print("Passed!")
157
157
+
158
158
+
159
159
+
def testLevel2():
160
160
+
print("Testing Level 2+ (Not Core) material...", end="")
161
161
+
room1 = Room("Living Room", 15, 15)
162
162
+
room2 = Room("Kitchen", 10, 20)
163
163
+
floor1 = Floor("1st Floor")
164
164
+
floor1.addRoom(room1)
165
165
+
floor1.addRoom(room2)
166
166
+
room3 = Room("Attic", 20, 30)
167
167
+
floor2 = Floor("2nd Floor")
168
168
+
floor2.addRoom(room3)
169
169
+
170
170
+
house = House()
171
171
+
assert house.getFloorCount() == 0
172
172
+
assert house.getRoomCount() == 0
173
173
+
assert house.getArea() == 0
174
174
+
assert str(house) == "House(0 floor(s), 0 room(s), 0 sq feet)"
175
175
+
176
176
+
house.addFloor(floor1)
177
177
+
assert house.getFloorCount() == 1
178
178
+
assert house.getRoomCount() == 2
179
179
+
assert house.getArea() == 425
180
180
+
assert str(house) == "House(1 floor(s), 2 room(s), 425 sq feet)"
181
181
+
182
182
+
house.addFloor(floor2)
183
183
+
assert str(house) == "House(2 floor(s), 3 room(s), 1025 sq feet)"
184
184
+
185
185
+
assert house.getFloorCount() == 2
186
186
+
assert house.getRoomCount() == 3
187
187
+
assert house.getArea() == 1025
188
188
+
189
189
+
assert house.getRoomFloor("Kitchen") == floor1
190
190
+
assert house.getRoomFloor("Attic") == floor2
191
191
+
assert house.getRoomFloor("Study") == None
192
192
+
193
193
+
assert house.getRoom("Kitchen") == room2
194
194
+
assert house.getRoom("Attic") == room3
195
195
+
assert house.getRoom("Study") == None
196
196
+
print("Passed!")
197
197
+
198
198
+
199
199
+
def main():
200
200
+
testLevel1()
201
201
+
testLevel2()
202
202
+
203
203
+
204
204
+
main()