function applyPortal(_x, p){
let sgn = _x >= 0 ? 1 : -1;
let x = Math.abs(_x)
let dx = [...x.toString()].map(Number);
let m = dx.length;
let [l, r] = p.map(e => m - Number(e));
if(l < 0 || r >= m) return x;
let y = dx[l];
dx = dx.slice(0, l).concat(dx.slice(l + 1));
console.log("before :", dx)
let i = r - 1;
while(i >= 0 && y > 0){
y += dx[i];
let k = y % 10;
dx[i] = k;
y = Math.floor(y / 10);
i--;
}
if(y > 0){
dx.unshift(1);
}
return sgn * (Number(dx.map(x => x.toString()).join('')))
}
function applyButton(_x, b, bs=[], memory=null){
let m;
let sgn = _x >= 0 ? 1 : -1;
let x = Math.abs(_x)
if(m = b.match(/^[+\-*/]\d+$/)){
return [eval(`${sgn * x}${m[0]}`), bs, memory, 1]
} else if(m = b.match(/^X\^(\d+)$/)){
return [(sgn * x)**Number(m[1]), bs, memory, 1]
} else if(m = b.match(/^(\d+)$/)){
let k = m[1].length;
let y = Number(m[1]);
return [sgn * (x * 10**(k) + y), bs, memory, 1];
} else if(b == '<<'){
return [sgn * Math.floor(x / 10), bs, memory, 1]
} else if(b === "Reverse"){
return [sgn * Number([...(x.toString())].reverse().join('')), bs, memory, 1]
} else if(m = b.match(/([^\]]+)=>([^\]]+)/)){
let sx = x.toString()
let rxp = new RegExp(m[1], 'g')
return [sgn * Number(sx.replace(rxp, m[2])), bs, memory, 1]
} else if(b == "SUM"){
return [[...(x.toString())].map(Number).reduce((acc, x) => acc + x, 0), bs, memory, 1]
} else if(b == "<Shift"){
let ds = [...(x.toString())]
ds.push(ds.shift())
return [sgn * Number(ds.join('')), bs, memory, 1]
} else if(b == "Shift>"){
let ds = [...(x.toString())]
ds.unshift(ds.pop())
return [sgn * Number(ds.join('')), bs, memory, 1]
} else if(b == "Mirror"){
let xs = [...(x.toString())]
let rs = xs.slice().reverse()
return [sgn * Number(xs.concat(rs).join('')), bs, memory, 1]
} else if(b == "Inv10"){
let xs = [...(x.toString())].map(Number)
return [Number(xs.map(x => (10 - x).toString()).join('')), bs, memory, 1]
} else if(b == "Copy"){
memory = x;
return [x, bs, memory, 0]
} else if(b == "Paste"){
let xs = [...(x.toString())].concat([...memory.toString()])
return [Number(xs.join('')), bs, null, 1]
} else if(m = b.match(/^\[\+\](\d+)$/)){
let add = Number(m[1]);
let cpy = [];
for(let bu of bs){
if(bu == b) {
cpy.push(bu);
} else {
cpy.push(bu.replace(/(\d+)/, (m,a) => (Number(a) + 1).toString()));
}
}
return [x, cpy, memory, 1];
}
}
// applyButton(_x, b, bs=[], memory=null)
function calculatorGame(number, goal, moves, buttons, portal){
let queue = [[number, buttons, null, 0, []]];
while(queue.length > 0){
let [_x, _bs, _mem, lvl, path] = queue.shift()
console.log(_x, _bs, _mem, lvl, path)
if(_x == goal && lvl <= moves) return path
for(let _b of buttons){
let [x, bs, mem, dl] = applyButton(_x, _b, _bs, _mem);
if(x !== Math.floor(x)) continue;
if(portal) x = applyPortal(x, portal)
if(lvl + dl <= moves){
queue.push([x, bs, mem, lvl + dl, path.concat([_b])])
}
}
}
return []
}
To embed this program on your website, copy the following code and paste it into your website's HTML: