#!/usr/bin/ruby

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

func luhn (n) {
    var chars = n.digits
    var (i, sum) = (0, 0);
    static a = (range(10) -> map {|j| (2*j / 10 -> int) + (2*j % 10 -> int) })
    chars.each { |j|
        sum += (i++ -> is_odd ? a[j] : j)
    }
    return (sum % 10 == 0)
}

assert_eq(luhn(49927398716), true)
assert_eq(luhn(49927398717), false)
assert_eq(luhn(1234567812345678), false)
assert_eq(luhn(1234567812345670), true)

say "** Test passed!"