"""

NOTE: Haskell code

import Char(digitToInt)

calcCheckDigit :: [Int] -> Int
calcCheckDigit = (`mod` 10) . (10 -) . sum . zipWith (*) (cycle [1,3])

isValidISBN13 :: [Char] -> Bool
isValidISBN13 isbn =
  if (length isbn) /= 13 then
    False
  else
    let digits = (map digitToInt isbn) in
      (==) (last digits) (calcCheckDigit (take 12 digits))

"""

def is_valid_isbn13(isbn):
    from string import digits
    from operator import mul
    from itertools import cycle, starmap, izip

    assert isinstance(isbn, str)
    assert len(isbn) == 13
    assert all(c for c in isbn if c in digits) # all(map(digits.__contains__, isbm))

    return int(isbn[-1]) == (10-sum(starmap(mul,izip(map(int,isbn[:-1]),cycle([1,3])))))%10

if __name__ == '__main__':
    print is_valid_isbn13("9784062772211")
    print is_valid_isbn13("9784150315684")
