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 []

  
}

Embed on website

To embed this program on your website, copy the following code and paste it into your website's HTML: