Lisp Fib Frog
(defun fib-frog (a)
(let* ((vec (coerce a 'vector))
(size (length vec))
(fib (make-array 2 :initial-contents '(0 1) :adjustable t :fill-pointer 2)))
(let ((i 1))
(loop while (<= (aref fib i) size)
do (progn
(incf i)
(vector-push-extend (+ (aref fib (1- i)) (aref fib (- i 2))) fib))))
(let ((paths (list (list :idx -1 :jmp 0)))
(steps (make-array size :initial-element nil)))
(loop while paths
do (let ((path (pop paths)))
(loop for i from (1- (length fib)) downto 2
do (let ((idx (+ (getf path :idx) (aref fib i))))
(cond
((= idx size) (return-from fib-frog (1+ (getf path :jmp))))
((or (> idx size)
(aref steps idx)
(zerop (aref vec idx)))
nil)
((= (aref vec idx) 1)
(setf (aref steps idx) t)
(setf paths (append paths (list (list :idx idx :jmp (1+ (getf path :jmp))))))))))))
-1)))
This precomputes Fibonacci jumps, then uses a breadth-first search to find the shortest valid path across the river.