实用Python程序设计测验汇总031:石头剪刀布~040:成绩排序

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

031:石头剪刀布​​​​​​​

032:统计数字字符个数​​​​​​​​​​​​​​

033:大小写字母互换​​​​​​​​​​​​​​

034:过滤多余的空格​​​​​​​​​​​​​​

035:找第一个只出现一次的字符​​​​​​​​​​​​​

036:判断字符串是否为回文​​​​​​​​​​​​​​

037:字符串最大跨距​​​​​​​​​​​​​​

038:找出全部子串位置​​​​​​​​​​​​​​

039:万年历​​​​​​​​​​​​​​

040:成绩排序​​​​​​​​​​​​​​


031:石头剪刀布​​​​​​​​​​​​​​

总时间限制: 

1000ms

内存限制: 

65536kB

描述

石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。

一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小A和小B比了N轮之后,谁赢的轮数多?

输入

输入包含三行。
第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。0 < N,NA,NB < 100。
第二行包含NA个整数,表示小A出拳的规律。
第三行包含NB个整数,表示小B出拳的规律。
其中,0表示“石头”,2表示“剪刀”,5表示“布”。相邻两个整数之间用单个空格隔开。

输出

输出一行,如果小A赢的轮数多,输出A;如果小B赢的轮数多,输出B;如果两人打平,输出draw。

样例输入

10 3 4
0 2 5
0 5 0 2

样例输出

A

提示

对于测试数据,猜拳过程为:
A:0 2 5 0 2 5 0 2 5 0
B:0 5 0 2 0 5 0 2 0 5
A赢了4轮,B赢了2轮,双方打平4轮,所以A赢的轮数多。

代码:

#032 石头剪刀布
def result(a,b):
    if a==b:
        return 0
    if a==5 and b==0:
        return 1
    if a==0 and b==5:
        return -1
    if a<b:
        return 1
    else:
        return -1
#首先输入比赛轮数、小A出拳周期长度,小B出拳周期长度
N,NA,NB=map(int,input().split())
#分别依次输入他们的出拳类型
SA=input().split()
SB=input().split()
#初始赢输置零
winA=winB=0
#下标设初值为零
ptrA=ptrB=0
for i in range(N):
    r=result(int(SA[ptrA]),int(SB[ptrB]))
    if r==1:
        winA+=1
    elif r==-1:
        winB+=1
    ptrA=(ptrA+1)%NA
    ptrB=(ptrB+1)%NB
if winA>winB:
    print("A")
elif winA<winB:
    print("B")
else:
    print("draw")

032:统计数字字符个数​​​​​​​​​​​​​​

总时间限制: 

1000ms

内存限制: 

65536kB

描述

输入一行字符,统计出其中数字字符的个数。

输入

一行字符串,总长度不超过255。

输出

输出为1行,输出字符串里面数字字符的个数。

样例输入

Peking University is set up at 1898.

样例输出

4

代码:

#033:统计数字字符个数
s=input()
count=0
for i in s:
    if 48<=ord(i)<=57:
        count+=1
print(count)

033:大小写字母互换​​​​​​​​​​​​​​

总时间限制: 

1000ms

内存限制: 

65536kB

描述

把一个字符串中所有出现的大写字母都替换成小写字母,同时把小写字母替换成大写字母。

输入

输入一行:待互换的字符串。

输出

输出一行:完成互换的字符串(字符串长度小于80)。

样例输入

If so, you already have a Google Account. You can sign in on the right. 

样例输出

iF SO, YOU ALREADY HAVE A gOOGLE aCCOUNT. yOU CAN SIGN IN ON THE RIGHT. 

代码:

#034:大小写字母互换
s=input()
for i in s:
    if "a"<=i<="z":
        print(chr(ord(i)-32),end="")
    elif "A"<=i<="Z":
        print(chr(ord(i)+32),end="")
    else:
        print(i,end="")

034:过滤多余的空格​​​​​​​​​​​​​​

总时间限制: 

1000ms

内存限制: 

65536kB

描述

一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。

输入

一行,一个字符串(长度不超过200),句子的头和尾都没有空格。

输出

过滤之后的句子。

样例输入

Hello      world.This is    c language.

样例输出

Hello world.This is c language.

代码:

#035:过滤多余的空格
s=input().split(" ")
s1=[]
for c in s:
    if c!="":
        s1.append(c)
for i in s1:
    print(i,end=" ")

035:找第一个只出现一次的字符​​​​​​​​​​​​​

总时间限制: 

1000ms

内存限制: 

65536kB

描述

给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。

输入

一个字符串,长度小于100000。

输出

输出第一个仅出现一次的字符,若没有则输出no。

样例输入

abcabd

样例输出

c

代码:

# #036:找第一个只出现一次的字符
s=input()
for i in range(len(s)):
        if s[i] not in (s[i+1:]+s[:i]):
            print(s[i])
            break
        if i==len(s)-1:
            print("no")

036:判断字符串是否为回文​​​​​​​​​​​​​​

总时间限制: 

1000ms

内存限制: 

65536kB

描述

输入一个字符串,输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。

输入

输入为一行字符串(字符串中没有空白字符,字符串长度不超过100)。

输出

如果字符串是回文,输出yes;否则,输出no。

样例输入

abcdedcba

样例输出

yes

代码:

#037:判断字符串是否为回文
s=input()
if s[::-1]==s:
    print("yes")
else:
    print("no")

037:字符串最大跨距​​​​​​​​​​​​​​

总时间限制: 

1000ms

内存限制: 

65536kB

描述

有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10。想检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在S中互不交叉(即,S1的右边界点在S2的左边界点的左侧)。计算满足上述条件的最大跨距(即,最大间隔距离:最右边的S2的起始点与最左边的S1的终止点之间的字符数目)。如果没有满足条件的S1,S2存在,则输出-1。

例如,S = "abcd123ab888efghij45ef67kl", S1="ab", S2="ef",其中,S1在S中出现了2次,S2也在S中出现了2次,最大跨距为:18。

输入

三个串:S, S1, S2,其间以逗号间隔(注意,S, S1, S2中均不含逗号和空格);

输出

S1和S2在S最大跨距;若在S中没有满足条件的S1和S2,则输出-1。

样例输入

abcd123ab888efghij45ef67kl,ab,ef

样例输出

18

代码:

S0=input().split(",")
S,S1,S2=S0[0],S0[1],S0[2]
#分别求出两个子串的位置,由于S1位于S2左边,所以S2需要从右向左查找
S1_right=S.find(S1)+len(S1)
S2_left=S.rfind(S2)
if S1_right<=S2_left:
    print(S2_left-S1_right)
else:
    print(-1)

038:找出全部子串位置​​​​​​​​​​​​​​

总时间限制: 

1000ms

内存限制: 

65536kB

描述

输入两个串s1,s2,找出s2在s1中所有出现的位置

两个子串的出现不能重叠。例如'aa'在 aaaa 里出现的位置只有0,2

输入

第一行是整数n
接下来有n行,每行两个不带空格的字符串s1,s2

输出

对每行,从小到大输出s2在s1中所有的出现位置。位置从0开始算
如果s2没出现过,输出 "no"
行末多输出空格没关系

样例输入

4
ababcdefgabdefab ab
aaaaaaaaa a
aaaaaaaaa aaa 
112123323 a

样例输出

0 2 9 14 
0 1 2 3 4 5 6 7 8 
0 3 6 
no

代码:

n=int(input())
for i in range(n):
    a=input().split()
    S1,S2=a[0],a[1]
    index = 0
    count = 0
    while index<len(S1):
        M=S1.find(S2,index)
        if M!=-1:
            count=1
            print(M,end=' ')
            index=M+len(S2)
        else:
            break

    if count==0:
        print('no',end='')
    print('\n',end='')

039:万年历​​​​​​​​​​​​​​

总时间限制: 

1000ms

内存限制: 

65536kB

描述

给定年月日,求星期几。已知2020年11月18日是星期三。另外,本题有公元0年,这个和真实的纪年不一样

输入

第一行是n(n <=30),表示有n组数据
接下来n行,每行是一组数据。
每行三个整数y,m,d,分别代表年,月,日。(-1000000<=y<=1000000)

若今年是2017年,则往前就是2016年,2015年....一直数到2年,1年,再往前就是0年,-1年,-2年.....

输出

对每组数据,输出星期几,星期几分别用

"Sunday","Monday","Tuesday","Wednesday","Thursday", "Friday","Saturday" 表示

如果月份和日期不合法,输出"Illegal"

样例输入

6
2017 2 29
2017 13 2
0 1 1
-2 3 4
2017 10 18
2015 12 31

样例输出

Illegal
Illegal
Saturday
Wednesday
Wednesday
Thursday

代码:

xq=["Sunday","Monday","Tuesday","Wednesday","Thursday", "Friday","Saturday"]
n=int(input())
for n1 in range(n):
    monthDays = [-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    days = 0
    lst = input().split()
    year, month, date = int(lst[0]), int(lst[1]), int(lst[2])

     # 该模块判断是否合法
    buhefa=0
    if month>12 or month<1:
        buhefa=1

    else:
        if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
            if (date < 1 or date > monthDays[month]) and month != 2:
                buhefa = 1
            if month == 2 and date > 29:
                buhefa = 1
        else:
            if date < 1 or date > monthDays[month]:
                buhefa = 1
    # 该模块判断是否合法

    if buhefa:    # 不合法
        print("Illegal")
    else:         # 合法
        if year >= 2012:
            for y in range(2012, year):  # 先累加过掉的整年的天数
                if y % 4 == 0 and y % 100 != 0 or y % 400 == 0:  # 闰年
                    days += 366
                else:
                    days += 365
            if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
                monthDays[2] = 29
            for i in range(1, month):  # 再累加year那年过掉的整月的天数
                days += monthDays[i]
            days += date  # 累加year年month那个月的天数
            days -= 22  # 2012年1月22日是星期天。扣掉2012年的前22天
            print(xq[days % 7])  # 星期天算一周的第0天
        else:
            for y in range(year, 2012):
                if y % 4 == 0 and y % 100 != 0 or y % 400 == 0:  # 闰年
                    days += 366
                else:
                    days += 365
            if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
                monthDays[2] = 29
            for i in range(1, month):  # 减去多余的
                days -= monthDays[i]
            days -= date # 同上需要减去多余的
            days += 22	# 加上需要的
            print(xq[(7 - days % 7) % 7]) # 

040:成绩排序​​​​​​​​​​​​​​

总时间限制: 

1000ms

内存限制: 

65536kB

描述

给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。

输入

第一行为n (0 < n < 20),表示班里的学生数目;
接下来的n行,每行为每个学生的名字和他的成绩, 中间用单个空格隔开。名字只包含字母且长度不超过20,成绩为一个不大于100的非负整数。

输出

把成绩单按分数从高到低的顺序进行排序并输出,每行包含名字和分数两项,之间有一个空格。

样例输入

4
Kitty 80
Hanmeimei 90
Joey 92
Tim 28

样例输出

Joey 92
Hanmeimei 90 
Kitty 80
Tim 28

代码:

n = int(input())
a = []
for i in range(n):
    s = input().split()
    a.append((s[0],int(s[1])))
a.sort(key = lambda x:(-x[1],x[0]))
for x in a:
    print(x[0],x[1])

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷酷滴Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值