3 digit code

傷城~ 2024-04-03 12:10 145阅读 0赞

原题如下图示

alt

密码锁是3位的密码,猜5种组合分别有下面的提示

7 9 3 :只有1个对的,而且在正确位置;

7 2 5:只有1个对的,但位置不对;

3 1 7:有两个数是对的,但都不在正确位置;

8 4 9 : 没有包含正确的数字

8 9 1 : 只有1个对的,但位置不对;

逻辑任务尝试编程解决。好处是有的,例如修改题面的数字,也能迅速获取密码答案。

初始化arrs二维数组表达所有的输入信息!简单将5个声明解析为数组中的第4位和第5位数值,具体如下:

  1. arrs = [
  2. [7,9,3,1,1], # n=1,p=1, 包含1个密码数字,且位置对
  3. [7,2,5,1,0], # n=1,p=0, 包含1个密码数字,但位置不对
  4. [3,1,7,2,0], # n=2,p=0, 包含2个密码数字,但位置都不对
  5. [8,4,9,0,0], # n=0,p=0, 没有包含
  6. [8,9,1,1,0] # n=1,p=0, 包含1个密码数字,但位置不对
  7. ]

第一步:筛选0-9之间可能出现在密码里的数字

  1. def filter(arrs):
  2. dt,rem = set(),set()
  3. for arr in arrs:
  4. if arr[3] > 0:
  5. dt.update(arr[:3])
  6. if arr[3] == 0:
  7. rem = set(arr[:3])
  8. # not good for: dt - set(arr[:3])
  9. return dt - rem

第二步:在组合中筛选符合任务中 5 个声明的

变量n是包含密码数字的个数,p是位置正确的个数;

只有满足全部5个#声明的组合返回结果 True,否则返回False

  1. def judge(num,arrs):
  2. # filter(arrs) < digit = list(range(10))
  3. #变量n是包含密码数字的个数, p是位置正确的个数;
  4. #只有满足全部5个声明的组合返回结果 True,否则False
  5. for arr in arrs:
  6. n,p = arr[3],arr[4]
  7. temp = list(zip(num,arr[:3]))
  8. bool_pos = sum([x==y for x,y in temp])
  9. common = set(arr[:3]) & set(num)
  10. if bool_pos != p or len(common) != n:
  11. return False
  12. else:return True

第三步:排列组合并逐一判断

  1. from itertools import permutations
  2. def main(arrs,lngth=3):
  3. ans = []
  4. s = filter(arrs)
  5. seq = list(permutations(s,lngth))
  6. return [num for num in seq if judge(num,arrs)]
  7. print('main:',main(arrs,3))
  8. main: [(1, 5, 3)]

扩展任务

你可以修改初始化二维数组,例如:arrs第5行的[8,9,1],改为[8,9,5],你猜猜结果如何?

  1. arrs = [
  2. [7,9,3,1,1], # n=1,p=1, 包含1个密码数字,且位置对
  3. [7,2,5,1,0], # n=1,p=0, 包含1个密码数字,但位置不对
  4. [3,1,7,2,0], # n=2,p=0, 包含2个密码数字,但位置都不对
  5. [8,4,9,0,0], # n=0,p=0, 没有包含
  6. [8,9,5,1,0] # n=1,p=0, 包含1个密码数字,但位置不对
  7. ]

运行以上程序,发现结果不变!正确密码还是(1, 5, 3) 推理看是否正确?

扩展之二

保持二维数组元素的前3个元素不变,修改声明,例如第3行[3,1,7,2,0],修改位[3,1,7,1,0],返回结果是空,没有满足的组合;

但如果继续修改第4行,[8,4,9,0,0]改为[8,4,9,1,0],再看看有什么变化? 具体如下初始化arrs

  1. arrs = [
  2. [7,9,3,1,1], # n=1,p=1, 包含1个密码数字,且位置对
  3. [7,2,5,1,0], # n=1,p=0, 包含1个密码数字,但位置不对
  4. [3,1,7,1,0], # n=1,p=0, 包含1个密码数字,但位置都不对
  5. [8,4,9,1,0], # n=0,p=0, 包含1个密码数字,但位置都不对
  6. [8,9,1,1,0] # n=1,p=0, 包含1个密码数字,但位置不对
  7. ]

返回两个结果:(2, 8, 3), (5, 8, 3)

上述可以继续优化,优化的方向是声明变化时,修改初始化arrs,判断是否输出为空。

本文由 mdnice 多平台发布

发表评论

表情:
评论列表 (有 0 条评论,145人围观)

还没有评论,来说两句吧...

相关阅读

    相关 3 digit code

    原题如下图示 ![alt][] 密码锁是3位的密码,猜5种组合分别有下面的提示 `7 9 3` :只有1个对的,而且在正确位置; `7 2 5`:只有1个对的,但位置不

    相关 Digits

    \\(Digits\\) ![m6C1AO.png][] 这道题目比较简单,首先先打出来暴力,然后一看\\(b\\)的范围,瞬间想到快速幂。 快速幂的精髓是什么?