Vsevolod Levitan преди 1 година
родител
ревизия
716fbf9279
променени са 1 файла, в които са добавени 60 реда и са изтрити 0 реда
  1. 60 0
      wires/main.py

+ 60 - 0
wires/main.py

@@ -0,0 +1,60 @@
+import sys
+from skimage.measure import label
+import matplotlib.pyplot as plt
+import numpy as np
+
+
+def dil(arr, struct):
+    res = np.zeros_like(arr)
+    for y in range(1, arr.shape[0] - 1):
+        for x in range(1, arr.shape[1] - 1):
+            sub = arr[y - 1 : y + 2, x - 1 : x + 2]
+            rsub = np.logical_and(arr[y, x], struct)
+            res[y - 1 : y + 2, x - 1 : x + 2] = np.logical_or(
+                res[y - 1 : y + 2, x - 1 : x + 2], rsub
+            )
+    return res
+
+
+def erros(arr, struct):
+    result = np.zeros_like(arr)
+    for y in range(1, arr.shape[0] - 1):
+        for x in range(1, arr.shape[1] - 1):
+            sub = arr[y - 1 : y + 2, x - 1 : x + 2]
+            if np.all(sub >= struct):
+                result[y, x] = 1
+    return result
+
+
+def cl(arr, struct):
+    return dil(erros(arr, struct), struct)
+
+
+def op(arr, struct):
+    return erros(dil(arr, struct), struct)
+
+
+if len(sys.argv) < 2:
+    print("No path provided")
+    exit()
+
+num = np.load(sys.argv[1])
+
+m = np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]])
+
+plt.subplot(1, 2, 1)
+plt.imshow(num)
+plt.subplot(1, 2, 2)
+plt.imshow(cl(num, m))
+
+for w in np.unique(label(num))[1:]:
+    res = label(cl(num, m))[label(num) == w]
+    match len(np.unique(res)[1:]):
+        case 1:
+            print("Провод не порван")
+        case 0:
+            print("Провод уничтожен")
+        case _:
+            print(f"Провод {w} порван на {len(np.unique(res)[1:])}")
+
+plt.show()