# Number conversion

## JavaScript (ES6), 98 bytes

Takes input as (a)(b). Can be very slow if there's no solution, but it should eventually return $$\-1\$$ (at least in theory).

a=>h=(b,k=0)=>(g=(v,n)=>n--?[...v+''].some(x=>g(+x+v,n)|g(v-x,n)):v==b)(a,k)?k:k<a+[b]?h(b,k+1):-1


Try it online!

## 05AB1E, 38 37 bytes

3Ýo*Êß8LIå*i®ë¹¸[DIå#¼Ùvy©v®y+®y-}})}¾


Can definitely be golfed a bit more..

Thanks to @tsh for the condition of the first if-statement.

Try it online or verify a few more test cases.

Explanation:

3Ý             # Push the list [0,1,2,3]
o            # For each value, take 2 to the power that value: [1,2,4,8]
*           # Multiply each by the first (implicit) input
Êß         # Check that the second (implicit) input is NOT in this list
8L             # Push the list [1,2,3,4,5,6,7,8]
Iå           # Check that the second input is in this list
*i             # If both are truthy:
®            #  Push -1
ë             # Else:
¹¸           #  Push the first input again, and wrap it into a list
[          #  Start an infinite loop:
D         #  Duplicate the list at the top of the stack
Iå       #  If the second input is in this list:
#      #   Stop the infinite loop
¼        #  Increase the counter variable by 1
v        #  Loop over each number y in the list:
y©      #   Store the current number y in variable ® (without popping)
v     #   Inner loop over each digit y2 of y
®y+  #    Add digit y2 to integer ®
®y-  #    Subtract digit y2 from integer ®
}}       #  After the nested loop:
)      #  Wrap all values on the stack into a list for the next iteration
}¾         # After the infinite loop: push the counter variable
# (and output the top of the stack implicitly as result)


## Jelly, 33 29 bytes

0ịD;N\$+Ɗ;@€)ẎL<¥Ƈȷ7Ʋ=⁴¬ȦƊ¿ẈṪ’


Try it online!

A full program that takes [[a]] as the left argument and b as the right argument.

More efficient version (36 bytes)