Description
大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧!
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm
大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的字符是 E ,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A 到 N 表示);后面两字符串第 1 对相同的英文字母 s 出现在第 4 个位置(从 0 开始计数)上,代表第 4 分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。
Input
输入在 4 行中分别给出 4 个非空、不包含空格、且长度不超过 60 的字符串。
Output
在一行中输出约会的时间,格式为 DAY HH:MM,其中 DAY 是某星期的 3 字符缩写,即 MON 表示星期一,TUE 表示星期二,WED 表示星期三,THU 表示星期四,FRI 表示星期五,SAT 表示星期六,SUN 表示星期日。题目输入保证每个测试存在唯一解。
Sample Input
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm
Sample Output
THU 14:04
参考程序
def Getmin(a,b):
if a<b:
return a
else:
return b
def Find2(str1,str2):
length=Getmin(len(str1),len(str2))
cnt,i=0,0
ls=[]
while i <length:
if cnt==0:
if str1[i]==str2[i] and str1[i] in "ABCDEFG":
ls.append(str1[i])
cnt+=1
i+=1
else:
if str1[i]==str2[i]:
if str1[i] in "0123456789":
ls.append(str1[i])
break
elif str1[i] in "ABCDEFGHIJKLMN":
ls.append(str1[i])
break
else:
i+=1
else:
i+=1
return ls
def Find1(str1,str2):
m=Getmin(len(str1),len(str2))
for i in range(m):
if str1[i].isalpha() and str1[i]==str2[i]:
break
return i
st1=input()
st2=input()
st3=input()
st4=input()
week=" ABCDEFG"
hour="0123456789ABCDEFGHIJKLMN"
di={1:'MON',2:"TUE",3:"WED",4:"THU",5:"FRI",6:"SAT",7:"SUN"}
wh=Find2(st1,st2)
day=di[week.index(wh[0])]
hour=hour.index(wh[1])
print("{0} {1:02d}:{2:02d}".format(day,hour,Find1(st3,st4)))
注:
本题为PAT (Basic Level) Practice 1014题。并没有涉及复杂的算法,但在审题上需要特别仔细:
①两个用于搜索的字符串并不等长,但是是一位一位比,所以要考虑循环终止的条件,避免下标访问越界。
②先通过str1,str2来求星期几,需要满足字符相同且为大写字母,更重要的是注意到还要满足A~G与星期的一一对应关系,不能超出这个范围,否则就表示不出星期几了
③确定星期几以后,再继续往下搜索,确定小时。这里也是通过后边的对应关系来“推测”条件。根据“一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A 到 N 表示”,可以得出,要满足字符相等,或者是0~9的数字,或者是A-N(对应10-23小时)的大写字母。所以相等的小写字母是不可以的。这是对“第 2 对相同的字符”的理解。求出小时数以后即可退出循环。
④小时数、分钟数都要格式化为两位整数,高位用0填满。
另外,在PAT的评测系统中,若提交结果为“非零返回”,要特别注意程序在运行时是否发生了异常,比如下标访问过界、一些方法调用返回的异常等