Array Escape - get out of there
Python, 161 138 bytes
Credits for factorial.
g=lambda x:0**x or x*g(x-1)
f=lambda a,i,n=0,l=[]:(i<0)+(i>=len(a))and n or(0 if i in l else f(a,[a[i],i-a[i]][i and-g(i-1)%i],n+1,l+[i]))
Ideone it!
How it works
Wilson's theorem is used for prime checking.
Loop detection by storing seen indices to an array (l
) and checking whether current index is in l
.
Python, 107 bytes
import sympy
f=lambda a,i,n=0:0if n>len(a)else f(a,[a[i],i-a[i]][sympy.isprime(i)],n+1)if 0<=i<len(a)else n
Usage: f(list, start)
ex: f([2,5,6,8,1,2,3], 3)
Returns 0
for loops (detected when n > len(a)
)
Matlab, 138 bytes
This a straighforward approach, using 1-based indices because Matlab uses 1-based indices by default. To count the number of steps we use a for
loop counting from 1 to infinity(!). For the case were we cannot escape the array, we use a vector v
to keep track of which entries we already visited. If we visit an entry twice, we know we are stuck in an unescapeable cycle. To see check whether we are outside of an array, we use the try/catch
structure, which also catches out of bounds exceptions.
function r=f(a,i);v=a*0;v(i)=1;for k=1:Inf;if isprime(i);i=i-a(i);else;i=a(i);end;try;if v(i);r=0;break;end;v(i)=1;catch;r=k;break;end;end