Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
prm2
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Martin Mareš
prm2
Commits
f3921c69
Commit
f3921c69
authored
5 years ago
by
Martin Mareš
Browse files
Options
Downloads
Patches
Plain Diff
Seznamy: Šablona a testy k ReCodExovému úkolu na seznamy
parent
8a275944
No related branches found
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
05-seznamy/sorted_list.py
+73
-0
73 additions, 0 deletions
05-seznamy/sorted_list.py
05-seznamy/sorted_list_test.py
+183
-0
183 additions, 0 deletions
05-seznamy/sorted_list_test.py
with
256 additions
and
0 deletions
05-seznamy/sorted_list.py
0 → 100644
+
73
−
0
View file @
f3921c69
#!/usr/bin/python3
# Jednosměrné uspořádané seznamy
# Na místa komentářů TODO doplňte svůj kód.
import
sys
class
Node
:
def
__init__
(
self
,
x
):
# Každy prvek si pamatuje hodnotu a následníka
self
.
value
=
x
self
.
next
=
None
class
SortedList
:
def
__init__
(
self
):
# Seznam si pamatuje odkaz na svůj první prvek
self
.
first
=
None
def
insert
(
self
,
x
):
"""
Zatřídí do seznamu nový prvek se zadanou hodnotou.
Pokud už takový prvek je, neudělá nic.
"""
# TODO
pass
def
delete
(
self
,
x
):
"""
Odstraní ze seznamu prvek se zadanou hodnotou.
Pokud tam žádný takový prvek není, neudělá nic.
"""
# TODO
pass
def
pred
(
self
,
x
):
"""
Vrátí předchůdce čísla x, tedy největší prvek seznamu,
který je ostře menší než x. Není-li takový, vrátí None.
"""
# TODO
return
None
def
succ
(
self
,
x
):
"""
Vrátí následníka čísla x, tedy nejmenší prvek seznamu,
který je ostře větší než x. Není-li takový, vrátí None.
"""
# TODO
return
None
def
to_python_list
(
self
):
"""
Převede náš seznam na pythoní seznam.
"""
out
=
[]
this
=
self
.
first
while
this
:
out
.
append
(
this
.
value
)
this
=
this
.
next
return
out
def
print
(
self
):
"""
Vypíše seznam.
"""
print
(
self
.
to_python_list
())
This diff is collapsed.
Click to expand it.
05-seznamy/sorted_list_test.py
0 → 100755
+
183
−
0
View file @
f3921c69
#!/usr/bin/env python3
import
sys
import
random
from
sorted_list
import
SortedList
# Jak velký test chceme?
n
=
1000
def
expect_items
(
sorted_list
,
elements
):
"""
Zkontroluje, zda sorted_list obsahuje danou posloupnost prvků.
"""
this
=
sorted_list
.
first
for
x
in
elements
:
assert
this
,
"
Nalezen konec seznamu místo prvku {}
"
.
format
(
x
)
assert
this
.
value
==
x
,
"
Nalezen prvke {} místo {}
"
.
format
(
this
.
value
,
x
)
this
=
this
.
next
assert
not
this
,
"
Nalezen nadbytečný prvek {} na konci seznamu
"
.
format
(
this
.
value
)
def
test_insert_increasing
():
"""
Vloží prvky v rostoucím pořadí.
"""
s
=
SortedList
()
for
i
in
range
(
n
):
s
.
insert
(
i
)
expect_items
(
s
,
range
(
n
))
return
s
def
test_insert_decreasing
():
"""
Vloží prvky v klesajícím pořadí.
"""
s
=
SortedList
()
for
i
in
reversed
(
range
(
n
)):
s
.
insert
(
i
)
expect_items
(
s
,
range
(
n
))
def
test_insert_random
():
"""
Vloží prvky v náhodném pořádí.
"""
random
.
seed
(
42
)
s
=
SortedList
()
for
i
in
random
.
sample
(
range
(
n
),
k
=
n
):
s
.
insert
(
i
)
expect_items
(
s
,
range
(
n
))
def
test_delete_odd
():
"""
Smaže liché prvky.
"""
s
=
test_insert_increasing
()
for
i
in
range
(
n
):
if
i
%
2
==
1
:
s
.
delete
(
i
)
expect_items
(
s
,
[
i
for
i
in
range
(
n
)
if
i
%
2
==
0
])
def
test_delete_increasing
():
"""
Smaže všechny prvky v rostoucím pořadí.
"""
s
=
test_insert_increasing
()
for
i
in
range
(
n
):
s
.
delete
(
i
)
expect_items
(
s
,
[])
def
test_delete_decreasing
():
"""
Smaže všechny prvky v klesajícím pořadí.
"""
s
=
test_insert_increasing
()
for
i
in
reversed
(
range
(
n
)):
s
.
delete
(
i
)
expect_items
(
s
,
[])
def
test_delete_random
():
"""
Smaže všechny prvky v náhodném pořadí.
"""
s
=
test_insert_increasing
()
# Zamícháme range(n) a rozdělíme na dvě části
random
.
seed
(
42
)
shuffled
=
random
.
sample
(
range
(
n
),
k
=
n
)
first
=
shuffled
[:
n
//
2
]
second
=
shuffled
[
n
//
2
:]
# Smažeme první část
for
i
in
first
:
s
.
delete
(
i
)
expect_items
(
s
,
sorted
(
second
))
# A pak i druhou
for
i
in
second
:
s
.
delete
(
i
)
expect_items
(
s
,
[])
def
test_ins_del_multiple
():
"""
Zkontroluje, že opakovaný insert/delete nic nedělá.
"""
s
=
SortedList
()
for
i
in
range
(
n
):
s
.
insert
(
i
)
for
i
in
range
(
n
):
s
.
insert
(
i
)
expect_items
(
s
,
range
(
n
))
for
i
in
range
(
n
):
s
.
delete
(
i
)
for
i
in
range
(
n
):
s
.
delete
(
i
)
expect_items
(
s
,
[])
def
test_pred_succ_present
():
"""
Zkontroluje předchůdce a následníky přítomných prvků.
"""
s
=
SortedList
()
for
i
in
range
(
0
,
10
*
n
,
10
):
s
.
insert
(
i
)
expect_items
(
s
,
range
(
0
,
10
*
n
,
10
))
for
i
in
range
(
0
,
10
*
n
,
10
):
pr
=
s
.
pred
(
i
)
if
i
==
0
:
assert
pr
is
None
,
"
Předchůdce prvku {} má být None, nikoliv {}
"
.
format
(
i
,
pr
)
else
:
assert
pr
==
i
-
10
,
"
Předchůdce prvku {} má být {}, nikoliv {}
"
.
format
(
i
,
i
-
10
,
pr
)
su
=
s
.
succ
(
i
)
if
i
==
10
*
(
n
-
1
):
assert
su
is
None
,
"
Následník prvku {} má být None, nikoliv {}
"
.
format
(
i
,
su
)
else
:
assert
su
==
i
+
10
,
"
Následník prvku {} má být {}, nikoliv {}
"
.
format
(
i
,
i
+
10
,
su
)
def
test_pred_succ_missing
():
"""
Zkontroluje předchůdce a následníky nepřítomných prvků.
"""
s
=
SortedList
()
for
i
in
range
(
0
,
10
*
n
,
10
):
s
.
insert
(
i
)
expect_items
(
s
,
range
(
0
,
10
*
n
,
10
))
for
i
in
range
(
-
5
,
10
*
n
,
10
):
pr
=
s
.
pred
(
i
)
if
i
<
0
:
assert
pr
is
None
,
"
Předchůdce prvku {} má být None, nikoliv {}
"
.
format
(
i
,
pr
)
else
:
assert
pr
==
i
-
5
,
"
Předchůdce prvku {} má být {}, nikoliv {}
"
.
format
(
i
,
i
-
5
,
pr
)
su
=
s
.
succ
(
i
)
if
i
>
10
*
(
n
-
1
):
assert
su
is
None
,
"
Následník prvku {} má být None, nikoliv {}
"
.
format
(
i
,
su
)
else
:
assert
su
==
i
+
5
,
"
Následník prvku {} má být {}, nikoliv {}
"
.
format
(
i
,
i
+
5
,
su
)
tests
=
[
(
"
insert_increasing
"
,
test_insert_increasing
),
(
"
insert_decreasing
"
,
test_insert_decreasing
),
(
"
insert_random
"
,
test_insert_random
),
(
"
delete_odd
"
,
test_delete_odd
),
(
"
delete_increasing
"
,
test_delete_increasing
),
(
"
delete_decreasing
"
,
test_delete_decreasing
),
(
"
delete_random
"
,
test_delete_random
),
(
"
ins_del_multiple
"
,
test_ins_del_multiple
),
(
"
pred_succ_present
"
,
test_pred_succ_present
),
(
"
pred_succ_missing
"
,
test_pred_succ_missing
),
]
if
__name__
==
"
__main__
"
:
for
required_test
in
sys
.
argv
[
1
:]
or
[
name
for
name
,
_
in
tests
]:
for
name
,
test
in
tests
:
if
name
==
required_test
:
print
(
"
Spouštím test {}
"
.
format
(
name
),
file
=
sys
.
stderr
)
test
()
break
else
:
raise
ValueError
(
"
Neznámý test {}
"
.
format
(
name
))
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment