python
名剑求瑕
风满楼,卷黄沙,舞剑春秋,名震天下!
展开
-
文件合并工具
myFile.pyimport os'''获取dirpath文件夹下所有txt文件的路径'''def getTxtPaths(dirpath): paths = [ ] filenames = os.listdir(dirpath) for filename in filenames : filepath = os.path.join(dirpath,filename) if os.path.isfile(filepath) and fil转载 2021-12-06 21:34:20 · 415 阅读 · 0 评论 -
图像亮度调整
任务描述背景 亮度调整是数字图像处理基本操作之一,如下图所示。题外话:该图是图像处理领域知名度最高的图像之一,被广泛用于图像处理技术效果的测试,图中人物叫 Lena。 根据 RGB 颜色的原理可知,要调整一个颜色的亮度,可以将红、绿、蓝三个颜色分量都加上相同的调整量 n,n 是 [−255,255] 之间的整数,例如,当 n 为 50 时,RGB颜色 (148,65,93) 变为 (198,115,143),效果见下图。 任务 本关任务是实现函数enhancePixel(r, g,原创 2021-11-24 10:56:21 · 3786 阅读 · 1 评论 -
扩展到可视字符
任务描述 之前程序只能处理 26 个小写英文字母,而不支持其它字符,如大写字母、数字、标点等。但这些字符在实际使用中也会大量出现,需要进行支持,才能更好的保护信息。 本关任务是对凯撒加密方法进行扩展,使其能够进一步处理其它英文字符。相关知识可视字符 实际上,在 ASCII 编码表中总共包含 95 个可视字符,即下图红框中的字符。可视字符是能够在屏幕上显示出来,或者说能看得见的字符。剩下的 33 个字符是控制字符,是看不见的,如删除符、换行符等。可视字符基本上涵盖了所有常见的英文字符,包括原创 2021-11-23 22:07:41 · 569 阅读 · 0 评论 -
解密一段文本
任务描述 本关任务是对密文进行解密,还原出明文。相关知识 其实解密和加密的原理是一样的,都是循环偏移,只不过加密时是正向移动,而解密时是反向移动。所以只要知道加密时的偏移量,解密时反着移动相同的偏移量,即循环移动 −key 位就可以了。编程要求 Begin-End 区间给出的是上关的过关程序,能对文本text进行凯撒加密。修改代码,使其能够实现解密。测试说明 例如,测试集 1 的输入为:cvvcem vqpkijv!测试集 1 的输出为:cvvcem vqpkijv! ->原创 2021-11-23 22:01:33 · 345 阅读 · 0 评论 -
【无标题】
任务描述 完成了一个字符的加密,对一整段文本进行加密就比较简单了,只要对文本里面的字符逐一处理。 本关任务是加密一段文本。相关知识 在实现时,有个地方要注意一下,enChar函数只能处理小写英文字母,但在文本里面可能还有其它字符,如大写字母、数字、标点符号、空格等。 所以,在处理文本中的某个字符x时,要先判断一下,如果x是小写字母(即’a’<=x<=‘z’),就使用enChar函数加密,否则不加密(保持不变)。编程要求 在 Begin-End 区间实现Caesar(tex原创 2021-11-23 21:58:04 · 371 阅读 · 0 评论 -
加密一个小写字母(续)
任务描述 上关方法并不能正确处理所有小写英文字母,比如’y’偏移 2 位得到的是’{’。这是因为在 ASCII 编码表中,‘y’向后移动 2 位对应的字符就是’{’。而凯撒加密规定,如果偏移时超过了字符’z’,就重新从’a’开始,所以’y’偏移 2 位得到的应该是’a’。这种偏移方式称为循环偏移。 本关任务是利用循环偏移方式加密一个小写英文字母。相关知识循环偏移的实现 先不考虑 ASCII 码,给 26 个小写字母重新编号,‘a’~'z’的编号依次是 0~25。设某个字符 x 的编号是 xi原创 2021-11-23 21:52:09 · 761 阅读 · 0 评论 -
加密一个小写字母
任务描述 凯撒加密的过程是依次对明文中的每个字符进行处理。对于每个字符,按字母表顺序进行一定偏移,就得到了对应的密文字符。 如下图,当偏移量为 2 时,字符’a’按字母表顺序向后移动 2 位,对应的就是字符’c’,所以’a’对应的密文就是’c’。类似地,‘b’对应的是’d’、‘c’对应的是’e’,等等。如果偏移后超过了字母表的范围,就从头开始。比如’y’偏移 1 位是’z’,再往后偏移 1 位,后面没有字符了,就又从’a’开始,所以’y’偏移两位对应的是’a’,而’z’偏移两位得到的是’b’。原创 2021-11-23 21:40:08 · 1161 阅读 · 0 评论 -
python浮点数
背景 定点整数只能表示二进制整数,如 −11,而定点小数只能表示仅包含小数部分的二进制纯小数,如 −0.1。但更多时候,数值是既包含整数部分又包含小数部分的二进制混合数,如 −11.1。要表示混合数,需要使用浮点数。 在本关中,假设阶码和尾数都用 8 位补码表示,则对于一个二进制混合数 x,如果 x=0,则其规格化浮点数是全 0,否则按如下方法计算:至此,彻底解决了计算机如何用 0 和 1 表示二进制数中 +、− 和 . 的问题。任务 本关任务是实现ZhenToFu(z)函数,其功能是原创 2021-11-23 17:16:02 · 5747 阅读 · 1 评论 -
python定点数
任务描述背景 第 1 关提到,二进制中除了 0 和 1,还有 +、− 和 .,而计算机底层只有 0 和 1。之前关卡解决的是如何用 0 和 1 表示正负号的问题,从本关开始要进一步解决小数点的问题。 问题的难点在于不能直接用 0 和 1 表示小数点这个符号。例如,若用 1 表示小数点,则二进制数 101.01 对应的表示为 101101,计算机无法区分哪个 1 是小数点,用 0 或其它 01 串表示都存在类似问题。 解决方法是固定小数点的位置。例如,可以做如下规定,在 8 位原码中,小数点位置原创 2021-11-23 14:35:25 · 2543 阅读 · 0 评论 -
python补码
任务描述背景 上关提到,计算机底层一般采用补码表示数值。真实值对应的补码计算过程如下:真实值为正时,补码等于原码,如 +1001 的 8 位补码是 00001001;真实值为负时,反码加 1 即得补码,也就是将原码的数字部分按位取反后再加 1,如 −1001 的 8 位原码是 10001001,按位取反是 11110110,再加 1 得补码 11110111。 如果你不太熟悉该过程,可以参照上面的例题尝试以下计算: 可以看到,+0 和 −0 的补码相同,都是全 0,而原码和反码没有这一性原创 2021-11-23 10:50:26 · 4303 阅读 · 0 评论 -
python反码
任务描述背景 原码的优点是容易理解、便于转换,缺点是符号位不能参与加法运算。例如,真实值 −1 和 +1 相加结果是 0,若用 4 位原码进行运算,过程如下:−1 和 +1 对应的原码分别是 1001 和 0001;1001+0001=1010;1010 对应的真实值是 −10,计算结果错误。 所以,如果原码的符号位参与运算,则会得到错误结果,如果不参与运算,则要对符号位进行额外处理,这会增加硬件实现的复杂程度,降低计算速度。而加法运算是计算机最为核心的一个功能,其速度在很大程度上决定了整个原创 2021-11-23 10:23:35 · 2607 阅读 · 0 评论 -
python原码
背景 我们知道,计算机底层利用二进制表示数值,更准确的说,应该是利用 0 和 1 进行表示。“01 表示”和“二进制”是两个不同的概念,因为 01 表示用到的符号只有 0 和 1 两个,再无其它,而在二进制中,除了 0 和 1 之外,还有 +、− 和 .。因此,要让计算机能够表示二进制数,还需要进行一些处理,这便产生了“码制”的概念,而“原码”便是一种“码制”。 原码可以解决 +、− 的问题,它用 0 表示 +,用 1 表示 −,如二进制数 −1001 对应的原码是 11001,记作 [−1001]原创 2021-11-23 10:05:31 · 1251 阅读 · 0 评论 -
对汉字加解密
#对汉字加解密def enChar(x,key): # 加密 xid = ord(x)-first_ascll # 明文编号 yid = (xid+key) % n # 密文编号 y = chr(first_ascll+yid) # 求出密文字符 return yfirst_ascll = 0 # 起始字符n = 65536 # 字符总数def Caesar(text,key): result = '' for x in text:原创 2021-11-18 21:04:56 · 859 阅读 · 0 评论 -
对ASCLL码表中95个可视化字符的支持
#对ASCLL码表中95个可视化字符的支持def enChar(x,key): # 加密 xid = ord(x)-first_ascll # 明文编号 yid = (xid+key) % n # 密文编号 y = chr(first_ascll+yid) # 求出密文字符 return yfirst_ascll = ord(' ') # 起始字符n = 95 # 字符总数def Caesar(text,key): result = ''原创 2021-11-18 20:53:59 · 352 阅读 · 0 评论 -
小写字母加解密
def enChar(x,key): # 加密 xid = ord(x)-first_ascll # 明文编号 yid = (xid+key) % n # 密文编号 y = chr(ord('a')+yid) # 求出密文字符 return yfirst_ascll = ord('a') # 起始字符n = 26 # 字符总数def Caesar(text,key): result = '' for x in text: #原创 2021-11-18 20:51:49 · 145 阅读 · 0 评论 -
加密一个小写字母
def enChar(x,key): xid = ord(x)-ord('a') # 明文编号 yid = (xid+key)%26 # 密文编号 y = chr(ord('a')+yid) # 求出密文字符 return ys = enChar('a',200)print(s)原创 2021-11-17 20:10:21 · 222 阅读 · 0 评论 -
解析IP地址
背景 互联网上分布着很多设备,如电脑、手机、智能手表等。设备与设备之间会互相通信,如你给朋友发送一条微信语音信息,其实就是你的手机在与朋友的手机进行通信。 但是,这条信息为什么会准确到达你朋友的手机,而不是其他设备?这是因为网络上的每台设备都有一个唯一的网络地址。如果把网络信息看作日常生活中的信件,网络地址就是信件上的收件人地址,有了这个地址,信息就能准确到达网络上的某一设备。 网络地址有不同类型,如 MAC 地址、IP 地址、URL 等,本关针对的是 IP 地址。IP 地址目前主要有两个版本:原创 2021-11-17 18:54:27 · 5108 阅读 · 0 评论 -
二进制加法
########## Begin ##########def add(a, b): la = [i for i in a] lb = [i for i in b] if len(a) < len(b): for i in range(len(b)-len(a)): la.insert(0, '0') else: for i in range(len(a)-len(b)): lb.inse原创 2021-11-17 16:59:35 · 372 阅读 · 0 评论 -
逻辑运算-与或非异或
########## Begin ##########def AND(a,b): c = '' for i,j in zip(a,b): if i==j and i=='1': c = c + '1' else: c = c + '0' return cdef OR(a,b): c = '' for i,j in zip(a,b): if i==j and i=='0原创 2021-11-17 16:05:24 · 236 阅读 · 0 评论 -
二进制计量单位
########## Begin ##########def unit_convert(a): if a >= 2**40: b = f'{round(a/2**40, 1)}T' elif a >= 2**30: b = f'{round(a/2**30, 1)}G' elif a >= 2**20: b = f'{round(a/2**20, 1)}M' else: b = f'{roun原创 2021-11-17 15:34:44 · 521 阅读 · 0 评论 -
二进制到十六进制
########## Begin ##########ds = {}ds['0000'] = '0'ds['0001'] = '1'ds['0010'] = '2'ds['0011'] = '3'ds['0100'] = '4'ds['0101'] = '5'ds['0110'] = '6'ds['0111'] = '7'ds['1000'] = '8'ds['1001'] = '9'ds['1010'] = 'A'ds['1011'] = 'B'ds['1100'] = 'C'原创 2021-11-17 14:58:59 · 155 阅读 · 0 评论 -
二进制到十进制-输入为正数
########## Begin ##########def BinToDec(b): s = 0 L = str(b).split('.') if len(L) == 2: # 有小数 l = [int(i) for i in L[0]] lx = [int(i) for i in L[1]] l,lx = l[::-1],lx[::-1] for i in range(len(l)-1,-1-len原创 2021-11-17 11:19:53 · 248 阅读 · 0 评论 -
算法复杂度-数值信息——除二取余
cache = [1, 1] #用于存储已算出的项,第i号元素对应第i+1项,最开始时存放了第1、2项def F(n): if len(cache)>=n: #先到列表中查询,若列表中包含了F(n) return cache[n-1] #则直接返回F(n) else: #否则计算F(n) Fn = F(n-1)+F(n-2) #计算F(n)的方法与之前相同 cache.append(Fn原创 2021-11-16 14:34:29 · 675 阅读 · 0 评论 -
绘制迫击炮弹运行轨迹
########## Begin ##########import numpy as npimport matplotlib.pyplot as pltdef calBombTrace(d, v0=50, n=30): g = 9.8 tmax = 2*v0*np.sin(np.radians(d))/g t = np.linspace(0, tmax, n) xt = v0*t*np.cos(np.radians(d)) yt = v0*t*np.sin(np原创 2021-11-16 13:55:50 · 1412 阅读 · 0 评论 -
绘制拟合出的直线
作者:周竞文(jwzhou@nudt.edu.cn)、徐建军来源:国防科技大学期中考试试题(2019 秋)领域:数学难度:★★★★★任务描述背景任务相关知识编程要求测试说明任务描述背景 人们经常会碰到 (x,y) 形式的二维数据。例如,青少年的年龄为 x、身高为 y,多个青少年的数据就形成了一系列的 (x,y);城市人口数量为 x、平均房价为 y,多个城市就对应了多个 (x,y);学生每天学习本门课程的平均时长为 x、课程的最终成绩为 y,则班上同学也会对应着许多的 (x,y)。原创 2021-11-15 17:52:01 · 596 阅读 · 0 评论 -
绘制大西洋中脊剖面轮廓
绘制大西洋中脊剖面轮廓700任务要求参考答案评论162作者:周竞文(jwzhou@nudt.edu.cn)、李暾来源:国防科技大学期末考试试题(2017 秋)领域:海洋、地理难度:★★★★任务描述背景任务相关知识编程要求测试说明任务描述背景 大西洋中脊是位于大西洋的一条海底山脊。如下图左部(来源:WriteWork)所示,它从北冰洋一直延伸到非洲南端附近,全长约 1.6 万公里,差不多贯穿地球南北,规模远超陆地上任何山脉。据测量,大西洋中脊宽度约为 1000 ~1300原创 2021-11-15 16:16:04 · 1038 阅读 · 0 评论 -
绘制钟形曲线
作者:周竞文(jwzhou@nudt.edu.cn)来源:国防科技大学期末考试试题(2018 秋)领域:数学难度:★★★任务描述相关知识编程要求测试说明任务描述 正态分布又称高斯分布,是科学和工程中使用最广泛的一种概率分布,其函数表达式为:其中,μ 为数据样本的平均值,σ 为数据样本的标准差。该函数对应的曲线因形状如钟而被称为钟形曲线。 μ=0、σ=1 时的正态分布叫做标准正态分布,公式为:本关任务是绘制标准正态分布的函数曲线。相关知识 无。编程要求 补全 Begin原创 2021-11-15 15:22:24 · 2086 阅读 · 0 评论 -
※ 绘制炸弹轨迹 V——绘制多条轨迹
########## Begin ##########import numpy as npimport matplotlib.pyplot as pltdef calBombTrace(h, v0): g,n = 9.8,30 tmax = (2*h/g)**0.5 t = np.linspace(0, tmax, n) xt = v0*t yt = h-1/2*g*t**2 return xt, ytH = [3000, 2000, 1000]V0原创 2021-11-15 13:56:29 · 1169 阅读 · 0 评论 -
※ 绘制炸弹轨迹 V——绘制多条轨迹
import numpy as npimport matplotlib.pyplot as plt########## Begin ##########def calBombTrace(h, v0): g = 9.8 tmax=(2*h/g)**0.5 t=np.linspace(0,tmax,30) xt=v0*t yt=h-0.5*g*t**2 return xt, yt########## End ##########xt, yt = calB原创 2021-11-15 11:36:03 · 1638 阅读 · 0 评论 -
※ 绘制炸弹轨迹 IV——更简单地绘制一条轨迹
import numpy as npimport matplotlib.pyplot as plth, v0, g = 3000, 200, 9.8n = 30tmax=(2*h/g)**0.5########## Begin ##########t=np.linspace(0,tmax,30)xt=v0*tyt=h-0.5*g*t**2########## End ##########plt.plot(xt,yt,'r-')plt.grid('on') plt.axis([0, 5原创 2021-11-15 10:45:16 · 1180 阅读 · 0 评论 -
python绘制光滑曲线
import matplotlib.pyplot as plt #导入绘图库########## Begin ##########import numpy as npx = np.linspace(0, 2*np.pi, 10) #取10个横坐标y = np.sin(x) #计算10个纵坐标########## End ##########plt.plot(x, y, 'r-') #plot函数支持numpy数组plt.show()原创 2021-11-15 10:36:34 · 2596 阅读 · 0 评论 -
python绘制心形
import numpy as npimport matplotlib.pyplot as pltt = np.linspace(0, 2*np.pi, 100)x =16*np.sin(t)**3 #求n个xy =13*np.cos(t)-5*np.cos(2*t)-2*np.cos(3*t)-np.cos(4*t) #求n个yplt.plot(x, y, 'r-') #绘制plt.axis([-25, 25, -20, 15])plt.show()原创 2021-11-15 10:35:48 · 669 阅读 · 0 评论 -
绘制炸弹轨迹 IV——更简单地绘制一条轨迹
import matplotlib.pyplot as plth, v0, g = 3000, 200, 9.8n = 30tmax=(2*h/g)**0.5delta = tmax/(n-1)########## Begin ##########T = [i*delta for i in range(n)]xt = [v0*t for t in T]yt=[h-0.5*g*t**2 for t in T]########## End ##########plt.plot(xt,yt,'原创 2021-11-15 10:18:06 · 1032 阅读 · 0 评论 -
递归实现 除2取余法
#递归实现 除2取余法def f(d): if d==1: return '1' else: return f(d//2)+str(d%2) def dec_to_bin_int(d): if d==0: return '0' if d>0: return f(d) if d<0: return '-'+f(-d) d = int(input('原创 2021-11-14 20:07:48 · 745 阅读 · 0 评论 -
#递归实现 斐波那契数列第n项
#递归实现 斐波那契数列第n项def f(n): if n in [1,2]: return 1 elif n>=3: return f(n-1)+f(n-2) else: return "输入的n应当等于大于1" print(f(11))原创 2021-11-14 19:33:37 · 344 阅读 · 0 评论 -
递归实现 n的阶乘
#递归实现 n的阶乘def f(n): if n==1: return 1 elif n>1: return n*f(n-1) else: return "输入的n应当等于1或者大于1" print(f(5))原创 2021-11-14 19:29:06 · 117 阅读 · 0 评论 -
乘2取整法实现10进制纯小数转换2进制
##乘2取整法实现10进制纯小数数转换2进制def DecToBin_int(d): sign = '.' if d<0: d = -d sign = '-.' b = '' if d>1: d = d-int(d) if d==0: return '0' while d%2!=0: b = b + str(int(d*2)) d = d*2-int(原创 2021-11-14 12:33:11 · 1370 阅读 · 0 评论 -
除2取余法实现10进制整数转换2进制
##除2取余法实现10进制整数转换2进制def DecToBin_int(d): if d==0: return '0' sign = '' if d<0: d = -d sign = '-' b = '' while d!=0: b = str(d%2)+b d = d//2 return sign+b d = int(input('d=')) pri原创 2021-11-14 11:48:45 · 1118 阅读 · 0 评论 -
算法题目空瓶换酒
作者:周竞文(jwzhou@nudt.edu.cn)来源:国防科技大学期中考试试题(2017 秋)领域:生活难度:★★★★★任务描述相关知识编程要求测试说明任务描述 某超市促销,举办空酒瓶和酒瓶盖换酒活动,规定 2 个空瓶或 4 个瓶盖可换一瓶酒。若小明最开始买了 n 瓶酒,则他总共能喝到多少瓶酒?相关知识 参考之前关卡。编程要求 补全 Begin-End 区间的代码,其功能是根据第一次买的瓶数 n(用变量n表示),计算最多能喝多少瓶酒,说明如下: 1)n的值在程序运行时原创 2021-11-11 20:24:56 · 725 阅读 · 0 评论 -
算法空瓶换酒
空瓶换酒900任务要求参考答案评论151作者:周竞文(jwzhou@nudt.edu.cn)来源:国防科技大学期中考试试题(2017 秋)领域:生活难度:★★★★★任务描述相关知识编程要求测试说明任务描述 某超市促销,举办空酒瓶和酒瓶盖换酒活动,规定 2 个空瓶或 4 个瓶盖可换一瓶酒。若小明最开始买了 n 瓶酒,则他总共能喝到多少瓶酒?相关知识 参考之前关卡。编程要求 补全 Begin-End 区间的代码,其功能是根据第一次买的瓶数 n(用变量n表示),计算最多能原创 2021-11-11 20:20:07 · 1132 阅读 · 0 评论