福尔摩斯的约会

大侦探福尔摩斯接到一张奇怪的字条:

我们约会吧! 
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

解题思想:这题总体来说是有点小变态的,参数较多,条件较多,其实思路不是很难,但是把这些东西糅杂在一起就很头疼了。那么这题不出意外也是一堆测试点无法通过,题目给出的样例可以正常输出,但是部分测试点无法通过,说一下思路。

 题目中可以看做三个变量:星期几,小时,分钟。

这里星期几我用了一个函数通过switch选择语句来完成。先将前两个数组进行逐一比较,第一个相同的字符必须是大写字母,所以这一点需要加入判断条件中。将第一次比较相同的数组内容存放入m1,再开始第二次比较。

第二次比较就只需要字符相同即可,按照题目要求,可以是字母,也可以是数字,第二次比较的结果代表时间的小时,这是我设置的第二个函数time,如果相同的值大于10,那么是通过ABCD表示的,所以这里我又用到了一个switch语句。

第三次比较则是从第三和第四个数组中进行比较,需要字母相同,所以条件字母得加入比较判断中,这次比较需要记录下的不是相等的数组中的内容,而是数组的下标,所以注意不要弄错了。

还有一个点就是,时间中的小时和分钟为个位数时,前面需要加0,所以需要分为一位数的情况和两位数的情况,一位数+0,两位数直接输出就行了。

本体思路大概就是这样吧,写太多了怕读者也懒得看,其他请看代码吧。


#include<stdio.h>
#include<string.h>


void time(char b)//这个函数是用来输出小时的,不同字母对应不同的时间
{
	switch(b)
	{
	case 'A':
		printf("10:");
		break;
	case 'B':
		printf("11:");
		break;
	case 'C':
		printf("12:");
		break;
	case 'D':
		printf("13:");
		break;
	case 'E':
		printf("14:");
		break;
	case 'F':
		printf("15:");
		break;
	case 'G':
		printf("16:");
		break;
	case 'H':
		printf("17:");
		break;
	case 'I':
		printf("18:");
		break;
	case 'J':
		printf("19:");
		break;
	case 'K':
		printf("20:");
		break;
	case 'L':
		printf("21:");
		break;
	case 'M':
		printf("22:");
		break;
	case 'N':
		printf("23:");
		break;
	default:
		break;
	}
}

void day(char a)//这个函数用来输出星期几
{
	switch(a)
	{
	case 'A':
		printf("MON ");
		break;
	case 'B':
		printf("TUE ");
		break;
	case 'C':
		printf("WED ");
		break;
	case 'D':
		printf("THU ");
		break;
	case 'E':
		printf("FRI ");
		break;
	case 'F':
		printf("SAT ");
		break;
	case 'G':
		printf("SUN ");
		break;
	default :
		break;
	}
}

int main()
{
	int n,i;
	int ls=1;//ls变量用来区分第一第二两个数组中比较时,哪个是第一个相等的,哪个是第二个相等的
	char m1,m2;
	char a[61];
	char b[61];
	char c[61];
	char d[61];
	scanf("%s",a);
	scanf("%s",b);
	scanf("%s",c);
	scanf("%s",d);
	//这里需要用strlen函数来求一下比较的两个数组的长度,循环的次数肯定要以长度短的那个为界限
	if(strlen(a)<strlen(b))
		n=strlen(a);
	else
		n=strlen(b);
	for(i=0;i<n;i++)
	{
		if(a[i]==b[i]&&a[i]>='A'&&a[i]<='Z'&&ls==1)//第一次相等,限制必须是大写字母
		{
			m1=a[i];
			ls=2;
		}
		else if(a[i]==b[i]&&ls==2)//第二次相等没有限制,是字符均可
		{
			m2=a[i];
		}
		
			
	}
	day(m1);//输出星期几

	if(m2>=0&&m2<=9)//这是小时为个位数的情况,此时前面得+0
	{
		printf("0");
		printf("%c:",m2);
	}
	else if(m2>='A'&&m2<='N')//这是小时为两位数的情况
	{
		time(m2);
	}

	if(strlen(c)<strlen(d))//和上面的意思一样
		n=strlen(c);
	else
		n=strlen(d);

	for(i=0;i<n;i++)
	{
		if(c[i]==d[i]&&c[i]>='a'&&c[i]<='z')
		{
			if(i<=9)
				printf("0%d",i);
			else 
				printf("%d",i);
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
福尔摩斯编码(Holmesian cryptanalysis)是指一种加密方式,也被称为基于替换的加密。在这种加密方式中,明文中的每个字母都被替换成另一个字母,而且每个字母的替换规则都是不同的。这种加密方式可以通过破解替换规则来解密。 在Django中实现福尔摩斯编码需要以下步骤: 1. 定义一个加密函数,该函数将明文字符串作为输入,返回加密后的字符串。在这个函数中,需要对每个字母进行替换,并且每个字母的替换规则都是随机生成的。 2. 定义一个解密函数,该函数将密文字符串作为输入,返回解密后的明文字符串。在这个函数中,需要破解替换规则,对每个字母进行替换,然后返回明文字符串。 3. 在Django中创建一个视图函数,该函数接收用户输入的明文,调用加密函数进行加密,然后将加密后的密文返回给用户。 4. 在Django中创建另一个视图函数,该函数接收用户输入的密文,调用解密函数进行解密,然后将解密后的明文返回给用户。 下面是一个简单的Django视图函数的实现示例: ```python from django.shortcuts import render import random def encode(request): if request.method == 'POST': plaintext = request.POST['plaintext'] ciphertext = encrypt(plaintext) return render(request, 'encode.html', {'ciphertext': ciphertext}) else: return render(request, 'encode.html') def decode(request): if request.method == 'POST': ciphertext = request.POST['ciphertext'] plaintext = decrypt(ciphertext) return render(request, 'decode.html', {'plaintext': plaintext}) else: return render(request, 'decode.html') def encrypt(plaintext): # Define substitution rules rules = {} letters = 'abcdefghijklmnopqrstuvwxyz' for letter in letters: rules[letter] = random.choice(letters) # Apply substitution rules to plaintext ciphertext = '' for letter in plaintext: if letter.lower() in letters: if letter.islower(): ciphertext += rules[letter] else: ciphertext += rules[letter.lower()].upper() else: ciphertext += letter return ciphertext def decrypt(ciphertext): # Find substitution rules rules = {} letters = 'abcdefghijklmnopqrstuvwxyz' for letter in letters: for i in range(len(ciphertext)): if ciphertext[i].lower() == letter: if ciphertext[i].islower(): rules[letter] = plaintext[i] else: rules[letter] = plaintext[i].upper() break # Apply substitution rules to ciphertext plaintext = '' for letter in ciphertext: if letter.lower() in letters: if letter.islower(): plaintext += rules[letter] else: plaintext += rules[letter.lower()].upper() else: plaintext += letter return plaintext ``` 该示例中,encode()函数处理明文输入并返回加密后的密文,decode()函数处理密文输入并返回解密后的明文。encrypt()函数生成随机替换规则并将其应用于明文,生成加密后的密文。decrypt()函数查找替换规则并将其应用于密文,生成解密后的明文。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

火花怪怪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值