鱼C论坛

 找回密码
 立即注册
查看: 1399|回复: 9

[已解决]Caesar 密碼 Python

[复制链接]
发表于 2022-1-4 23:57:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我目前能想到的方式是一直用if跟else去更改每一個字母,但我不知道更簡潔的寫法怎麼去寫。

需求:
1.假設是以大寫字母去作為加密
2.能讓使用者自由輸入要加密的英文字串
3.要有要有input
4.能夠顯示加密跟解密

希望各位程式天才能教教我,正在努力學習
最佳答案
2022-1-5 22:29:31
caspar1 发表于 2022-1-5 22:11
不好意思能請問一下第一行在寫什麼嗎,我有點不太了解

lambda 是匿名函数,如果将我的代码拆开来会变成:
def Caesar(s, key = 1): # key = 1 为往后移 3 位,否则往前移 3 位
    res = ''
    for i in s:
        if i.isalpha():
            a = ord(i) # 字符对应的 ASCII 编号
            b = 32*i.islower() # 因为大小写字母 ASCII 相差 32
            c = 20*key # key = 1 就必须加20,否则加零,这是数学公式,有关取模,区间,这里很难解说
            x = chr(((a - (42 + b + c))%26) + 65 + b)
            res = res + x
        else:
            res = res + i
    return res

script = Caesar(input())
print(script)
print(Caesar(script, 0))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-5 00:33:05 | 显示全部楼层
本帖最后由 jackz007 于 2022-1-5 00:46 编辑
def Crypt(s , x):
    r = ''
    d = 3 if x == 0 else -3 
    for c in s:
        if 'A' <= c <= 'Z':
            r += chr(ord('A') + (ord(c) - ord('A') + d) % 26)
        elif 'a' <= c <= 'z':
            r += chr(ord('a') + (ord(c) - ord('a') + d) % 26)
        else:
            r += c
    return r

x = input() . strip()
if x:
    s1 = Crypt(x , 0)      # 对 x 加密
    s2 = Crypt(s1 , 1)     # 对 s1 解密
    print(s1)
    print(s2)
        运行实况:
D:\00.Excise\Python>Python x.py
Hello , World !
Khoor , Zruog !
Hello , World !

D:\00.Excise\Python>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-5 10:26:31 From FishC Mobile | 显示全部楼层
Caesar = lambda s, key = 1: ''.join([chr(((ord(i)-(42+(32*i.islower())+(20*key)))%26)+65+32*i.islower()) if i.isalpha() else i for i in s])
script = Caesar(input())
print(script)
print(Caesar(script, 0))
输入/输出结果:
Banana @&$%#}{][]} AAA ZZZ aaa zzz 123456
Edqdqd @&$%#}{][]} DDD CCC ddd ccc 123456
Banana @&$%#}{][]} AAA ZZZ aaa zzz 123456
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-5 22:11:32 | 显示全部楼层

不好意思能請問一下第一行在寫什麼嗎,我有點不太了解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-5 22:29:31 | 显示全部楼层    本楼为最佳答案   
caspar1 发表于 2022-1-5 22:11
不好意思能請問一下第一行在寫什麼嗎,我有點不太了解

lambda 是匿名函数,如果将我的代码拆开来会变成:
def Caesar(s, key = 1): # key = 1 为往后移 3 位,否则往前移 3 位
    res = ''
    for i in s:
        if i.isalpha():
            a = ord(i) # 字符对应的 ASCII 编号
            b = 32*i.islower() # 因为大小写字母 ASCII 相差 32
            c = 20*key # key = 1 就必须加20,否则加零,这是数学公式,有关取模,区间,这里很难解说
            x = chr(((a - (42 + b + c))%26) + 65 + b)
            res = res + x
        else:
            res = res + i
    return res

script = Caesar(input())
print(script)
print(Caesar(script, 0))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-1-6 16:08:04 | 显示全部楼层
傻眼貓咪 发表于 2022-1-5 22:29
lambda 是匿名函数,如果将我的代码拆开来会变成:

太感謝你了,好詳細!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-6 16:20:16 | 显示全部楼层
傻眼貓咪 发表于 2022-1-5 22:29
lambda 是匿名函数,如果将我的代码拆开来会变成:

不好意思我在請教一下,如果要解密的話是應該將什麼做更改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-6 16:28:25 From FishC Mobile | 显示全部楼层
caspar1 发表于 2022-1-6 16:20
不好意思我在請教一下,如果要解密的話是應該將什麼做更改

不用更改,我的代码已经齐全解密或加密 2个功能

Caesar(文本) # key 默认 1,表示加密(文本字符往后移3位)
Caesar(文本, 0) # key 为 0,表示解密(文本字符往前移3位)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-6 16:39:27 | 显示全部楼层
傻眼貓咪 发表于 2022-1-6 16:28
不用更改,我的代码已经齐全解密或加密 2个功能

Caesar(文本) # key 默认 1,表示加密(文本字符往后 ...

哇,真的非常感謝!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-6 16:43:38 From FishC Mobile | 显示全部楼层
caspar1 发表于 2022-1-6 16:39
哇,真的非常感謝!!!


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 13:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表