いろいろ言ったけど、それでも結構よくできてたと思うよ。頑張ったね。
参考までに>>746のもの。>>945とよく似ているけど、なにが違うかな。

def match_loop(val, array)
 return array[0] if array.size <= 1 # 配列が空の時はnilを返す
 head = 0
 tail = array.size - 1

 while tail - head > 1
  navel = (head + tail) / 2
  if val < array[navel]
   tail = navel
  else
   head = navel
  end
 end
 val-array[head] <= array[tail]-val ? head : tail
end