行李箱密码忘记了?写个JS函数帮忙解开吧

80 阅读1分钟

事情起因

最近收拾杂物时,发现了好久没用的行李箱,但是忘记了密码。密码锁是3位数齿轮密码,没有重置密码的小孔。于是在网上搜索了一下,发现了一个通用的解决方法。
由于我人比较「懒」,就把计算密码的那部分过程,封装成JS函数,兼容3~4位密码。
运气好的话,密码就是运行结果之一。
幸运的是,我成功找到了密码,故记录过程作为留念。

适用范围

外观类似这样的密码锁都能试试。 01.JPG

解决过程

1. 找到初始值

旋转每个密码齿轮,直到出现缺口,缺口左偏一点。如图:
02.JPG 可以看到,对应的数字就是解码需要的初始值03.JPG 这个密码锁的初始值517

2. 获取密码

将这个封装好的JS函数,放到可以运行JS的平台执行(如:浏览器控制台)。

// 计算行李箱密码,兼容3~4位的齿轮密码锁
function travelBagPassword(initial) {
  // 检查入参是否合法
  if (!Object.prototype.toString.call(initial).indexOf('String') ||
    initial.length < 3 ||
    (new RegExp(`\\d{${initial.length}}`)).test(initial) === false) {
    return false
  }
  // 密码偏移值
  const offsets = [
    '3'.repeat(initial.length),
    '8'.repeat(initial.length),
    '-' + '5'.repeat(initial.length)
  ]
  const password_maybe = []
  // 计算密码的每个值
  const getPasswordPart = (num, add) => {
    if (add > 0) {
      return ((num + add) > 9 ? (num + add) - 10 : (num + add)).toString()
    } else {
      return ((num + add) < 0 ? (num + add) + 10 : (num + add)).toString()
    }
  }
  // 计算初始值加上每个偏移值的结果
  for (const offset of offsets) {
    let offset_arr = Math.abs(offset).toString().split('')
    let signed = offset < 0 ? -1 : 1
    let password = ''

    for (const key in offset_arr) {
      password += getPasswordPart(parseInt(initial[key]), parseInt(offset_arr[key]) * signed)
    }

    password_maybe.push(password)
  }

  return password_maybe
}

// 运行函数,输入初始值
travelBagPassword('517')
// 得到结果
// Array(3) [ "840", "395", "062" ]

逐一尝试下,结果中的「395」就是这个箱子的密码了。 04.JPG 最后家里两个行李箱,都通过此法得到了正确的密码,行李箱又能用了,开心。