-
Notifications
You must be signed in to change notification settings - Fork 69
/
final_assignment_algoritmiek_student.py
257 lines (195 loc) · 7.9 KB
/
final_assignment_algoritmiek_student.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Oriëntatie op AI
Final assignment: algoritmiek
(c) 2019 Hogeschool Utrecht,
Tijmen Muller (tijmen.muller@hu.nl)
Opdracht:
Beantwoord onderstaande vragen en werk onderstaande functies uit.
Voeg commentaar toe om je code toe te lichten.
Je kunt je functies testen met het gegeven raamwerk door het bestand
uit te voeren (of met behulp van `pytest`, als je weet hoe dat werkt).
Lever je werk in op Canvas als alle tests slagen.
Let op! Het is niet toegestaan om bestaande modules te importeren en te
gebruiken, zoals `math` en `statistics`.
"""
# TODO: Vul hier je naam, klas en studentnummer in.
naam = ""
klas = ""
studentnummer = -1
"""
1. Sorteeralgoritme
Hieronder staat de pseudocode van een sorteeralgoritme:
1. Startend vanaf het begin van een lijst, vergelijk elk element met zijn volgende buur.
2. Als het element groter is dan zijn volgende buur, verwissel ze van plaats.
3. Doorloop zo de lijst tot het eind.
4. Als er verwisselingen zijn geweest bij stap 2., ga naar stap 1.
1a. Handmatig toepassen
Gegeven is de lijst l = [ 4, 3, 1, 2 ]. Geef de waardes die deze
lijst aanneemt bij álle tussenstappen bij toepassing van
bovenstaand sorteeralgoritme.
"""
# TODO: [geef hier je antwoord]
"""
1b. Implementatie
Implementeer het sorteeralgoritme in Python in een functie
hieronder genaamd my_sort(lst).
Let op: je *moet* de pseudocode volgen!
1c. Best en worst case
- Stel je hebt een lijst met de waarden 1, 2 en 3. Bij welke
volgorde van de waarden in de lijst is het sorteeralgoritme
het snelste klaar (best-case scenario)?
Hoeveel vergelijkingen (zoals beschreven in stap 1. van de
pseudocode) zijn nodig geweest?
"""
# TODO: [geef hier je antwoord]
"""
- Bij welke volgorde van de waarden in de lijst is het
sorteeralgoritme het minst snel klaar (worst-case scenario)?
Hoeveel vergelijkingen zijn nodig geweest?
"""
# TODO: [geef hier je antwoord]
"""
- Stel je hebt een lijst met de waarden 1 tot en met 4.
Wat is nu het best-case scenario?
Hoeveel vergelijkingen zijn er nodig?
En wat is nu het worst-case scenario?
Hoeveel vergelijkingen zijn er nodig?
"""
# TODO: [geef hier je antwoord]
"""
- (Optioneel) Stel je hebt een lijst met de waarden 1 tot en met n
(je weet nu dus niet precies hoeveel waarden er in de lijst
zitten, het zijn er 'n').
Wat is nu het best-case scenario?
Hoeveel vergelijkingen zijn er nodig?
En wat is nu het worst-case scenario?
Hoeveel vergelijkingen zijn er nodig?
"""
# TODO: [geef hier je antwoord]
"""
"""
def my_sort(lst):
"""
Sorteer gegeven lijst volgens het algoritme zoals beschreven in de pseudocode.
1. Startend vanaf het begin van een lijst, vergelijk elk element met zijn volgende buur.
2. Als het element groter is dan zijn volgende buur, verwissel ze van plaats.
3. Doorloop zo de lijst tot het eind.
4. Als er verwisselingen zijn geweest bij stap 2., ga naar stap 1.
Zorg dat de gegeven lijst niet verandert, maar geef een nieuwe, gesorteerde variant van de lijst terug.
Args:
lst (list): Een lijst met elementen van gelijk type, bijvoorbeeld gehele getallen.
Returns:
list: Een nieuwe, gesorteerde variant van lijst `lst`.
"""
lst_sorted = None
return lst_sorted
def linear_search_recursive(lst, target):
"""
Zoek een element in de gegeven lijst door middel van recursief lineair zoeken.
Zorg dat de inhoud van de gegeven lijst niet verandert.
Args:
lst (list): Een lijst met elementen van gelijk type, bijvoorbeeld gehele getallen.
target (int): Het gezochte element.
Returns:
bool: Of het element in de lijst voorkomt.
"""
return False
def rekenkundige_rij_element(n, a_0, c):
"""
Bepaal de waarde van element met index n van een rekenkundige rij op recursieve wijze.
Args:
n (int): De index van de gezochte waarde.
a_0 (int): Het getal waar de rij mee begint.
c (int): De stapgrootte van de rij.
Returns:
int: De waarde van element a_n.
"""
return 0
"""
==========================[ HU TESTRAAMWERK ]================================
Onderstaand staan de tests voor je code -- hieronder mag je niets wijzigen!
Je kunt je code testen door deze file te runnen of met behulp van pytest.
"""
import random
def __my_assert_args(function, args, expected_output, check_type=True):
"""
Controleer of gegeven functie met gegeven argumenten het verwachte resultaat oplevert.
Optioneel wordt ook het return-type gecontroleerd.
"""
argstr = str(args).replace(',)', ')')
output = function(*args)
# Controleer eerst het return-type (optioneel)
if check_type:
msg = f"Fout: {function.__name__}{argstr} geeft geen {type(expected_output)} terug als return-type"
assert type(output) is type(expected_output), msg
# Controleer of de functie-uitvoer overeenkomt met de gewenste uitvoer
msg = f"Fout: {function.__name__}{argstr} geeft {output} in plaats van {expected_output}"
if type(expected_output) is float:
# Vergelijk bij float als return-type op 7 decimalen om afrondingsfouten te omzeilen
assert round(output - expected_output, 7) == 0, msg
else:
assert output == expected_output, msg
def test_id():
assert naam != "", "Je moet je naam nog invullen!"
assert studentnummer != -1, "Je moet je studentnummer nog invullen!"
assert klas != "", "Je moet je klas nog invullen!"
def test_my_sort():
lst_test = random.choices(range(-99, 100), k=6)
lst_copy = lst_test.copy()
lst_output = my_sort(lst_test)
assert lst_copy == lst_test, "Fout: my_sort(lst) verandert de inhoud van lijst lst"
assert lst_output == sorted(lst_test), \
f"Fout: my_sort({lst_test}) geeft {lst_output} in plaats van {sorted(lst_test)}"
def test_linear_search_recursive():
for _ in range(10):
lst_test = random.sample(range(20), 6)
target = random.randrange(20)
found = target in lst_test
lst_copy = lst_test.copy()
outcome = linear_search_recursive(lst_test, target)
assert lst_copy == lst_test, "Fout: linear_search_recursive(lst, target) verandert de inhoud van lijst lst"
assert outcome == found, \
f"Fout: linear_search_recursive({lst_test}, {target}) geeft {outcome} in plaats van {found}"
def test_rekenkundige_rij_element():
testcases = [
((0, 0, 0), 0),
((0, 1, 5), 1),
((0, 5, 1), 5),
((1, 1, 5), 6),
((1, 5, 5), 10),
((5, 1, 5), 26),
((5, 5, 1), 10),
((5, 5, 2), 15),
((5, 5, 5), 30),
]
for case in testcases:
__my_assert_args(rekenkundige_rij_element, case[0], case[1])
return 1
def __main():
""" Test alle functies. """
# Noodzakelijk voor gekleurde tekst binnen een Windows terminal
import os
os.system("")
try:
print("\x1b[32m") # Groene tekstkleur
test_id()
test_my_sort()
print("Je functie my_sort() werkt goed!")
test_linear_search_recursive()
print("Je functie linear_search_recursive() werkt goed!")
test_rekenkundige_rij_element()
print("Je functie rekenkundige_rij_element() werkt goed!")
print("\nGefeliciteerd, alles lijkt te werken!")
print("Lever je werk nu in op Canvas...")
except AssertionError as ae:
print("\x1b[31m") # Rode tekstkleur
if not ae:
print("Je code veroorzaakt onderstaande AssertionError:")
raise ae
else:
print(ae)
print("\x1b[0m") # Reset tekstkleur
if __name__ == '__main__':
__main()