[Python] 纯文本查看 复制代码#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class Closures(object):
def __init__(self):
self.map = {}
self.list = []
def introduction(self):
print("使用方法说明:")
print("输入集合时就可以直接abcdefg...的输入")
print("闭包依赖的输入格式为a->b然后回车,再输入c->d,以此类推")
print("集合中的空集以@代替")
def inputList(self):
print("请输入你的属性列,输入end结束")
while (True):
str = input().lower()
if len(str) != 0 and str != 'end':
for s in str:
s.upper()
if (self.list.count(s) == 0):
self.list.append(s)
if str == 'end':
break;
def outputList(self):
result = ''
print("你输入的集合为")
for l in self.list:
print(l)
result += l
print('\n')
return result
def printout(self):
print("保存的依赖为:")
for (key, value) in self.map.items():
print('{0} {1}'.format(key, value))
def add(self, name, result):
str = result
for s in name:
if result.find(s) == -1:
str += s;
return s
def calculate(self, result):
flag = True
for (str, name) in self.map.items():
for s in str:
if result.find(s) == -1:
flag = False
break
if flag:
comp = result
result = self.add(name, result)
if result != comp:
result = self.calculate(self.map)
return result
def calculateSet(self, result, strs):
length = len(result)
max = int(pow(2.0, length))
for i in range(max):
strs[i] = self.switchArray(i, result)
def switchArray(self, num, result):
binary = bin(num).replace('0b', '')
flag = True
count = len(binary)
out = ""
length = len(result)
temp = ['0' for x in range(length)]
for i, j in zip(range(length - 1, -1, -1), range(count - 1, -1, -1)):
if binary[j] == '1':
temp[i] = '1'
flag = False
for t, i in zip(temp, range(length)):
if t == '1':
out += result[i];
if flag:
out = '@'
return out
def doMain(self):
result = ''
self.introduction()
self.inputList()
self.outputList()
print("请输入依赖,输入end结束输入!")
while (True):
str = input().lower()
if str == 'end':
break
result = self.calculate(result)
print('所需要的闭包为{0}'.format(result))
result = self.outputList()
length = pow(2.0, len(result))
str = ['0' for x in range(int(length))]
self.calculateSet(result, str)
for s in str:
if s.find('@') != -1:
continue
result = self.calculate(s)
subLength = pow(2.0, len(result))
subStr = ['0' for x in range(int(subLength))]
self.calculateSet(result, subStr)
for ss in subStr:
print('{}->{}'.format(s, ss))
if __name__ == "__main__":
clo = Closures()
clo.doMain()