OJ : The Hardest Problem Ever

目录

1.题目

2.中文翻译

3.思路分析

4.代码

5.coding而知新


1.题目

                                                        The Hardest Problem Ever

Problem Description

        Julius Caesar lived in a time of danger and intrigue. The hardest situation Caesar ever faced was keeping himself alive. In order for him to survive, he decided to create one of the first ciphers. This cipher was so incredibly sound, that no one could figure it out without knowing how it worked.
        You are a sub captain of Caesar's army. It is your job to decipher the messages sent by Caesar and provide to your general. The code is simple. For each letter in a plaintext message, you shift it five places to the right to create the secure message (i.e., if the letter is 'A', the cipher text would be 'F'). Since you are creating plain text out of Caesar's messages, you will do the opposite:

        Cipher text
        A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

        Plain text
        V W X Y Z A B C D E F G H I J K L M N O P Q R S T U

        Only letters are shifted in this cipher. Any non-alphabetical character should remain the same, and all alphabetical characters will be upper case.

Input

        Input to this problem will consist of a (non-empty) series of up to 100 data sets. Each data set will be formatted according to the following description, and there will be no blank lines separating data sets. All characters will be uppercase.

        A single data set has 3 components:

        Start line - A single line, "START"

        Cipher message - A single line containing from one to two hundred characters, inclusive, comprising a single message from Caesar

        End line - A single line, "END"

        Following the final data set will be a single line, "ENDOFINPUT".

Output

        For each data set, there will be exactly one line of output. This is the original message by Caesar.

Sample Input

START

NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX

END

START

N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ

END

START

IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ

END

ENDOFINPUT

Sample Output

IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES

I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME

DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE

2.中文翻译

有史以来最棘手的问题

题目描述

        尤利乌斯·凯撒生活在一个充满危险和阴谋的时代。凯撒所面临的最艰难的处境就是保住自己的性命。为了让他活下来,他决定创造第一批密码之一。这个密码非常可靠,没有人能在不知道它是如何工作的情况下弄清楚它。

        你是凯撒军队的副队长。你的工作是破译凯撒发送的信息并提供给你的将军。代码很简单。对于明文消息中的每个字母,您将其向右移动五位以创建安全消息(即,如果字母是“a”,则密文将是“F”)。既然你是在凯撒的信息中创建纯文本,你需要翻译凯撒密码:

        密码文本

        A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

        纯文本

        V W X Y Z A B C D E F G H I J K L M N O P Q R S T U

        这个密码只有字母移位。任何非字母字符都应该保持不变,所有字母字符都是大写。

输入

        此问题的输入将由一系列(非空)多达100个数据集组成。每个数据集都将根据以下描述进行格式化,并且不会有分隔数据集的空行。所有字符均为大写。

        单个数据集包含3个组件:

                起始行-单行“Start”

                密码信息-包含一到两百个字符的单行,包括凯撒的一条信息

                结束线-单行,“End”

                最后的数据集后面将是一行,“ENDOFINPUT”。

输出

        对于每个数据集,将恰好有一行输出。这是凯撒的原始信息。

标准输入

START
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX
END
START
N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ
END
START
IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ
END
ENDOFINPUT

标准输出

IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES
I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME
DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE

3.思路分析

  1. 补充知识: “ A的ASCII码是65,a的ASCII码是97 ”。
  2. 现在英文(English)所基于的字母,共26个 : 所以A~Z对应的assic码的值:65~97
  3. 仔细观察凯撒密码表和平凡密码表:一定注意字母之间的对应关系:关系如下
#x表示凯撒密码(和题目相对应,分别按顺序对应26个字母)
char x[]={'V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'};
#a是存储凯撒密码表示的字符串(也就是输入的字符串),下面的意思就是翻译修改a[i],因为最后还是打印输出a,但是此时打印输出的a是翻译过后的a
a[i]=x[a[i]-'A'];

4.代码

#encoding=utf-8
#outputlist用来保存编译后的密码集合
outputlist=[]

#X表示凯撒密码
X=['V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U']

#主程序
while(True):
    #a接受第一个信号:比如START
    a=input()
    if a[0]=="E":
        break
    else:
        #b接收密码文本信号
        b=input()

        #c接收第三个信号:比如END
        c=input()

        lenstrb=int(len(b))
        #因为在python中字符串是不可变类型,所以需要把字符串转换成list进行操作
        listb=list(b)

        for i in range(lenstrb):
            #标点符号和空格列表元素保持不变
            if listb[i]==" " or listb[i]=="," or listb[i]=="." or listb[i]=="!" or listb[i]=="?":
                listb[i]=listb[i]
            #翻译密码
            else:
                listb[i]=X[ord(listb[i])-ord("A")]

        outputlist.append(listb)
#依次打印每个密码文本
for i in outputlist:
    for j in i:
        print(j,end="")
    print()

5.coding而知新

1.思路代码(有错误):

X=['V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U']
while(True):
    a=input()
    if a[0]=="E":
        break
    else:
        b=input()
        c=input()
        for i in b:
            i=X[ord(i)-ord("A")]

 上面的错误是因为没有进行字符段空格或者标点符号的排除,list在直接使用空格或者标点符号作为下标的时候会导致 list index out of range的错误。

2.python怎么做ascii码的减法运算

        ASCII 码是一种将字符映射成数字的编码方式,每个字符都有自己对应的 ASCII 码值。在 Python 中,可以通过内置函数 ord() 获得一个字符的 ASCII 码值,chr() 函数将一个 ASCII 码值转换为对应的字符。

        要进行 ASCII 码的减法运算,首先需要将两个字符分别转换为对应的 ASCII 码值,然后将这两个 ASCII 码值作差,最后再用 chr() 将结果转换回对应的字符。例如:

char1 = 'd'
char2 = 'a'
diff = ord(char1) - ord(char2)
print(diff)  # 输出:3

        这里从字符 'd' 对应的 ASCII 码值(100)中减去了字符 'a' 对应的 ASCII 码值(97),得到的差为 3。如果要将这个差值转换回对应的字符,可以使用如下代码:

result = chr(ord(char1) - ord(char2))
print(result)  # 输出:'\x03'

        这里的 \x03 是一个控制字符,代表 ASCII 码值为 3 的字符,它是不可打印字符,因此输出时会以转义字符的形式显示出来。

3.'str' object does not support item assignment

        这个错误通常发生在试图修改字符串中某一个字符时。需要注意的是,Python 中的字符串属于不可变对象(immutable object),也就是说,一旦创建,就不能被修改。

        要解决这个问题,需要使用其他方法来实现所需的修改操作,而不能直接在原字符串上进行修改。一种常见的方法是将字符串转换为列表(list)类型,然后进行修改操作,最后将列表转换回字符串

        例如:

s = "hello"
lst = list(s)
lst[0] = "H"  # 将第一个字符改为大写字母
new_s = "".join(lst)  # 将列表转换回字符串
print(new_s)  # 输出 "Hello"

4.python代码用于打印列表中的列表,怎么让列表中的的列表分行打印?

# 依次打印每个密码文本
for i in outputlist:
    for j in i:
        print(j, end="")
    # 在内部循环结束后输出一个换行符
    print()

        这里我们在每次内部循环结束后输出一个换行符,这会让下一轮循环从新的一行开始打印。这样修改之后,原来连续的所有密码文本都会被分成多行打印,每行只包含一个密码文本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值