题目
大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 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分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。输入格式:
输入在4行中分别给出4个非空、不包含空格、且长度不超过60的字符串。
输出格式:
在一行中输出约会的时间,格式为“DAY
HH:MM”,其中“DAY”是某星期的3字符缩写,即MON表示星期一,TUE表示星期二,WED表示星期三,THU表示星期四,FRI表示星期五,SAT表示星期六,SUN表示星期日。题目输入保证每个测试存在唯一解。输入样例:
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm输出样例:
THU 14:04
解析
实际的题意应该是:
找到前两个字符串第一个相同的大写字符(A~G)的位置,找到从这个位置后相同的大写字符(A~N)或者数字的位置。
找到后两个字符串的字母中相同的位置
然后按要求即可
代码
C++解法
#include <cmath> #include <iostream> #include <string> using namespace std; const char weekday[7][4] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; int main() { cin.tie(0); cin.sync_with_stdio(false); string a, b, c, d; cin >> a >> b >> c >> d; int len1 = min(a.size(), b.size()); int apos = -1; int bpos = -1; for (int i = 0; i < len1; ++i) { if (apos == -1) { if (a[i] == b[i] && a[i] >= 'A' && a[i] <= 'G') { apos = i; } } else { if (a[i] == b[i] && ((a[i] >= 'A' && a[i] <= 'N') || (a[i] >= '0' && a[i] <= '9'))) { if (i != apos) { bpos = i; break; } } } } int len2 = min(c.size(), d.size()); int cpos = -1; for (int i = 0; i < len2; ++i) { if (c[i] == d[i] && ((c[i] >= 'A' && c[i] <= 'Z')||(c[i] >= 'a' && c[i] <= 'z'))) { cpos = i; break; } } printf("%s %02d:%02d\n", weekday[a[apos] - 'A'], (a[bpos] <= '9' ? a[bpos] - '0' : a[bpos] - 'A' + 10), cpos); return 0; }
Python解法
read = [] try: while 1: s = input() if len(s) > 0: read.append(s) except: pass (a, b, c, d) = read weekday = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"] A = -1 B = -1 C = -1 def checkChar(c, a, b): if ord(c) >= ord(a) and ord(c) <= ord(b): return True else: return False length = min(len(a), len(b)) for i in range(length): if A == -1: if a[i] == b[i] and checkChar(a[i], 'A', 'G'): A = i else: if a[i] == b[i] and (checkChar(a[i], 'A', 'N') or a[i].isdigit()): B = i break length = min(len(c), len(d)) for i in range(length): if c[i] == d[i] and c[i].isalpha(): C = i print("%s %02d:%02d" % ( weekday[ord(a[A]) - ord('A')], ord(a[B]) - ord('0') if a[B].isdigit() else ord(a[B]) - ord('A') + 10, C))
Java解法
import java.io.BufferedReader; import java.io.InputStreamReader; class Main { public static final String[] weekday = { "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN" }; public static void main(String[] args) throws Exception{ BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); String a = input.readLine(); String b = input.readLine(); String c = input.readLine(); String d = input.readLine(); int A = -1, B = -1, C = -1; int len = Math.min(a.length(), b.length()); for (int i = 0; i < len; ++i) { char ac = a.charAt(i); char bc = b.charAt(i); if (A == -1) { if (ac == bc && ac >= 'A' && ac <= 'G') { A = i; } } else { if (ac == bc && ((ac >= 'A' && ac <= 'N') || (ac >= '0' && ac <= '9'))) { B = i; break; } } } len = Math.min(c.length(), d.length()); for (int i = 0; i < len; ++i) { char ac = c.charAt(i); char bc = d.charAt(i); if (ac == bc && ((ac >= 'A' && ac <= 'Z') || (ac >= 'a' && ac <= 'z'))) { C = i; break; } } System.out.printf("%s %02d:%02d\n", weekday[a.charAt(A) - 'A'], (a.charAt(B) <= '9' ? a.charAt(B) - '0' : a.charAt(B) - 'A' + 10), C); } }