#!/usr/bin/ruby

#
## http://rosettacode.org/wiki/Longest_increasing_subsequence
#

func lis(a) {
    var l = a.len.of { [] }
    l[0] << a[0]
    1.to(a.len-1).each { |i|
        i.range.each { |j|
            if ((a[j] < a[i]) && (l[i].len < l[j].len+1)) {
                l[i] = [l[j]...]
            }
        }
        l[i] << a[i]
    }
    l.max_by { .len }
}

var a = lis(%i<3 2 6 4 5 1>)
var b = lis(%i<0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15>)

say a
say b

assert_eq(a, [2, 4, 5])
assert_eq(b, [0, 2, 6, 9, 11, 15])
