曾经有过这样的新闻:某公司的员工将内网论坛上的言论截屏发布到互联网上,引发了热议。于是公司通过截图定位到了员工的身份,将其开除。
有人可能好奇,仅凭截图就能知道是谁干的吗?这里就是用到了“数字水印”技术。
数字水印(Digital Watermarking)技术是将一些标识信息(即数字水印)直接嵌入数字载体当中(包括多媒体、文档、软件等)或是间接表示(修改特定区域的结构),且不影响原载体的使用价值,也不容易被探知和再次修改。但可以被生产方识别和辨认。 — 百度百科
只要在你看的页面上嵌入了肉眼不可见的信息,记录你的身份,之后再通过相应的解码软件从流出的截屏上提取出这些信息,就能知道你是谁了。
数字水印的应用还包括防伪、防篡改、保护版权等场景。
数字水印是个很大的范畴,有很多实现方式,具有不同的实现难度、信息容量、抗攻击性、对原图的干扰等。
这里我们介绍一种很简单的实现方式:
今天我们的题目就是:请将一段文字嵌入到一张图片中,然后再成功地复原出来。
示例原图:
嵌入信息后:
提取信息:
相比较之前的题目,这期的问题难道稍高,因此再给一些提示:
bin(ord(c))[2:]
,反之:chr(int(s, 2))
x // 2 * 2
详细解答和参考代码将在下次栏目中给出,也可以其他同学在留言中的代码
期待各位同学提交解答。
提交代码可以使用 paste.ubuntu.com 或
codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。
往期问题可通过公众号菜单栏“课外辅导”栏目中进入查看。
【解答】鸡兔同笼
上一次的题目 【每周一坑】鸡兔同笼 +【解答】房贷计算器 看来是比较简单,因为是本栏目到目前为止提交答案最多的一次。
大家的解法主要有三种:
1. 枚举法
即循环假设鸡数或兔数,验证是否满足头数和脚数的条件。
参考解答:
def calc_count(m, n):
for c in range(m+1):
r = m - c
if c * 2 + r * 4 == n:
return c, r
return 0, 0
m = int(input('heads(m):'))
n = int(input('feet(n):'))
c, r = calc_count(m, n)
if c == r == 0:
print('invalid input')
else:
print('cocks', c, 'rabbits', r)
TY、penger、GS、?ེི、Famisi、Bun、张钒、神无月、扶南、喵喵 等同学用了此方法。
2. 计算法
此方法即直接使用推导出的数学算式,计算出结果。
知寒 、Fiat Lux、臧贵城、胖胖萌、阎雷、Butter.Fly.、王文亚、Mayo、灿夜、徐大龙、一休叔叔、会飞的猫、laughing…、╮(╯▽╰)╭、鑫HEAD、A暴躁的眼镜吴 等同学用了此方法。
王目田|xa 同学的代码实现了以上两种方式。
3. 解方程法
利用 sympy 或 numpy 模块里的解方程工具,通过二元方程求解。
曹东、小鱼干拿来啦、花儿笑了、shadowsong 用了这种方式。
虽然从这个问题来看,枚举法有点多余,直接计算很方便。但我想说的是,枚举法更具有“编程的思维”。编程新手可以体会下二者的区别。
感谢各位同学的参与。
期待在下一期中看到你的代码!
本文分享自 Crossin的编程教室 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!