Izpit
This commit is contained in:
parent
9c7cce4d3c
commit
a346db83ef
373
izpit/naloga.py
Executable file
373
izpit/naloga.py
Executable file
|
@ -0,0 +1,373 @@
|
||||||
|
from collections import Counter, defaultdict
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
import warnings
|
||||||
|
import random
|
||||||
|
|
||||||
|
|
||||||
|
def get_dolzine(zemljevid):
|
||||||
|
return [x2 - x1 + 1 for (x1, x2, y) in zemljevid]
|
||||||
|
|
||||||
|
|
||||||
|
def nabava(stari, novi):
|
||||||
|
nove_dolzine = get_dolzine(novi)
|
||||||
|
for d in get_dolzine(stari):
|
||||||
|
if d in nove_dolzine:
|
||||||
|
nove_dolzine.remove(d)
|
||||||
|
|
||||||
|
return Counter(nove_dolzine)
|
||||||
|
|
||||||
|
|
||||||
|
def rekonstrukcija(kocke):
|
||||||
|
ovire = []
|
||||||
|
start_x = None
|
||||||
|
end_x = None
|
||||||
|
start_y = None
|
||||||
|
for y, x in sorted(kocke):
|
||||||
|
if start_x is None:
|
||||||
|
start_x = x
|
||||||
|
end_x = x
|
||||||
|
start_y = y
|
||||||
|
continue
|
||||||
|
if y == start_y and end_x + 1 == x:
|
||||||
|
end_x = x
|
||||||
|
continue
|
||||||
|
ovire.append((start_x, end_x, start_y))
|
||||||
|
start_x = x
|
||||||
|
end_x = x
|
||||||
|
start_y = y
|
||||||
|
|
||||||
|
if start_x is not None:
|
||||||
|
ovire.append((start_x, end_x, start_y))
|
||||||
|
|
||||||
|
return ovire
|
||||||
|
|
||||||
|
|
||||||
|
def dekodiraj_vrstico(vrstica: str):
|
||||||
|
start_x = None
|
||||||
|
ovire = []
|
||||||
|
for x, c in enumerate(vrstica, start=1):
|
||||||
|
if c == '<':
|
||||||
|
start_x = x
|
||||||
|
elif c == '>':
|
||||||
|
ovire.append((start_x, x))
|
||||||
|
return ovire
|
||||||
|
|
||||||
|
|
||||||
|
def preberi(ime_datoteke):
|
||||||
|
ovire = []
|
||||||
|
f = open(ime_datoteke)
|
||||||
|
for y, vrstica in enumerate(f, start=1):
|
||||||
|
ovire.extend((x1, x2, y) for (x1, x2) in dekodiraj_vrstico(vrstica))
|
||||||
|
return ovire
|
||||||
|
|
||||||
|
|
||||||
|
def vrhovi(skladovnica, ovira, visina):
|
||||||
|
def vrhovi_r(ovira, visina):
|
||||||
|
if ovira not in skladovnica:
|
||||||
|
if visina > 0:
|
||||||
|
return set()
|
||||||
|
return {ovira}
|
||||||
|
else:
|
||||||
|
vrh = set()
|
||||||
|
for o in skladovnica[ovira]:
|
||||||
|
vrh.update(vrhovi_r(o, visina - 1))
|
||||||
|
return vrh
|
||||||
|
|
||||||
|
return vrhovi_r(ovira, visina)
|
||||||
|
|
||||||
|
|
||||||
|
class Ovire:
|
||||||
|
def __init__(self, ovire):
|
||||||
|
self.ovire = ovire
|
||||||
|
self.zadetki = 0
|
||||||
|
self.zadete_ovire = defaultdict(lambda: 0)
|
||||||
|
|
||||||
|
def strel(self, x, y):
|
||||||
|
for (x1, x2, y1) in self.vse_ovire():
|
||||||
|
if x1 <= x <= x2 and y == y1:
|
||||||
|
self.zadetki += 1
|
||||||
|
self.zadete_ovire[(x1, x2, y1)] += 1
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def zadetkov(self):
|
||||||
|
return self.zadetki
|
||||||
|
|
||||||
|
def vse_ovire(self):
|
||||||
|
razbite_ovire = [ovira for ovira, zadetki in self.zadete_ovire.items() if zadetki >= 3]
|
||||||
|
return {ovira for ovira in self.ovire if ovira not in razbite_ovire}
|
||||||
|
|
||||||
|
def zmaga(self):
|
||||||
|
return len(self.vse_ovire()) == 0
|
||||||
|
|
||||||
|
|
||||||
|
with open("ovire.txt", "wt", encoding="utf-8") as f:
|
||||||
|
f.write("""
|
||||||
|
...<-->........
|
||||||
|
<->......<--->.
|
||||||
|
...............
|
||||||
|
...<-->..<--->.
|
||||||
|
...............
|
||||||
|
...<-->........
|
||||||
|
<->..<>...<--->.
|
||||||
|
""".lstrip())
|
||||||
|
|
||||||
|
|
||||||
|
class Test(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
|
||||||
|
def test_1_nabava(self):
|
||||||
|
self.assertEqual(nabava([], []), {})
|
||||||
|
self.assertEqual(nabava([(1, 1, 1)], [(1, 1, 1)]), {})
|
||||||
|
self.assertEqual(nabava([(1, 1, 1)], [(3, 3, 2)]), {})
|
||||||
|
self.assertEqual(nabava([(5, 8, 3)], [(6, 9, 4)]), {})
|
||||||
|
self.assertEqual(nabava([(1, 1, 1), (5, 8, 3)], [(3, 3, 8), (6, 9, 4)]), {})
|
||||||
|
|
||||||
|
self.assertEqual(nabava([], [(1, 1, 2)]), {1: 1})
|
||||||
|
self.assertEqual(nabava([], [(4, 8, 3)]), {5: 1})
|
||||||
|
self.assertEqual(nabava([], [(1, 1, 2), (4, 8, 3)]), {1: 1, 5: 1})
|
||||||
|
self.assertEqual(nabava([], [(1, 1, 2), (5, 9, 10), (4, 8, 3)]), {1: 1, 5: 2})
|
||||||
|
self.assertEqual(nabava([(1, 1, 1)], [(1, 1, 2), (5, 9, 10), (4, 8, 3)]), {5: 2})
|
||||||
|
self.assertEqual(nabava([], [(1, 1, 2), (10, 14, 7), (5, 9, 10), (4, 8, 3)]), {1: 1, 5: 3})
|
||||||
|
self.assertEqual(nabava([(9, 13, 5)], [(1, 1, 2), (10, 14, 7), (5, 9, 10), (4, 8, 3)]), {1: 1, 5: 2})
|
||||||
|
self.assertEqual(nabava([(1, 3, 1), (9, 13, 5)], [(1, 1, 2), (10, 14, 7), (5, 9, 10), (4, 8, 3)]), {1: 1, 5: 2})
|
||||||
|
self.assertEqual(nabava([(1, 3, 1), (9, 13, 5)], [(1, 1, 2), (10, 14, 7), (5, 9, 10), (4, 8, 3)]), {1: 1, 5: 2})
|
||||||
|
self.assertEqual(nabava([(1, 3, 1), (2, 2, 3), (9, 13, 5)], [(1, 1, 2), (10, 14, 7), (5, 9, 10), (4, 8, 3)]),
|
||||||
|
{5: 2})
|
||||||
|
|
||||||
|
def test_2_rekonstrukcija(self):
|
||||||
|
self.assertEqual([], rekonstrukcija([]))
|
||||||
|
self.assertEqual(
|
||||||
|
[(3, 3, 1)],
|
||||||
|
rekonstrukcija([(1, 3)])
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
[(3, 4, 1)],
|
||||||
|
rekonstrukcija([(1, 3), (1, 4)]))
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
[(3, 4, 1)],
|
||||||
|
rekonstrukcija([(1, 4), (1, 3)]))
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
[(3, 5, 1)],
|
||||||
|
rekonstrukcija([(1, 3), (1, 4), (1, 5)]))
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
[(3, 5, 1)],
|
||||||
|
rekonstrukcija([(1, 5), (1, 3), (1, 4)]))
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
[(3, 5, 1), (3, 4, 2)],
|
||||||
|
rekonstrukcija([(1, 5), (1, 3), (1, 4), (2, 3), (2, 4)]))
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
[(3, 5, 1), (3, 4, 2)],
|
||||||
|
rekonstrukcija([(1, 5), (1, 3), (1, 4), (2, 4), (2, 3)]))
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
[(1, 2, 1), (2, 4, 2), (4, 4, 3)],
|
||||||
|
rekonstrukcija([(1, 1), (1, 2), (2, 2), (2, 3), (2, 4), (3, 4)]))
|
||||||
|
# isto kot zgoraj, le pomešano
|
||||||
|
self.assertEqual(
|
||||||
|
[(1, 2, 1), (2, 4, 2), (4, 4, 3)],
|
||||||
|
rekonstrukcija([(2, 3), (1, 1), (2, 2), (2, 4), (1, 2), (3, 4)]))
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
[(1, 2, 1), (2, 4, 2), (4, 5, 3)],
|
||||||
|
rekonstrukcija([(1, 1), (1, 2), (2, 2), (2, 3), (2, 4), (3, 4), (3, 5)]))
|
||||||
|
# isto kot zgoraj, le pomešano
|
||||||
|
self.assertEqual(
|
||||||
|
[(1, 2, 1), (2, 4, 2), (4, 5, 3)],
|
||||||
|
rekonstrukcija([(3, 5), (1, 1), (2, 4), (3, 4), (1, 2), (2, 2), (2, 3)]))
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
[(1, 2, 1), (2, 4, 2), (4, 5, 3), (5, 5, 4)],
|
||||||
|
rekonstrukcija([(1, 1), (1, 2), (2, 2), (2, 3), (2, 4), (3, 4), (3, 5), (4, 5)]))
|
||||||
|
# isto kot zgoraj, le pomešano
|
||||||
|
self.assertEqual(
|
||||||
|
[(1, 2, 1), (2, 4, 2), (4, 5, 3), (5, 5, 4)],
|
||||||
|
rekonstrukcija([(1, 1), (2, 4), (3, 4), (1, 2), (2, 2), (2, 3), (3, 5), (4, 5)]))
|
||||||
|
|
||||||
|
kocke = [(1, 2), (1, 3), (1, 4), (1, 8), (1, 9), (1, 10),
|
||||||
|
(2, 5),
|
||||||
|
(3, 2), (3, 3), (3, 4), (3, 8), (3, 9), (3, 10),
|
||||||
|
(4, 5),
|
||||||
|
(5, 1), (5, 2), (5, 3), (5, 7), (5, 8), (5, 9),
|
||||||
|
(6, 4),
|
||||||
|
(7, 1), (7, 2), (7, 3), (7, 7), (7, 8), (7, 9)]
|
||||||
|
|
||||||
|
for _ in range(10):
|
||||||
|
random.shuffle(kocke)
|
||||||
|
self.assertEqual(
|
||||||
|
[(2, 4, 1), (8, 10, 1), (5, 5, 2), (2, 4, 3), (8, 10, 3), (5, 5, 4),
|
||||||
|
(1, 3, 5), (7, 9, 5), (4, 4, 6), (1, 3, 7), (7, 9, 7)],
|
||||||
|
rekonstrukcija(kocke))
|
||||||
|
|
||||||
|
def test_3a_dekodiraj_vrstico(self):
|
||||||
|
self.assertEqual([], dekodiraj_vrstico("........"))
|
||||||
|
self.assertEqual([(1, 2)], dekodiraj_vrstico("<>......"))
|
||||||
|
self.assertEqual([(3, 4)], dekodiraj_vrstico("..<>......"))
|
||||||
|
self.assertEqual([(3, 6)], dekodiraj_vrstico("..<-->....."))
|
||||||
|
self.assertEqual([(3, 6), (10, 15)], dekodiraj_vrstico("..<-->...<---->.."))
|
||||||
|
self.assertEqual([(3, 6), (10, 15), (18, 19)], dekodiraj_vrstico("..<-->...<---->..<>"))
|
||||||
|
self.assertEqual([(1, 2), (4, 7), (11, 16), (19, 20)], dekodiraj_vrstico("<>.<-->...<---->..<>"))
|
||||||
|
|
||||||
|
def test_3b_preberi(self):
|
||||||
|
self.assertEqual([(4, 7, 1),
|
||||||
|
(1, 3, 2),
|
||||||
|
(10, 14, 2),
|
||||||
|
(4, 7, 4),
|
||||||
|
(10, 14, 4),
|
||||||
|
(4, 7, 6),
|
||||||
|
(1, 3, 7),
|
||||||
|
(6, 7, 7),
|
||||||
|
(11, 15, 7)], preberi("ovire.txt"))
|
||||||
|
|
||||||
|
def test_4_vrhovi(self):
|
||||||
|
"""
|
||||||
|
T
|
||||||
|
j l z B A
|
||||||
|
w i oo pp s gg n
|
||||||
|
c r uu vvv x y qq mm
|
||||||
|
aaa bbbbbb ttt ee fffff
|
||||||
|
dddddddddd hhhhhhhhhhhh
|
||||||
|
..............................
|
||||||
|
"""
|
||||||
|
skladovnica = {
|
||||||
|
".": "dh",
|
||||||
|
"d": "ab",
|
||||||
|
"h": "tef",
|
||||||
|
"a": "cr",
|
||||||
|
"b": "uv",
|
||||||
|
"t": "xy",
|
||||||
|
"f": "qm",
|
||||||
|
"c": "w",
|
||||||
|
"r": "i",
|
||||||
|
"u": "o",
|
||||||
|
"v": "p",
|
||||||
|
"x": "s",
|
||||||
|
"y": "",
|
||||||
|
"q": "g",
|
||||||
|
"m": "n",
|
||||||
|
"w": "j",
|
||||||
|
"o": "l",
|
||||||
|
"s": "z",
|
||||||
|
"g": "B",
|
||||||
|
"n": "A",
|
||||||
|
"l": "T"
|
||||||
|
}
|
||||||
|
self.assertEqual(set("jiTp"), vrhovi(skladovnica, "d", 0))
|
||||||
|
self.assertEqual(set("jiTp"), vrhovi(skladovnica, "d", -2))
|
||||||
|
self.assertEqual(set("jiTp"), vrhovi(skladovnica, "d", 3))
|
||||||
|
self.assertEqual(set("jT"), vrhovi(skladovnica, "d", 4))
|
||||||
|
self.assertEqual(set("T"), vrhovi(skladovnica, "d", 5))
|
||||||
|
self.assertEqual(set(), vrhovi(skladovnica, "d", 6))
|
||||||
|
|
||||||
|
self.assertEqual(set("T"), vrhovi(skladovnica, "u", 2))
|
||||||
|
self.assertEqual(set("Tp"), vrhovi(skladovnica, "b", 2))
|
||||||
|
self.assertEqual(set("T"), vrhovi(skladovnica, "b", 3))
|
||||||
|
|
||||||
|
self.assertEqual({'i', 'A', 'p', 'T', 'B', 'z', 'j', 'e'}, vrhovi(skladovnica, ".", 2))
|
||||||
|
self.assertEqual({'i', 'A', 'p', 'T', 'B', 'z', 'j'}, vrhovi(skladovnica, ".", 3))
|
||||||
|
self.assertEqual({'i', 'A', 'p', 'T', 'B', 'z', 'j'}, vrhovi(skladovnica, ".", 4))
|
||||||
|
self.assertEqual({'A', 'T', 'B', 'z', 'j'}, vrhovi(skladovnica, ".", 5))
|
||||||
|
self.assertEqual({'T'}, vrhovi(skladovnica, ".", 6))
|
||||||
|
self.assertEqual(set(), vrhovi(skladovnica, ".", 7))
|
||||||
|
|
||||||
|
def test_5_potapljanje(self):
|
||||||
|
zacetne = {(1, 2, 5), (2, 4, 2), (5, 10, 4)}
|
||||||
|
kopija = zacetne.copy()
|
||||||
|
ovire = Ovire(zacetne)
|
||||||
|
self.assertEqual(zacetne, ovire.vse_ovire())
|
||||||
|
self.assertEqual(0, ovire.zadetkov())
|
||||||
|
|
||||||
|
ovire2 = Ovire(set())
|
||||||
|
self.assertEqual(0, ovire2.zadetkov())
|
||||||
|
self.assertEqual(set(), ovire2.vse_ovire())
|
||||||
|
self.assertTrue(ovire2.zmaga())
|
||||||
|
|
||||||
|
self.assertFalse(ovire.strel(1, 1))
|
||||||
|
self.assertEqual(zacetne, ovire.vse_ovire())
|
||||||
|
self.assertEqual(0, ovire.zadetkov())
|
||||||
|
|
||||||
|
self.assertTrue(ovire.strel(3, 2))
|
||||||
|
self.assertEqual(zacetne, ovire.vse_ovire())
|
||||||
|
self.assertEqual(1, ovire.zadetkov())
|
||||||
|
self.assertFalse(ovire.zmaga())
|
||||||
|
|
||||||
|
self.assertTrue(ovire.strel(2, 5))
|
||||||
|
self.assertEqual(zacetne, ovire.vse_ovire())
|
||||||
|
self.assertEqual(2, ovire.zadetkov())
|
||||||
|
|
||||||
|
self.assertTrue(ovire.strel(3, 2))
|
||||||
|
self.assertEqual(zacetne, ovire.vse_ovire())
|
||||||
|
self.assertEqual(3, ovire.zadetkov())
|
||||||
|
|
||||||
|
self.assertTrue(ovire.strel(4, 2))
|
||||||
|
self.assertEqual({(1, 2, 5), (5, 10, 4)}, ovire.vse_ovire())
|
||||||
|
self.assertEqual(4, ovire.zadetkov())
|
||||||
|
|
||||||
|
self.assertFalse(ovire.strel(4, 2))
|
||||||
|
self.assertEqual({(1, 2, 5), (5, 10, 4)}, ovire.vse_ovire())
|
||||||
|
self.assertEqual(4, ovire.zadetkov())
|
||||||
|
|
||||||
|
self.assertFalse(ovire.strel(2, 2))
|
||||||
|
self.assertEqual({(1, 2, 5), (5, 10, 4)}, ovire.vse_ovire())
|
||||||
|
self.assertEqual(4, ovire.zadetkov())
|
||||||
|
|
||||||
|
self.assertFalse(ovire.zmaga())
|
||||||
|
self.assertEqual(kopija, zacetne)
|
||||||
|
|
||||||
|
self.assertEqual(0, ovire2.zadetkov())
|
||||||
|
self.assertEqual(set(), ovire2.vse_ovire())
|
||||||
|
self.assertTrue(ovire2.zmaga())
|
||||||
|
|
||||||
|
self.assertTrue(ovire.strel(5, 4))
|
||||||
|
self.assertEqual({(1, 2, 5), (5, 10, 4)}, ovire.vse_ovire())
|
||||||
|
self.assertEqual(5, ovire.zadetkov())
|
||||||
|
|
||||||
|
self.assertTrue(ovire.strel(10, 4))
|
||||||
|
self.assertEqual({(1, 2, 5), (5, 10, 4)}, ovire.vse_ovire())
|
||||||
|
self.assertEqual(6, ovire.zadetkov())
|
||||||
|
|
||||||
|
self.assertFalse(ovire.strel(4, 2))
|
||||||
|
self.assertEqual({(1, 2, 5), (5, 10, 4)}, ovire.vse_ovire())
|
||||||
|
self.assertEqual(6, ovire.zadetkov())
|
||||||
|
|
||||||
|
self.assertTrue(ovire.strel(1, 5))
|
||||||
|
self.assertEqual({(1, 2, 5), (5, 10, 4)}, ovire.vse_ovire())
|
||||||
|
self.assertEqual(7, ovire.zadetkov())
|
||||||
|
|
||||||
|
self.assertTrue(ovire.strel(1, 5))
|
||||||
|
self.assertEqual({(5, 10, 4)}, ovire.vse_ovire())
|
||||||
|
self.assertEqual(8, ovire.zadetkov())
|
||||||
|
|
||||||
|
self.assertFalse(ovire.strel(1, 5))
|
||||||
|
self.assertEqual({(5, 10, 4)}, ovire.vse_ovire())
|
||||||
|
self.assertEqual(8, ovire.zadetkov())
|
||||||
|
|
||||||
|
self.assertFalse(ovire.zmaga())
|
||||||
|
|
||||||
|
self.assertTrue(ovire.strel(7, 4))
|
||||||
|
self.assertEqual(set(), ovire.vse_ovire())
|
||||||
|
self.assertEqual(9, ovire.zadetkov())
|
||||||
|
|
||||||
|
self.assertTrue(ovire.zmaga())
|
||||||
|
|
||||||
|
self.assertFalse(ovire.strel(7, 4))
|
||||||
|
self.assertEqual(set(), ovire.vse_ovire())
|
||||||
|
self.assertEqual(9, ovire.zadetkov())
|
||||||
|
|
||||||
|
self.assertTrue(ovire.zmaga())
|
||||||
|
|
||||||
|
self.assertEqual(0, ovire2.zadetkov())
|
||||||
|
self.assertEqual(set(), ovire2.vse_ovire())
|
||||||
|
self.assertTrue(ovire2.zmaga())
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
7
izpit/ovire.txt
Executable file
7
izpit/ovire.txt
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
...<-->........
|
||||||
|
<->......<--->.
|
||||||
|
...............
|
||||||
|
...<-->..<--->.
|
||||||
|
...............
|
||||||
|
...<-->........
|
||||||
|
<->..<>...<--->.
|
Loading…
Reference in New Issue
Block a user