有一个字符串: 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));
从给出的代码来看,需要我们熟悉正则表达式,了解辗转相除法。代码也没有几行,就能轻松实现了。可是当初做的时候还是花了一个下午,略带小焦虑,要么是编程很难,要么是我太弱了,对于那些有智商优越感的人,可是很快就搞定了。可能是我不太适合这个行当😭。
感兴趣的小伙伴推荐仔细推敲上面的源码,我去忧伤一会儿。
《工作中的一个小问题》有一个想法