吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12456|回复: 56
收起左侧

[其他原创] 电影【机械姬】中代码分析—仅供娱乐

  [复制链接]
yysniper 发表于 2015-6-3 11:42
本帖最后由 yysniper 于 2015-6-3 17:43 编辑

先上图片渲染下气氛
Ex machine.jpg        ex.jpg

看看片中1小时09分28秒中出现的代码

ex code.jpg

看不太清,我给整理了下
[Python] 纯文本查看 复制代码
#BlueBook code decryption

import sys

def sieve(n):
#Compute primes using sieve of Eratosthenes

    x=[1]*n
    x[1]=0
        
    for i in range(2,n/2):
        j=2*i
        while j<n:
            x[j]=0
            j=j+1
                        
    return x
        
def prime(n,x):
#Find nth prime

    i=1
    j=1
    while j<=n:
        if x==1:
            j=j+1
        i=i+1
    return i-1

#Compute BlueBook unlock code

x=sieve(10000)

code =[1206,301,384,5]
key=[1,1,2,2]

sys.stdout.write("".join(chr(i) for i in [73,83,66,78,32,61,32]))

for i in range(0,4):
    sys.stdout.write(str(prime(code,x)*key))

print


毋庸置疑,Python代码,看起来真亲切呀!!!

下面开始分析:
代码中主要有两个函数,一个是sieve(n),另一个是prime(n,x)。关于这两个函数的作用,我们从注释中可以知道
第一个函数sieve(n)的注释:
[Python] 纯文本查看 复制代码
#Compute primes using sieve of Eratosthenes

我谷歌了一下是用  埃拉托斯特尼筛法  计算数字n以前的所有素数。看来电影都喜欢算素数,不信的话看我另一个帖子娱乐一下:电影《战狼》中代码分析
不过,片中的代码是错的,下面我给个对的:
[Python] 纯文本查看 复制代码
def sieve(n):
    i = 0
    count = 0
    L=[]
    for k in range(2,n):
        L.append(k)
    while L[i] ** 2 < L[-1]:
        for j in range(i + 1,len(L)):
            if L[j] % L == 0:
                L[j] = 0
                count += 1
        L.sort()
        L = L[count:]
        count = 0
        i += 1
    return L

第二个函数prime(n,x)的注释:
[Python] 纯文本查看 复制代码
#Find nth prime

直译就是找到第n个素数。那么我翻译下:就是找到x中第n个素数
从电影中的代码可以看出来,x就是一个列表,那就是找到x列表中的第n个素数,不过电影中的代码明显是错的,而且逻辑上是会造成索引错误,就是超过了列表的范围了
依然给个对的
[Python] 纯文本查看 复制代码
def prime(n,x):
#Find nth prime
    return x[n]


剩下的部分就比较简单了,而且没有语法错误,不过最后那行print就不要了,电影也就到这了,不过这些代码是可以运行了,下面放出修改后的代码:
[Python] 纯文本查看 复制代码
#BlueBook code decryption

import sys

def sieve(n):
#Compute primes using sieve of Eratosthenes

    i = 0
    count = 0
    L=[]
    for k in range(2,n):
        L.append(k)
    while L[i] ** 2 < L[-1]:
        for j in range(i + 1,len(L)):
            if L[j] % L == 0:
                L[j] = 0
                count += 1
        L.sort()
        L = L[count:]
        count = 0
        i += 1
    return L
        
def prime(n,x):
#Find nth prime
    return x[n]
        
#Compute BlueBook unlock code

x=sieve(10000)

code =[1206,301,384,5]
key=[1,1,2,2]

sys.stdout.write("".join(chr(i) for i in [73,83,66,78,32,61,32]))

for i in range(0,4):
    sys.stdout.write(str(prime(code[i],x)*key))


咱们来看看运行的结果:
112.png
你没有看错,输出就是ISBN = 97811993531422,不过这显然不是代码注释中的
[Python] 纯文本查看 复制代码
#Compute BlueBook unlock code
,看起来是一本书的书号。
但是,我又百度百科了ISBN,里面介绍ISBN最多只有13位,这里明明是14位,所以这不是书号。
那么问题来了,今天中午到底吃什么好呢?


好吧放出电影链接,百度盘的,不知道会不会被禁:
http://pan.baidu.com/s/1ntzeAcL

免费评分

参与人数 15热心值 +15 收起 理由
SstudentT + 1 电影不错啊!谢谢推荐!
YsGer + 1 66666666666666666666666
Royedia + 1 哈哈哈
吉子 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
波风雨泽 + 1 真666666666
smile1110 + 1 楼主眼神真好,开挂了把
朦胧中的罪 + 1 机器人把人杀了
5558881212 + 1 楼主牛逼!!
shuihuoerhao + 1 今天中午到底吃什么好呢?
秋风之兮 + 1 虽然我没有看到,但是我觉得这都是大神了。
-小鸡不好惹'' + 1 楼主你真的是神人!
小艾. + 1 谢谢@Thanks!
今天你笑了吗 + 1 差评。都没补上电影链接!!
347387261 + 1 热心回复!
Hmily + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xifangczy 发表于 2015-6-3 16:50
yysniper 发表于 2015-6-3 15:34
请赐教,指出错误

[Python] 纯文本查看 复制代码
def sieve(n):    i = 0
    count = 0
    L=[]
    for k in range(2,n):
        L.append(k)
    while L ** 2 < L[-1]:
        for j in range(i + 1,len(L)):
            if L[j] % L == 0:
                L[j] = 0
                count += 1
        L.sort()
        L = L[count:]
        count = 0
        i += 1
    return L

L ** 2
这里 L是list怎么去乘方2?

[Python] 纯文本查看 复制代码
def prime(n,x):
    return x[n-1]


同样 n 是 code =[1206,301,384,5] 也是一个list 怎么去减1

sieve应该改成

[Python] 纯文本查看 复制代码
def sieve(n):
    i = 0
    count = 0
    L=[]
    for k in range(2,n):
        L.append(k)
    while L[i] ** 2 < L[-1]:
        for j in range(i + 1,len(L)):
            if L[j] % L[i] == 0:
                L[j] = 0
                count += 1
        L.sort()
        L = L[count:]
        count = 0
        i += 1
	return L







[Python] 纯文本查看 复制代码
for i in range(0,4):
    sys.stdout.write(str(prime(code,x)*key))


应该改成
[Python] 纯文本查看 复制代码
for i in range(0,4):
    sys.stdout.write(str(prime(code[i],x)*key))



这样prime函数就可以了...

另外电影里 最后一句应该是
sys.stdout.write(str(prime(code,x)-key))
 楼主| yysniper 发表于 2015-6-3 17:35
本帖最后由 yysniper 于 2015-6-3 17:48 编辑
xifangczy 发表于 2015-6-3 16:50
[mw_shl_code=python,true]def sieve(n):    i = 0
    count = 0
    L=[]

我又看了下本机上的,本机是对的,在网站编辑就没有那个\[i\]了,不知道为啥,挺怪的
Hmily 发表于 2015-6-3 11:45
屌炸天啊,那么小的字都给抠出来了,看来中午只能去喝稀饭了。
阿杰 发表于 2015-6-3 11:50
顶礼膜拜。。。
chenhao4613 发表于 2015-6-3 11:52
麻婆豆腐~~~~~
STAHOOD 发表于 2015-6-3 11:52
膜拜中!                     
wu0687050 发表于 2015-6-3 11:55
大神真NB
左还是右 发表于 2015-6-3 11:55
大神的世界就是这么任性
我是坏人 发表于 2015-6-3 11:56
大神你肯定看的超清的, 你要是看标清的 我就不信了。
1050577957 发表于 2015-6-3 11:57
卧槽真心6 楼主太犀利了
璃梦花殇 发表于 2015-6-3 12:00 来自手机
楼主的眼睛都快超神了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-30 18:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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