|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 小庆子 于 2018-5-17 19:26 编辑
- '''
- # ┌───┬───┬───┐
- # │ 1│ 2 │ 3 │
- # ├───┼───┼───┤
- # │ 4 │ 5 │ 6 │
- # ├───┼───┼───┤
- # │ 7 │ 8 │ 9 │
- # └───┼───┼───┘
- # │ 0 │
- # └───┘
- 好了,警探,我们的一个同事成功地观察到了我们的目标人,Robby抢劫犯。我们跟着他来到一个秘密仓库,在那里我们假设能找到所有偷来的东西。
- 这个仓库的门是由一个电子组合锁锁闭的(键盘如上图)。不幸的是,我们的间谍不确定他看到当罗比进入它的时候那个PIN。
- 他指出,PIN 1357,但他也说,他看到的每一个数字可能实际上是另一个相邻的数字(水平或垂直,但不是对角)。
- 例如1,它也可以是2或4。
- 例如5,它也可以是2、4、6或8。
- 他也提到过,他知道这种锁。你可以输入无限数量的错误的,它们永远不会锁定系统或发出警报。这就是为什么我们可以尝试所有可能的变化。
- 观察到的可能是PIN本身和所有的变化考虑相邻的数字
- 你能帮我们找出这些变化吗?如果有一个函数,它会返回一个所有变量的数组,其长度为1到8位。
- 我们可以命名函数getPINs(python中的get_pins)。但是请注意,所有的PIN,观察到的和结果,都必须是字符串,因为有可能以“0”开头。我们已经为您准备了一些测试用例。
- 警探,我们指望你了!
- '''
- import itertools as t
- def getPINs(pin):
- Dict = {'1':[2,4],'2':[1,3,5],'3':[2,6],'4':[1,5,7],'5':[2,4,6,8],'6':[3,5,9],'7':[4,8],'8':[5,7,9,0],'9':[6,8],'0':[8]}
- pin = list(pin) #将传入的Pin转化为列表
- for i in range(len(pin)):
- if pin[i] in Dict:
- pin[i] = Dict.get(pin[i]) #将Pin对应的数字转化为相对于可能的数字的列表
- pins = []
- for x in t.product(pin[0],pin[1],pin[2],pin[3]): #组合可能的结果
- pins.append(x)
- print(pins)
- '''pin = input('间谍看到的数字:')'''
- pin = '1357'
- getPINs(pin)
复制代码
最后一步中(组合可能的结果)product()括号里面有四个,分别是pin[0],pin[1],pin[2],pin[3]
如果传入的字符是8个数字,那它就解决不了了
有什么办法能够在product里面随着传入的数字多少相应组合pin[0],pin[1],pin[2],pin[3]......pin[n]呢?
- import itertools as t
- def getPINs(pin):
- D = {'1':[1,2,4],'2':[1,2,3,5],'3':[2,3,6],'4':[1,4,5,7],'5':[2,4,5,6,8],'6':[3,5,6,9],'7':[4,7,8],'8':[5,7,8,9,0],'9':[6,8,9],'0':[0,8]}
- population = []
- [population.append(D[i]) for i in pin]
- for x in t.product(*population): #组合可能的结果
- print(x)
- '''pin = input('间谍看到的数字:')'''
- pin = '83571257'
- getPINs(pin)
复制代码
|
|