ひさしぶりに

d.y.d. の記事に関して.とりあえず cointoss という名前ははなはだまずい(明らかに random() を思い浮かべる).名前を変えるだけでも明瞭さに違いが現れそう.

まあ,名前の問題は置いておくことにして,単純に任意引数の関数を用意するだけでも十分という気はする.

def where_is_max(array)
    max_i = 0

    for i in 1...(array.size)
        if array[max_i] < array[i]
            max_i = i
        elsif array[max_i] == array[i]
            max_i = arbitrary(max_i, i)
        end
    end

    max_i
end
def merge(xs, ys)
    zs = []

    until xs.empty? || ys.empty?
        if xs[0] < ys[0]
            zs.push(xs.shift)
        elsif xs[0] > ys[0]
            zs.push(ys.shift)
        else
            zs.push(arbitrary(xs, ys).shift)
        end
    end

    zs + xs + ys
end

将来の言語処理系は以下のプログラムに対して median-of-median とかを持ち出したりするのだろうか.

def partition(array, i, j, pivot)
    # ...
end

def qsort(array, i, j)
    unless i == j
        k = partition(array, i, j, arbitrary *(i..j))
        qsort(array, i, k - 1)
        qsort(array, k + 1, j)
    end
end

最低要件を満たすだけならば,以下の関数を定義するだけで足りる.実用上の利便を考えてランダムチョイスにしておいたけれど,別に先頭要素を返すだけでも構わない.

def arbitrary(*args)
    args[rand(args.length)]
end