summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Guschin <guschin.drew@gmail.com>2022-05-18 23:45:58 +0400
committerAndrew Guschin <guschin.drew@gmail.com>2022-05-18 23:45:58 +0400
commitda81a8f76f56a6b21dda16c8df5f1df5f9b962a3 (patch)
treec1d6d7ae405c67384e40b3d327958aa129e07dc8
parent9b53b8e935a648e225508e51f45d83dfaeacd896 (diff)
Добавлена программа разбиения множества
-rw-r--r--Makefile9
-rw-r--r--partition.py38
2 files changed, 46 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 7e36cc1..18eeefd 100644
--- a/Makefile
+++ b/Makefile
@@ -1,9 +1,16 @@
CXX=g++
-CXXFLAGS=-Wall -Wpedantic -ggdb -std=c++17
+CXXFLAGS=-Wall -Wpedantic -O2 -std=c++17
SOURCES := $(wildcard *.cpp)
EXECS := $(patsubst %.cpp,%.out,$(SOURCES))
+.PHONY: all clean
+
all: $(EXECS)
%.out: %.cpp
$(CXX) $(CXXFLAGS) $< -o $@
+
+clean:
+ $(RM) $(EXECS)
+ $(RM) -r *.dSYM
+
diff --git a/partition.py b/partition.py
new file mode 100644
index 0000000..32677a7
--- /dev/null
+++ b/partition.py
@@ -0,0 +1,38 @@
+def iterate_partition(pi, f):
+ pi_prime = []
+ for part in pi:
+ d = {part: set() for part in pi}
+ for elem in part:
+ b = f(elem)
+ for part in pi:
+ if b in part:
+ d[part].add(elem)
+ break
+ for v in d.values():
+ if v:
+ pi_prime.append(frozenset(v))
+ return pi_prime, pi != pi_prime
+
+
+def print_partition(pi):
+ print(list(map(set, pi)))
+
+
+def main():
+ n = 20
+ b1 = frozenset(range(1, n))
+ b2 = frozenset([20])
+ pi = [b1, b2]
+ f = lambda x: x + 1 if x < n else x
+
+ print_partition(pi)
+ while True:
+ pi, changed = iterate_partition(pi, f)
+ if not changed:
+ break
+ print_partition(pi)
+
+
+if __name__ == "__main__":
+ main()
+