一、进阶py:通关一个某校的题库

一、进阶py:通关一个某校的题库

第一关,除去列表中的重复元素

已知两个列表,可能包含有相同元素,请找出两个列表的相同元素,并放入新的列表。打印新列表。输出结果中没有重复元素,如果两个列表中没有相同元素则输出[]。

image-20220105182957787

第二关 递归求嵌套层数

image-20220105195353498

list_max = []
def level(mylist,a=-1):
    if  isinstance(mylist,list):  #判断mylist变量是否是一个列表
        a += 1
        for item in mylist:
            level(item,a)
        list_max.append(a)
        list_max.sort(reverse=True)
        max_level = list_max[0]
        return max_level + 1
    else:  # 不是列表,递归结束条件
        return 0
origin=eval(input())
print(level(origin))

中途插一关 递归输出索引

image-20220105204458620

def main():
    somestr, substr, startstr, endstr = input().split()
    startnum = int(startstr)
    endnum = int(endstr)
    fun(somestr, substr, startnum, endnum)
num_list = []
def fun(a,b,c,d):
    a_list = list(a)
    b_list = list(b)
    if c+2<d:
        if a_list[c] == b_list[0] and a_list[c+1] == b_list[1] and a_list[c+2] == b_list[2]:
            index = c
            num_list.append(index)
            fun(a,b,c+3,d)
        else:
            fun(a,b,c+1,d)
    else:
        if num_list == []:
            print(None)
        else:
            print(num_list)


main()

第三关 递归求加权和

image-20220105231142866

num_list = []
#定义了一个吧列表里面所有元素加起来的函数
def jia(a,b=0):
    for item in a:
        b = b + item
    return b
def sumlist(lists,w):
    for item in lists:
        if isinstance(item,list):
            sumlist(item,w+1)
        else:
             num_list.append(item*w)
    return jia(num_list)
nums  =  eval(input())
addv  =  sumlist(nums,1)
print(addv)

第四关

image-20220106000047657

第一个correct.in文件

rhe+[35(fjej)w-wr3f[efe{feofds}]

__main__文件

#创建两个符号表
symbols = {'}': '{', ']': '[', ')': '(', '>': '<'}
symbols_l, symbols_r = symbols.values(), symbols.keys()

def check(s):
    arr = []
    for c in s:
        if c in symbols_l:
            # 左符号存入列表
            arr.append(c)
        elif c in symbols_r:
            # 右符号要不在列表中不存在,要么匹配失败
            if arr and arr[-1] == symbols[c]:
                arr.pop()
            else:
                return False

    return True
#上面用栈的思想

with open('correct.in',mode='r',encoding='utf-8') as f:
    data = f.read()
    res = check(data)
with open('correct.out',mode='wt',encoding='utf-8') as g:
    g.write(str(res))

第五关 输出特定节日(类似母亲节)

image-20220107132040203

import datetime
import calendar

data = input()
data_list = data.split(",")
a,b,c,y1,y2 = data_list

def is_valid_date(a,b,c):
  #判断是否是一个有效的日期字符串
  try:
    datetime.date(a,b,c)
    return True
  except:
    return False

def festival(a=a,b=b,c=c,y1=y1,y2=y2):
    year = []
    a = int(a)
    b = int(b)
    c = int(c)
    y1 = int(y1)
    y2 = int(y2)
    for i in range(y1,y2+1):
        year.append(i)
    for item in year:
        daterange = calendar.monthrange(item, a)
        date = (b - 1) * 7 + c - daterange[0]  # 计算日期
        if is_valid_date(item, a, date):  # 判断是否有效
            print(f"{item} {a} {date}")
        else:
            print(None)
festival()

第六题 定义类计算票价

image-20220109181909010

from datetime import date
class calculator:

    def __init__(self,adult,child,date):
        self.adult = adult
        self.child = child
        self.date_list = date.split("-")
        self.year = self.date_list[0]
        self.month = self.date_list[1]
        self.day = self.date_list[2]
        self.workday = [0,1,2,3,4]

    def adult_cost(self):
        x = date(int(self.year), int(self.month), int(self.day))
        if x.weekday() in self.workday:
            return self.adult*100
        else:
            return self.adult*120

    def child_cost(self):
        x = date(int(self.year), int(self.month), int(self.day))
        if x.weekday() in self.workday:
            return self.child*50
        else:
            return self.child*60

    def isweekend(self):
        x = date(int(self.year), int(self.month), int(self.day))
        if x.weekday() in self.workday:
            return False
        else:
            return True

    def result(self):
        a = f"adult:{self.adult},child:{self.child},isWeekend:{self.isweekend()},total cost:{int(self.child_cost()+self.adult_cost())}.0"
        return a
data = input()
a,b,c = data.split(',')
ex = calculator(adult=int(a),child=int(b),date=c)
print(ex.result())

人民币大写

image-20220109181954023

import io

import sys

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')

sys.stdin = io.TextIOWrapper(sys.stdin.buffer,encoding='utf-8')
from decimal import Decimal

def cncurrency(value, capital=True, prefix=False, classical=None):

    if classical is None:
        classical = True if capital else False

    if prefix is True:
        prefix = '人民币'
    else:
        prefix = ''

    if capital:
        num = ('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖')
        iunit = [None, '拾', '佰', '仟', '万', '拾', '佰', '仟','亿', '拾', '佰', '仟', '万', '拾', '佰', '仟']
    else:
        num = ('〇', '一', '二', '三', '四', '五', '六', '七', '八', '九')
        iunit = [None, '十', '百', '千', '万', '十', '百', '千','亿', '十', '百', '千', '万', '十', '百', '千']
    if classical:
        iunit[0] = '元' if classical else '圆'


    if not isinstance(value, Decimal):
        value = Decimal(value).quantize(Decimal('0.01'))

    # 转化为字符串
    s = str(value)
    istr, dstr = s.split('.')
    istr = istr[::-1]
    so = []     # 用于记录转换结果

    # 零
    if value == 0:
        return prefix + num[0] + iunit[0]
    haszero = False
    if dstr == '00':
        haszero = True

    # 处理整数部分
    for i, n in enumerate(istr):
        n = int(n)
        if i % 4 == 0:
            if i == 8 and so[-1] == iunit[4]:
                so.pop()
            so.append(iunit[i])
            if n == 0:
                if not haszero:
                    so.insert(-1, num[0])
                    haszero = True
            else:
                so.append(num[n])
                haszero = False
        else:
            if n != 0:
                so.append(iunit[i])
                so.append(num[n])
                haszero = False
            else:
                if not haszero:
                    so.append(num[0])
                    haszero = True

    so.append(prefix)
    so.reverse()
    return ''.join(so)

i=input()
print (cncurrency(i)+"整")

计算教学周

image-20220109182026041

import datetime

frist_date = input().split(' ')
date = input().split(' ')
year1,month1,day1 = frist_date
year2,month2,day2 = date
d1 = datetime.date(int(year1),int(month1),int(day1))
d2 = datetime.date(int(year2),int(month2),int(day2))

gap = (d2-d1).days
week = (gap-(gap%7))/7+1
xingqiji = gap%7+1
print(f"{round(week)} {xingqiji}")#用四舍五入来取整

找出同一周上课的周次

image-20220109182135667

data1 = input().split(',')
data2 = input().split(',')

date1 = set()#第一节课的数据
date2 = set()#第二节课的数据
for item in data1:
    if '-' in item:
        gap = item.split('-')
        for num in range(int(gap[0]),int(gap[1])+1):
            date1.add(int(num))
    else:
        date1.add(int(item))

for item in data2:
    if '-' in item:
        gap = item.split('-')
        for num in range(int(gap[0]),int(gap[1])+1):
            date2.add(int(num))
    else:
        date2.add(int(item))

res = date1&date2
res2 = list(res)
if res == set():
    print("none")
else:
    final = " ".join('%s' %item for item in res2)
    print(final)

课程表调表

image-20220109182214040

from itertools import groupby
data1 = input().split(',')
data2 = input()
data3 = input()
date1 = []#第一节课的数据
new_date = []

def list_str(list):
    final_list = []
    fun = lambda x: x[1]-x[0]
    for k, g in groupby(enumerate(list), fun):
      l1 = [j for i, j in g]  # 连续数字的列表
      if len(l1) > 1:
        scop = str(min(l1)) + '-' + str(max(l1))  # 将连续数字范围用"-"连接
        final_list.append(scop)
      else:
        scop = l1[0]
        final_list.append(scop)
    return final_list

for item in data1:
    if '-' in item:
        gap = item.split('-')
        for num in range(int(gap[0]),int(gap[1])+1):
            date1.append(int(num))
    else:
        date1.append(int(item))

if int(data2) not in date1 or int(data3) in date1:
    print("not available")
else:
    date1.remove(int(data2))
    date1.append(int(data3))
    date1.sort()
    xinde = list_str(date1)
    result = ','.join(f'{id}' for id in xinde)
    print(result)


在列表中找出有相同度的最小连续子列表,输出其长度

image-20220119205038551

da = input()
data = da.replace("[","").replace("]","").replace(' ',"").split(",")
oc_list = dict()
#z把元素出现的次数输入到字典中
for item in data:
    oc_list.update({f"{item}":0})
for item in data:
    oc_list[f"{item}"] += 1
#j找到所有的出现次数最大的值
maxitem_buffer = max(oc_list,key=oc_list.get)
maxitem = []
for key,value in oc_list.items():
    if value == oc_list.get(maxitem_buffer):
        maxitem.append(key)
#找到出现次数最大的元素的起始位置和最终位置
index_buffer = []
list_buffer = []
for item in maxitem:
    list_buffer.clear()
    for index,it in enumerate(data):
        if int(it) == int(item):
            list_buffer.append(index)
    index_buffer.append(list_buffer)
#计算最短的长度
len_buffer = []
for item in index_buffer:
    len_buffer.append(max(item)-min(item)+1)
print(min(len_buffer))

判断麻将是否胡牌

image-20220125174147666

笑死我了,我写了他妈一百多行代码,以后老板看到不把我骂死

try:
    data = input()
    data_list = data.split(' ')
    def nitian(data_list):
        #把他们全部放到c d s列表中
        c_list = []
        d_list = []
        s_list = []
        for item in data_list:
            if item.endswith('D'):
                d_list.append(item)
            elif item.endswith('S'):
                s_list.append(item)
            else:
                c_list.append(item)

        #要先找到连续的排再找到相同的排最后找做将的牌
        #定义一个找连续牌的函数,返回的是元组,第一个是n第二个是减去重复元素之后的列表
        def find_rconsecutive_data(listx):
            item_buffer = []
            result = 0
            for indexs,itemx in enumerate(listx):
                if len(item_buffer) == 3:
                    result += 1
                    for i in item_buffer:
                        listx.remove(i)
                item_buffer.clear()
                item_buffer.clear()
                listx.sort()
                item_buffer.append(itemx)
                for index,item in enumerate(listx):

                    if len(item_buffer) >= 3:
                        break
                    elif int(list(item)[0]) - int(list(item_buffer[-1])[0]) == 1:
                        item_buffer.append(item)

            for indexs,itemx in enumerate(listx):
                if len(item_buffer) == 3:
                    result += 1
                    for i in item_buffer:
                        listx.remove(str(i))
                item_buffer.clear()
                item_buffer.clear()
                listx.sort()
                item_buffer.append(itemx)
                for index,item in enumerate(listx):
                    if len(item_buffer) >= 3:
                        break
                    elif int(list(item)[0]) - int(list(item_buffer[-1])[0]) == 1:
                        item_buffer.append(item)


            return result,listx



        c = find_rconsecutive_data(c_list)
        s = find_rconsecutive_data(s_list)
        d = find_rconsecutive_data(d_list)
        ##重置所有东西,开始检测三个相同类型的牌
        new_data = c[1]+s[1]+d[1]
        n = int(c[0]) + int(s[0]) + int(d[0])
        c_list = []
        d_list = []
        s_list = []
        for item in new_data:
            if item.endswith('D'):
                d_list.append(item)
            elif item.endswith('S'):
                s_list.append(item)
            else:
                c_list.append(item)

        #定义一个函数检测列表中是不是有相同的牌,返回数字和删除相同元素之后的列表
        def find_repeat_data(listx):
            buffer = []
            result = 0
            for indexs,items in enumerate(listx):
                if len(buffer) >= 3:
                    result += 1
                    for itemxxx in buffer:
                        listx.remove(itemxxx)
                    buffer.clear()
                buffer.clear()
                buffer.append(items)
                for index,item in enumerate(listx):
                    if index == indexs:
                        pass
                    elif len(buffer) >= 3:
                        break
                    elif item == buffer[-1]:
                        buffer.append(item)

            for indexs,items in enumerate(listx):
                if len(buffer) >= 3:
                    result += 1
                    for itemxxx in buffer:
                        listx.remove(itemxxx)
                    buffer.clear()
                buffer.clear()
                buffer.append(items)
                for index,item in enumerate(listx):
                    if index == indexs:
                        pass
                    elif len(buffer) >= 3:
                        break
                    elif item == buffer[-1]:
                        buffer.append(item)

            return result,listx

        #再次重置东西,进行最后的做将判断
        s = find_repeat_data(s_list)
        c = find_repeat_data(c_list)
        d = find_repeat_data(d_list)
        DATA = s[1]+c[1]+d[1]
        n += s[0]+c[0]+d[0]
        if n >= 4 and len(DATA) == 0:
            return "yes"
        else:
            return "no"

    def zuojiang(data_list):
        repeat = []
        for indexx,itemx in enumerate(data_list):
            if len(repeat) == 2:
                for re in repeat:
                    data_list.remove(re)
                repeat.clear()
                return data_list
            repeat.clear()
            repeat.append(itemx)
            for index,item in enumerate(data_list):
                if index == indexx:
                    pass
                elif item == repeat[-1]:
                    repeat.append(item)
                    break
        return data_list




    #做不同的将,但凡有一个yes,那么我们就成功了
    result = []
    for i in range(len(data_list)):
        data_listx = [item for item in data_list]
        if i == 0:
            result.append(nitian(zuojiang(data_listx)))
        else:
            try:
                buffer_item = data_listx[0:i]
                del data_listx[0:i]
                buffer_zuojiang = zuojiang(data_listx)
                buffer_zuojiang += buffer_item
                result.append(nitian( buffer_zuojiang))
            except:
                result.append("no")
    if "yes" in result:
        print("yes")
    else:
        print("no")
except:
    print("no")

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。后续可能会有评论区,不过也可以在github联系我。