【educoder】 离散数学:集合及其基本运算的实现

【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  **********#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值