工作中的一个小问题

有一个字符串: a[0:3]bb[-1:9]c[-1:-9]d ,0 对应 a0bb-1c-1d,1 对应 a0bb-1c-2d,2 对应 a0bb-1c-3d,以此类推,那么当 100 应该对应哪个字符串?怎么实现这个转化?

需要注意 2 个地方,一个是 [-10:3] 可以递增,也可以是递减 [3:-10];另一个是这种模式可以无限叠加。

先把第一个实现粘贴如下:

function transfer(number, str = "a[-10:3]bb[-1:9]c[-1:-9]d") {
  let matches = str.matchAll(/(\w*)\[([\d\-]*):([\d\-]*)\](\w*)(?:[^\[]*)/g);

  let arr = [...matches];

  let output = "";
  for (let i = arr.length - 1; i >= 0; i--) {
    let item = arr[i];

    let begin = +item[2];
    let end = +item[3];

    let range = Math.abs(end - begin) + 1;
    let step = end >= begin ? 1 : -1;

    let temp = number % range;
    number = (number / range) | 0;

    let start = begin + step * temp;
    output = item[1] + start + item[4] + output;
  }

  return output;
}

console.log(transfer(0));
console.log(transfer(30));

从给出的代码来看,需要我们熟悉正则表达式,了解辗转相除法。代码也没有几行,就能轻松实现了。可是当初做的时候还是花了一个下午,略带小焦虑,要么是编程很难,要么是我太弱了,对于那些有智商优越感的人,可是很快就搞定了。可能是我不太适合这个行当😭。

感兴趣的小伙伴推荐仔细推敲上面的源码,我去忧伤一会儿。

扩展阅读

作者: 曾小乱

喜欢写点有意思的东西

《工作中的一个小问题》有一个想法

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据