The observed PIN - my solution

The observed PIN - my solution

BUG集散地

2018-10-25 08:37 阅读 159 喜欢 0 codewar 刷题 PIN组合 codewars

Alright, detective, one of our colleagues successfully observed our target person, Robby the robber. We followed him to a secret warehouse, where we assume to find all the stolen stuff. The door to this warehouse is secured by an electronic combination lock. Unfortunately our spy isn't sure about the PIN he saw, when Robby entered it.

The keypad has the following layout:

┌───┬───┬───┐
│ 1 │ 2 │ 3 │
├───┼───┼───┤
│ 4 │ 5 │ 6 │
├───┼───┼───┤
│ 7 │ 8 │ 9 │
└───┼───┼───┘
    │ 0 │
    └───┘

He noted the PIN 1357, but he also said, it is possible that each of the digits he saw could actually be another adjacent digit (horizontally or vertically, but not diagonally). E.g. instead of the 1 it could also be the 2 or 4. And instead of the 5 it could also be the 2, 4, 6 or 8.

He also mentioned, he knows this kind of locks. You can enter an unlimited amount of wrong PINs, they never finally lock the system or sound the alarm. That's why we can try out all possible (*) variations.

Can you help us to find all those variations? It would be nice to have a function, that returns an array (or a list in Java and C#) of all variations for an observed PIN with a length of 1 to 8 digits. We could name the function getPINs (get_pins in python, GetPINs in C#). But please note that all PINs, the observed one and also the results, must be strings, because of potentially leading '0's. We already prepared some test cases for you.

Detective, we count on you!


There's my solution below.

idea

1 .we got a keypad map in question 2. then got a array with map and parameters 3. and we could get max-length of result 4. rise the index ,get the results

code

function getPINs(observed) {
  // TODO: This is your job, detective!
  var map = {
    1 : [1,2,4],
    2 : [1,2,3,5],
    3 : [3,2,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 : [8,0]
  }
  function getNum(arr,index) {
    return arr.map( (item,i)=>{
      return item[index[i].start];
    }).join('');
  }
  function riseNum(index){
    let isUp = false;
    return index.reverse().map( (item,i)=> {
      let start = item.start,max = item.max;
      if(i ===0 ||isUp === true)start++;
      if(start === max){
        isUp = true;
        start = 0;
      }else{
        isUp = false;
      }
      return {start : start,max : max};
    }).reverse();
  }
  var arr = observed.split('').map( item => {
    return map[item];
  });
  var index = arr.map( item=> {
    return {start : 0,max : item.length}
  });
  var max = arr.reduce( (total,item)=> {
    return total * item.length;
  },1);
  var res = [];
  for(let i=0;i<max;i++){
    res.push(getNum(arr,index));
    index = riseNum(index);
  }
  return res;
}

clever

function getPINs(observed) {
  var adjacent = [
    /* 0 */ [0, 8],
    /* 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]
  ];

  return observed
    .split('')
    .map(function(d) { return adjacent[d|0]; })
    .reduce(function(pa, da) {
      return da.reduce(function(pv, d) {
        return pv.concat(pa.map(function(p) {
          return '' + p + d;
        }));
      }, []);
    }, ['']);
}

Question from https://www.codewars.com/kata/the-observed-pin/solutions/javascript/me/best_practice

转载请注明出处: https://chrunlee.cn/article/js-code-war-pin.html


如果对你有用的话,请赏给作者一个馒头吧 ...或帮点下页面底部的广告,感谢!!

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
今天刷codewars的题目的时候碰到一个通过js来实现字符串转base64的题目,base64虽然在js或nodejs中经常用,但是我还真没有仔细去看过原理以及如何实现,这回绕不过去了,赶紧找了找资料看了下。
项目中需要使用treegrid,找了下easyui 和 ext都有,但是项目用的框架是 byyui,如果为了treegrid 就把这些都加载的话,感觉不太合算。找了大家常用的基于jquery的treegrid.
开发的项目中有使用到微信开发,由于之前偶尔才用一次,也是用的别人的地址和测试号,这里记录下自己的操作。防止后续遗忘。
本文概括了递归、闭包、原型、继承,理清这些基本的概念,有助于你接纳更多的东西,我们会在下一个章节对函数进行更深入的讨论。
偶尔练习下canvas,这里简单记录下常用API,防止遗忘..加深记忆..努力提高..争取突破...daydayup
在文件上传的时候,经常会对文件的mime进行限制,比如图片 image/jpg 等,让用户可以选择图片,而不是其他的文件。
之前一直没面试过前端,今天有一个,先整理下需要问的问题和答案。这里都是一些简单的问题,关于当下比较流行的框架并没有涉及到..
关于web打印,需要对页面内容进行页面样式设置,呈现出分页的样子,同时对于题目中的图片或表格尽量不分到两个页面中,因此实现了一个jquery的web打印插件,当然,这个插件目前只适用于部分情况,仅供借鉴