Re: Exercism task - ISBN verifier

new topic     » goto parent     » topic index » view thread      » older message » newer message

This works for me, though you would have to replace the "for .. in" constructs

function is_valid(string isbn)  
    integer m = 10, res = 0 
    for c in isbn do 
        if c>='0' and c<='9' then 
            res += m*(c-'0') 
            m -= 1 
        elsif c='X' and m=1 then 
            res += 10 
            m -= 1 
        elsif c!='-' then 
            return false 
        end if 
    end for 
    return m=0 and mod(res,11)=0  
end function  
 
constant tests = {{"3-598-21508-8",  true, "valid isbn"}, 
                  {"3-598-21508-9", false, "invalid isbn check digit"}, 
                  {"3-598-21507-X",  true, "valid isbn with a check digit of 10"}, 
                  {"3-598-21507-A", false, "check digit is a character other than X"}, 
                  {"4-598-21507-B", false, "invalid check digit in isbn is not treated as zero"}, 
                  {"3-598-P1581-X", false, "invalid character in isbn is not treated as zero"}, 
                  {"3-598-2X507-9", false, "X is only valid as a check digit"}, 
                  {"3598215088",     true, "valid isbn without separating dashes"}, 
                  {"359821507X",     true, "isbn without separating dashes and X as check digit"}, 
                  {"359821507",     false, "isbn without check digit and dashes"}, 
                  {"3598215078X",   false, "too long isbn and no dashes"}, 
                  {"00",            false, "too short isbn"}, 
                  {"3-598-21507",   false, "isbn without check digit"}, 
                  {"3-598-21515-X", false, "check digit of X should not be used for 0"}, 
                  {"",              false, "empty isbn"}, 
                  {"134456729",     false, "input is 9 characters"}, 
                  {"3132P34035",    false, "invalid characters are not ignored after checking length"}, 
                  -- Catch invalid characters in an otherwise valid isbn: 
                  {"3598P215088",   false, "invalid characters are not ignored before checking length"}, 
                  {"98245726788",   false, "input is too long but contains a valid isbn"}} 
 
for t in tests do 
    assert(is_valid(t[1])=t[2],t[3]) 
end for 
new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu