【educoder】离散数学:集合及其基本运算的实现
第1关:set简单应用
任务描述
请编写一个程序,从文件读入一组字符串,要求:当某个字符串是第一次出现时,输出该字符串,而之后当该字符串再次出现时,将不再输出。
输入文件格式为每行一个字符串,例如:
I
,
;
am
home
.
相关知识
相关知识请参见本章“简介”
编程要求
根据提示,在右侧编辑器补充代码,完成函数readAndPrintUniqueWords(filename)的功能,其中参数filename为文件名,数据类型是字符串。本题任务中的输出指的是用print打印第一次出现的单词。
测试说明
平台会对你编写的代码进行测试:
无需输入,输入由测试程序自动读入
def readAndPrintUniqueWords(filename):
infile = open(filename, 'r')
#********** Begin **********#
#请在此区间内编程完成函数代码
word = []
for i in infile:
if i not in word:
print(i.strip())
word.append(i)
#请在此区间内编程完成函数代码
#********** End **********#
infile.close()
第2关:《仲夏夜之梦》中的回文单词对
任务描述
莎士比亚的仲夏夜之梦剧本有33,721个单词,保存在shakespeare.txt中。请编写一个程序,将该剧本中所有长度大于等于5,且该单词的字母反序单词也出现在了剧本的单词全部找出来,请注意这样的单词是成对出现的,例如spots和stops就是一对字母反序单词,返回结果中应包含这样的单词对。
文件格式为一段一段的文字,如下所示:
A MIDSUMMER-NIGHT’S DREAM
Now , fair Hippolyta , our nuptial hour
Draws on apace : four happy days bring in
Another moon ; but O ! methinks how slow
This old moon wanes ; she lingers my desires ,
Like to a step dame , or a dowager
Long withering out a young man’s revenue .
Four days will quickly steep themselves in night ;
Four nights will quickly dream away the time ;
And then the moon , like to a silver bow
New-bent in heaven , shall behold the night
Of our solemnities .
相关知识
本关所需知识请参见本章“简介”。
编程要求
请注意效率,要求在10秒内出结果,输入文件《仲夏夜之梦》有4.5MB。
函数shakeSpeare(filename)返回结果为一个集合,参数filename为文件名,数据类型为str。返回结果为满足条件的单词的集合,例如:{“stop”, “pots”}
测试说明
平台会对你编写的代码进行测试:
无需准备输入,程序自动读取,输出是否正确的指示。
def shakeSpeare(filename):
#********** Begin **********#
#请在此区间内编程实现函数功能
f = open(filename,'r')
a = set()
for i in f :
for j in i.split():
if len(j)>=5:
a.add(j)
reverse=set()
for i in a :
if i[::-1] in a :
reverse.add(i)
reverse.add(i[::-1])
#请在此区间内编程实现函数功能
#********** End **********#
return reverse
第3关:求幂集
任务描述
请完成给定函数的实现,对给定的有限集合,求其幂集并返回得到的结果,返回结果为一个set对象,请注意幂集是集类,set对象不能以set对象为元素。
相关知识
所需知识请参见本实训“简介”。
编程要求
根据提示,在右侧编辑器补充代码,计算并返回给定集合的幂集。
提示:可考虑用递归;请注意处理集合为元素时,选用合适的set类型。
测试说明
平台会对你编写的代码进行测试:
例如,powSet({1,2})的返回结果将为{frozenset(), frozenset({2}), frozenset({1}), frozenset({1, 2})}。
又例如,powSet({1,frozenset([2])})的返回结果为{frozenset(), frozenset({1}), frozenset({1, frozenset({2})}), frozenset({frozenset({2})})}
def powSet(S):
#********** Begin **********#
#请在此区域内编程
ns=set(frozenset([x]) for x in S)
length=2**len(S)
s=set()
while len(s)<length-1:
nns=set()
for fset1 in ns:
for item1 in S:
set2=set(x for x in fset1)
set2.add(item1)
fset2=frozenset(x for x in set2)
nns.add(fset2)
s.add(fset2)
ns=nns
s.add(frozenset())
return s
#请在此区域内编程
#********** End **********#
第4关:计算n个集合的笛卡尔乘积
任务描述
请完成给定函数的实现,求所给n个有限集合,求其笛卡尔乘积。要求,返回结果为一个set对象,n元序偶用tuple对象表示。
相关知识
所需知识请参见本实训“简介”。
编程要求
根据提示,以及教材笛卡尔乘积的定义,在右侧编辑器补充代码。请注意,使用了不定个数参数方式定义函数,同时需考虑如何处理集合为元素的情形。
测试说明
平台会对你编写的代码进行测试,无需输入。例如,DescartesProduct({1,2,7},{3,4},{5,6})输出为{(2, 3, 5), (2, 3, 6), (1, 3, 6), (7, 3, 5), (2, 4, 6), (7, 4, 5), (1, 4, 5), (1, 3, 5), (7, 4, 6), (2, 4, 5), (1, 4, 6), (7, 3, 6)}。
def DescartesProduct(*args):
#********** Begin **********#
#请在此区域编程实现函数功能
a=[]
for s in args:
a.append([x for x in s])
a=DescartesProduct2([],a)
b=set()
for i in a:
b.add(tuple(x for x in i))
return b
def DescartesProduct2(list1,list2):
if len(list2)==0:
return list1
if len(list1)==0:
for x in list2[0]:
list1.append([x])
return DescartesProduct2(list1,list2[1:])
nlist=[]
for i in list2[0]:
for x in list1:
a=[j for j in x]
a.append(i)
nlist.append(a)
return DescartesProduct2(nlist,list2[1:])
#请在此区域编程实现函数功能
#********** End **********#