import sys
import re
class ISBN:
pass
class ISBN10(ISBN):
pattern = re.compile('\d{9}(\d|X)')
@classmethod
def isvalid(cls, s):
"""
>>> ISBN10.isvalid('foobar')
False
>>> ISBN10.isvalid('4101092052')
True
>>> ISBN10.isvalid('4101092053')
False
"""
mo = cls.pattern.match(s)
if mo is None:
return False
parity = 0
for i, d in enumerate(s[:9]):
parity += int(d) * (10 - i)
return s[9] == ('0123456789X'[(11 - parity % 11 )])
class ISBN13(ISBN):
pattern = re.compile('\d{13}')
@classmethod
def isvalid(cls, s):
"""
>>> ISBN13.isvalid('foobar')
False
>>> ISBN13.isvalid('9784101092058')
True
>>> ISBN13.isvalid('9784101092057')
False
"""
mo = cls.pattern.match(s)
if mo is None:
return False
parity = 0
for i, d in enumerate(s[:12]):
parity += int(d) * (1+2*(i%2))
return (10 - parity % 10 ) == int(s[12])
def main():
for line in sys.stdin:
pass
if __name__ == '__main__':
import doctest
doctest.testmod()
追記:
既存のものにはこういうのがある.JANコードの意味とかが分かるらしい.
0 件のコメント:
コメントを投稿