06_analiza_infrastrukture
This commit is contained in:
parent
1cfcb7328b
commit
50d32bed39
0
06_analiza_infrastrukture/__init__.py
Normal file
0
06_analiza_infrastrukture/__init__.py
Normal file
45
06_analiza_infrastrukture/naloga.py
Normal file
45
06_analiza_infrastrukture/naloga.py
Normal file
|
@ -0,0 +1,45 @@
|
|||
from itertools import pairwise, groupby
|
||||
|
||||
|
||||
def nove_povezave(pot, zemljevid):
|
||||
return pairwise(pot) - zemljevid.keys()
|
||||
|
||||
|
||||
def obiskane_tocke(pot):
|
||||
return set(pot)
|
||||
|
||||
|
||||
def popravljena_pot(pot):
|
||||
return "".join(k for k, g in groupby(pot))
|
||||
|
||||
|
||||
def povezave_z_vescino(pot, zemljevid, vescina):
|
||||
return [p for p in pairwise(pot) if vescina in zemljevid[p]]
|
||||
|
||||
|
||||
def dolgocasna_pot(pot, zemljevid):
|
||||
return set() in (zemljevid[p] for p in pairwise(pot))
|
||||
|
||||
|
||||
def dobra_pot(pot, zemljevid):
|
||||
return not False in (len(zemljevid[p]) >= 2 for p in pairwise(pot))
|
||||
|
||||
|
||||
def zahtevnost_poti(pot, zemljevid):
|
||||
return max(len(zemljevid[p]) for p in pairwise(pot))
|
||||
|
||||
|
||||
def izvedljiva(pot, zemljevid, zivljenj):
|
||||
return sum(p not in zemljevid for p in pairwise(pot)) < zivljenj
|
||||
|
||||
|
||||
def enosmerne(zemljevid):
|
||||
return {p for p in zemljevid if not (p[1], p[0]) in zemljevid}
|
||||
|
||||
|
||||
def dvosmerne(zemljevid):
|
||||
return {k: v for k, v in zemljevid.items() if (k[1], k[0]) in zemljevid}
|
||||
|
||||
|
||||
def najzahtevnejsi_odsek(pot, zemljevid):
|
||||
return max((len(zemljevid[p]), p) for p in pairwise(pot))[1]
|
191
06_analiza_infrastrukture/naloga_test.py
Normal file
191
06_analiza_infrastrukture/naloga_test.py
Normal file
|
@ -0,0 +1,191 @@
|
|||
from .naloga import *
|
||||
|
||||
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, R, S, T, U, V = "ABCDEFGHIJKLMNOPRSTUV"
|
||||
|
||||
zemljevid = {
|
||||
(A, B): {"trava", "gravel"},
|
||||
(B, A): {"trava", "gravel"},
|
||||
(A, V): {"lonci", "pešci"},
|
||||
(V, A): {"lonci", "pešci"},
|
||||
(B, C): {"lonci", "bolt"},
|
||||
(C, B): {"lonci", "bolt"},
|
||||
(B, V): set(),
|
||||
(V, B): set(),
|
||||
(C, R): {"lonci", "pešci", "stopnice"},
|
||||
(R, C): {"lonci", "pešci", "stopnice"},
|
||||
(D, F): {"pešci", "stopnice"},
|
||||
(F, D): {"pešci", "stopnice"},
|
||||
(D, R): {"pešci"},
|
||||
(R, D): {"pešci"},
|
||||
(E, I): {"lonci", "trava"},
|
||||
(I, E): {"lonci", "trava"},
|
||||
(F, G): {"črepinje", "trava"},
|
||||
(G, F): {"črepinje", "trava"},
|
||||
(G, H): {"pešci", "črepinje"},
|
||||
(H, G): {"pešci", "črepinje"},
|
||||
(G, I): {"avtocesta"},
|
||||
(I, G): {"avtocesta"},
|
||||
(H, J): {"bolt", "robnik"},
|
||||
(J, H): {"bolt", "robnik"},
|
||||
(I, M): {"avtocesta"},
|
||||
(M, I): {"avtocesta"},
|
||||
(I, P): {"gravel"},
|
||||
(P, I): {"gravel"},
|
||||
(I, R): {"stopnice", "robnik"},
|
||||
(R, I): {"stopnice", "robnik"},
|
||||
(J, K): set(),
|
||||
(K, J): set(),
|
||||
(J, L): {"bolt", "gravel"},
|
||||
(L, J): {"bolt", "gravel"},
|
||||
(K, M): {"bolt", "stopnice"},
|
||||
(M, K): {"bolt", "stopnice"},
|
||||
(L, M): {"pešci", "robnik"},
|
||||
(M, L): {"pešci", "robnik"},
|
||||
(M, N): {"rodeo"},
|
||||
(N, M): {"rodeo"},
|
||||
(N, P): {"gravel"},
|
||||
(P, N): {"gravel"},
|
||||
(O, P): {"gravel"},
|
||||
(P, O): {"gravel"},
|
||||
(P, S): set(),
|
||||
(S, P): set(),
|
||||
(R, U): {"pešci", "trava"},
|
||||
(U, R): {"pešci", "trava"},
|
||||
(R, V): {"lonci", "pešci"},
|
||||
(V, R): {"lonci", "pešci"},
|
||||
(S, T): {"robnik", "trava"},
|
||||
(T, S): {"robnik", "trava"},
|
||||
(T, U): {"trava", "gravel"},
|
||||
(U, T): {"trava", "gravel"},
|
||||
(U, V): {"lonci", "robnik", "trava"},
|
||||
(V, U): {"lonci", "robnik", "trava"},
|
||||
}
|
||||
|
||||
|
||||
mali_zemljevid = {
|
||||
(A, B): {"robnik", "bolt"},
|
||||
(B, A): {"robnik", "bolt"},
|
||||
(A, C): {"bolt", "rodeo", "pešci"},
|
||||
(C, D): set(),
|
||||
(D, C): set(),
|
||||
(V, B): {"avtocesta"},
|
||||
}
|
||||
|
||||
|
||||
import unittest
|
||||
import ast
|
||||
|
||||
|
||||
class Test01Obvezna(unittest.TestCase):
|
||||
def test_0_ena_vrstica(self):
|
||||
pricakovane = (
|
||||
"nove_povezave obiskane_tocke popravljena_pot povezave_z_vescino dolgocasna_pot"
|
||||
" dobra_pot dolgocasne_povezave zahtevnost_poti izvedljiva najzahtevnejsi_odsek"
|
||||
" enosmerne dvosmerne".split()
|
||||
)
|
||||
|
||||
with open(__file__, "r", encoding="utf-8") as f:
|
||||
for elm in ast.parse(f.read()).body:
|
||||
if not isinstance(elm, ast.FunctionDef):
|
||||
continue
|
||||
|
||||
self.assertIn(
|
||||
elm.name,
|
||||
pricakovane,
|
||||
f"\nTokrat ne dodajaj drugih funkcij: odstrani funkcijo '{elm.name}'.",
|
||||
)
|
||||
body = elm.body
|
||||
self.assertEqual(len(body), 1, "\nFunkcija ni dolga le eno vrstico")
|
||||
self.assertIsInstance(
|
||||
body[0], ast.Return, "\nFunkcija naj bi vsebovala le return"
|
||||
)
|
||||
|
||||
def test_1_nove_povezave(self):
|
||||
self.assertEqual({(V, C), (C, D), (F, E)}, nove_povezave("ABVCDFE", zemljevid))
|
||||
self.assertEqual({(A, U)}, nove_povezave("AU", zemljevid))
|
||||
self.assertEqual(set(), nove_povezave("ABVRC", zemljevid))
|
||||
self.assertEqual(set(), nove_povezave("ABVRCBA", zemljevid))
|
||||
self.assertEqual({(C, D), (D, P), (P, M)}, nove_povezave("CDPM", zemljevid))
|
||||
|
||||
def test_2_obiskane_tocke(self):
|
||||
self.assertEqual({A, B, C, R, U, V}, obiskane_tocke("ABVURURC"))
|
||||
self.assertEqual({P, N}, obiskane_tocke("PN"))
|
||||
|
||||
def test_3_popravljena_pot(self):
|
||||
self.assertEqual("ABCRIE", popravljena_pot("ABBCCRRIIE"))
|
||||
self.assertEqual("MN", popravljena_pot("MN"))
|
||||
self.assertEqual("NMI", popravljena_pot("NMMI"))
|
||||
self.assertEqual(
|
||||
"ABCRDFGIMNPSTUVA", popravljena_pot("ABBCCRRDDFFGGIIMMNNPPSSTTUUVVA")
|
||||
)
|
||||
|
||||
def test_4_povezave_z_vescino(self):
|
||||
self.assertEqual(
|
||||
[("R", "U"), ("V", "R"), ("R", "U")],
|
||||
povezave_z_vescino("RUVRUTS", zemljevid, "pešci"),
|
||||
)
|
||||
self.assertEqual([], povezave_z_vescino("RUVRUTS", zemljevid, "avtocesta"))
|
||||
self.assertEqual(
|
||||
[(V, R), (R, C), (C, R), (R, D), (D, F)],
|
||||
povezave_z_vescino("VRCRDF", zemljevid, "pešci"),
|
||||
)
|
||||
self.assertEqual([(G, I)], povezave_z_vescino("FGIE", zemljevid, "avtocesta"))
|
||||
|
||||
def test_5_dolgocasna_pot(self):
|
||||
self.assertTrue(dolgocasna_pot("ABVUR", zemljevid))
|
||||
self.assertFalse(dolgocasna_pot("AVUR", zemljevid))
|
||||
self.assertTrue(dolgocasna_pot("GIPS", zemljevid))
|
||||
self.assertFalse(dolgocasna_pot("GIP", zemljevid))
|
||||
self.assertFalse(dolgocasna_pot("GI", zemljevid))
|
||||
self.assertTrue(dolgocasna_pot("PS", zemljevid))
|
||||
self.assertTrue(dolgocasna_pot("SP", zemljevid))
|
||||
|
||||
def test_6_dobra_pot(self):
|
||||
self.assertTrue(dobra_pot("ABCR", zemljevid))
|
||||
self.assertFalse(dobra_pot("ABCRDF", zemljevid))
|
||||
self.assertFalse(dobra_pot("BV", zemljevid))
|
||||
self.assertFalse(dobra_pot("ABV", zemljevid))
|
||||
self.assertFalse(dobra_pot("BVU", zemljevid))
|
||||
|
||||
def test_7_zahtevnost_poti(self):
|
||||
self.assertEqual(3, zahtevnost_poti("ABCRU", zemljevid))
|
||||
self.assertEqual(1, zahtevnost_poti("IPS", zemljevid))
|
||||
self.assertEqual(0, zahtevnost_poti("PS", zemljevid))
|
||||
self.assertEqual(3, zahtevnost_poti("ABVUT", zemljevid))
|
||||
self.assertEqual(2, zahtevnost_poti("ABVR", zemljevid))
|
||||
|
||||
def test_8_izvedljiva(self):
|
||||
self.assertTrue(izvedljiva("AVUSPRDEI", zemljevid, 4))
|
||||
self.assertFalse(izvedljiva("AVUSPRDEI", zemljevid, 3))
|
||||
self.assertFalse(izvedljiva("AVUSPRE", zemljevid, 3))
|
||||
self.assertFalse(izvedljiva("AVUSPRE", zemljevid, 2))
|
||||
self.assertTrue(izvedljiva("AB", zemljevid, 2))
|
||||
self.assertTrue(izvedljiva("AB", zemljevid, 1))
|
||||
self.assertFalse(izvedljiva("AB", zemljevid, 0))
|
||||
|
||||
def test_9_enosmerne(self):
|
||||
self.assertEqual({(A, C), (V, B)}, enosmerne(mali_zemljevid))
|
||||
self.assertEqual(set(), enosmerne(zemljevid))
|
||||
|
||||
def test_10_dvosmerne(self):
|
||||
self.assertEqual(zemljevid, dvosmerne(zemljevid))
|
||||
self.assertEqual(
|
||||
{
|
||||
(A, B): {"robnik", "bolt"},
|
||||
(B, A): {"robnik", "bolt"},
|
||||
(C, D): set(),
|
||||
(D, C): set(),
|
||||
},
|
||||
dvosmerne(mali_zemljevid),
|
||||
)
|
||||
|
||||
|
||||
class Test02Dodatna(unittest.TestCase):
|
||||
def test_najzahtevnejsi_odsek(self):
|
||||
self.assertEqual((C, R), najzahtevnejsi_odsek("ABCRU", zemljevid))
|
||||
self.assertEqual((C, R), najzahtevnejsi_odsek("CR", zemljevid))
|
||||
self.assertEqual((V, U), najzahtevnejsi_odsek("ABVUT", zemljevid))
|
||||
|
||||
|
||||
if "__main__" == __name__:
|
||||
unittest.main()
|
Loading…
Reference in New Issue
Block a user