PROG0194 - ISBN

In the ISBN-10 (International Standard Book Numbering) system that was used until the end of 2006, each book is assigned a unique 10-digit code. The first nine digits uniquely identify the book itself, whereas the last digit merely serves as a check digit to detect invalid ISBN-10 codes.

ISBN
ISBN in text and barcode

If $x_1, \ldots, x_9$ represent the first nine digits of an ISBN-10 code, the check digit $x_{10}$ is calculated as $$x_{10} = (x_1+ 2x_2+ 3x_3+ 4x_4+ 5x_5+ 6x_6+ 7x_7+ 8x_8+ 9x_9)\!\!\!\!\mod{11}\,.$$ As a result, $x_{10}$ always takes a value in between 0 and 10. If the check digit is equal to 10, it is represented in the ISBN-10 code by the uppercase letter X. As such, only a single character is needed to represent the check digit.

In the new ISBN-13 system, each book is assigned a unique 13-digit code. The first twelve digits identify the book itself, whereas the last digit merely serves as a check digit to detect invalid ISBN-13 codes. If $x_1, \ldots, x_{12}$ represent the first twelve digits of an ISBN-13 code, the check digit $x_{13}$ is calculated as $$x_{13} = (10 - (x_1 + x_3 + x_5 + x_7 + x_9 + x_{11} + 3(x_2 + x_4 + x_6 + x_8 + x_{10} + x_{12}))\!\!\!\!\!\mod{10})\!\!\!\!\!\mod{10}$$ As a result, $x_{13}$ always takes a value in between 0 and 9, so that ISBN-13 codes only contain digits.

An ISBN-13 code has a fixed structure that contains quite some information. The first 3 digits either are 978 or 979. Codes that start with 978 are books that also have an ISBN-10 code. After the prefix of the first 3 digits is a specification of the country group in which the book was published. This specification can take up 1 to 5 digits. This is followed by an identification of the publisher and the item. The last digit is a check digit, as described above.

It easy to derive the ISBN-10 code associated to a book with a given ISBN-13 code. The association, however, is only valid for ISBN-13 codes that start with 978:

  • remove the prefix 978 from the code
  • remove the check digit from the code
  • recompute the check digit according to the ISBN-10 rules

Assignment

Define a class ISBN13 that supports the following methods:

  1. An initialization method __init__ which takes an ISBN-13 code as an integer argument (you may assume the data type is correct), and has an optional parameter that specifies the number of digits in the specification of the country group. This optional parameter has default value 1. Make sure this number is in between 1 and 5.
  2. A method __str__ which returns a string representation of the ISBN-13 code. This string representation should contain dashes in between the information fields of the ISBN-13 code: the prefix 978 or 979, the specification of the country group, the identification of the publisher and the item, and the check digit.
  3. A method __repr__ which returns a string representation that display how the object can be initialized in Python code.
  4. A method isValid which returns a Boolean value that indicates whether or not the object represents a valid ISBN-13 code.
  5. A method asISBN10 which returns a string that represents the code as an ISBN-10 code. If no such representation exists (because it is not a valid ISBN-13 code or because it does not start with 979), the method must return the value None.

Example

>>> code = ISBN13(9780136110675)
>>> print(code)
978-0-13611067-5
>>> code
ISBN13(9780136110675, 1)
>>> code.isValid()
True
>>> code.asISBN10()
'0-13611067-3'

Binnen het ISBN-10 (International Standard Book Numbering) systeem dat tot eind 2006 gebruikt werd, kreeg elk boek een unieke code toegewezen die bestaat uit 10 cijfers. De eerste 9 daarvan geven informatie over het boek zelf, terwijl het laatste louter een controlecijfer is dat dient om foutieve ISBN-10 codes te detecteren.

ISBN
ISBN in tekst en streepjescode

Indien $x_1, \ldots, x_9$ de eerste 9 cijfers van een ISBN-10 code voorstellen, dan wordt het controlecijfer $x_{10}$ als volgt berekend: $$x_{10} = (x_1+ 2x_2+ 3x_3+ 4x_4+ 5x_5+ 6x_6+ 7x_7+ 8x_8+ 9x_9)\!\!\!\!\mod{11}\,$$ $x_{10}$ kan m.a.w. de waarden 0 tot en met 10 aannemen. Indien het controlecijfer gelijk is aan 10, dan wordt dit in de ISBN-code genoteerd als de letter X.

Binnen het nieuwe ISBN-13 systeem krijgt elk boek een unieke code toegewezen die bestaat uit 13 cijfers. De eerste 12 daarvan geven informatie over het boek zelf, terwijl het laatste louter een controlecijfer is dat dient om foutieve ISBN-13 codes te detecteren. Indien $x_1, \ldots, x_{12}$ de eerste 12 cijfers van een ISBN-code voorstellen, dan wordt het controlecijfer $x_{13}$ als volgt berekend: $$x_{13} = (10 - (x_1 + x_3 + x_5 + x_7 + x_9 + x_{11} + 3(x_2 + x_4 + x_6 + x_8 + x_{10} + x_{12}))\!\!\!\!\!\mod{10})\!\!\!\!\!\mod{10}$$ $x_{13}$ kan m.a.w. de waarden 0 tot en met 9 aannemen, waardoor ISBN-13 codes uitsluitend uit cijfers bestaan.

Een ISBN-13 code heeft een vaste structuur die heel wat informatie bevat. De eerste 3 cijfers zijn ofwel 978 ofwel 979. De codes die beginnen met 978 zijn boeken waarvoor er ook een ISBN-10 code is. Na de eerste 3 cijfers volgt er eerst een aanduiding van de landengroep waar dit boek is gepubliceerd. Deze aanduiding kan 1 tot en met 5 karakters bevatten. Daarna volgt een identificatie van de uitgever en het item. Het laatste karakter is, zoals reeds beschreven werd, een controlecijfer.

De ISBN-10 code van een boek met een ISBN-13 code kan eenvoudig berekend worden. Deze berekening is wel enkel geldig voor ISBN-13 codes die beginnen met 978:

  • Verwijder de 978 vooraan de code en het controlecijfer achteraan de code
  • Bereken het nieuwe controlecijfer volgens de regels van ISBN-10

Opgave

Definieer een klasse ISBN13 met volgende methoden:

  1. Een initialisatiemethode __init__ met een verplichte parameter waaraan een ISBN-13 code als geheel getal (dit moet je niet controleren) moet doorgegeven worden, en een optionele parameter waaraan de lengte van de landaanduiding kan doorgegeven worden. Deze laatste heeft standaardwaarde 1. Zorg er wel voor dat dit getal in het interval 1 tot en met 5 ligt.
  2. Een methode __str__ die de stringvoorstelling van de ISBN-13 code teruggeeft. Hierbij worden er koppeltekens tussen de verschillende groepen geplaatst: de inleidende 978 of 979, de landaanduiding, de identificatie van uitgever en item en het controlecijfer.
  3. Een methode __repr__ die de stringvoorstelling van het object teruggeeft, die leest als een Python expressie die kan gebruikt worden om een nieuw object met dezelfde toestand als het huidige object aan te maken.
  4. Een methode isGeldig die een Booleaanse waarde teruggeeft die aangeeft of het object al dan niet staat voor een geldige ISBN-13 code.
  5. Een methode alsISBN10 die een string teruggeeft die het object als ISBN-10 code voorstelt. Als zo'n voorstelling niet bestaat (omdat het object geen geldige ISBN-13 code is of omdat de ISBN-13 code niet begint met 979), dan moet de functie de waarde None teruggeven.

Voorbeeld

>>> code = ISBN13(9780136110675)
>>> print(code)
978-0-13611067-5
>>> code
ISBN13(9780136110675, 1)
>>> code.isGeldig()
True
>>> code.alsISBN10()
'0-13611067-3'

Added by:Peter Dawyndt
Date:2011-11-29
Time limit:10s
Source limit:50000B
Memory limit:1536MB
Cluster: Cube (Intel G860)
Languages:
Resource:None

© Spoj.com. All Rights Reserved. Spoj uses Sphere Engine™ © by Sphere Research Labs.