PAT乙级 1014.福尔摩斯的约会

67

题意有坑

题目


原题链接

大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 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);

    }
}
发布评论
  • 点击查看/关闭被识别为广告的评论