Pour bien se préparer, il vaut mieux ne pas dépasser 1h30 !!
Le code ISBN (International Standard Book Number) est un code international permettant de désigner de façon unique tous les livres édités. Il en existe deux versions : l’ISBN13 est constitué de 13 chiffres, tandis que l’ISBN10 (plus ancien) est constitué de 10 caractères, les neuf premiers étant des chiffres mais le dixième étant soit un chiffre, soit la lettre X. Les neuf premiers chiffres du code ISBN10 d’un ouvrage sont des identifiants de pays, d’éditeur, et d’ouvrage, alors que le dixième caractère est une clé de vérification obtenue à partir des neuf premiers.
Si on note $c_1, c_2, \dots, c_9$ les neuf premiers caractères du code, on calcule :
$$n = \sum_{i=1}^{9} i \times c_i$$, et le caractère $c_{10}$est le reste de la division euclidienne de $n$ par 11. Dans le cas où ce reste est égal à 10, le caractère $c_{10}$ sera la lettre $X$. Le code ISBN13 sera décrit en détail un peu plus loin dans l’énoncé. On rappelle que le reste de la division euclidienne de $n$ par $p$ peut s’obtenir en Python grâce à l’opération n % p
.
Le code ISBN10 sera représenté soit par un nombre entier de neuf chiffres, soit par une chaîne de caractères.
NB : la numérotation en Python commence par 0.
Question 1.
Si les neuf premiers chiffres d’un code ISBN10 sont les suivants : 226611156. Déterminer (sans programmation) le dixième caractère de ce code.
Question 2.
Écrire la fonction récursive decimal2str(c)
, qui prend en paramètre un entier c
de neuf chiffres représentant le code ISBN10, et qui retourne une chaîne de caractères qui représente le même code ISBN10.
Question 3.
Écrire la fonction récursive str2decimal(s)
, qui prend en paramètre une chaîne de caractères de neuf caractères représentant le code ISBN10, et qui retourne un entier qui représente le même code ISBN10.
Exemple : L’appel de la fonction str2decimal('226611156')
retourne l’entier 226611156
.
Question 4.
Écrire une fonction Chiffre(s, i)
qui prend comme argument un code ISBN10 sous forme d’une chaîne de caractères, et renvoie le chiffre entier qui se trouve à la position i
.
Rq : le code ASCII du ‘0’ est 48, ‘1’ est 49, etc.
Exemple : L’appel de la fonction Chiffre('226611156', 7)
retourne le chiffre 5
.
Question 5.
Écrire la fonction clécode(s)
qui prend comme argument un code ISBN10 sous forme d’une chaîne de caractères, et qui retourne la clé de vérification correspondante à ce code.
Question 6.
Écrire une fonction validecode(s)
qui prend comme argument un code ISBN10 sous forme d’une chaîne de dix caractères, et qui retourne True
si le code ISBN10 est valide, et False
sinon.*
Question 7.
Le code ISBN13 d’un ouvrage est obtenu en ajoutant devant les neuf premiers chiffres du code ISBN10 les trois chiffres 978
, et le treizième chiffre est une clé de vérification obtenue à partir des douze premiers de la façon suivante :$$n = \sum_{i=0}^{5} c_{2i+1} + \sum_{i=1}^{6} c_{2i}$$
Si $f(n)$ est le dernier chiffre du nombre $n$, alors $c_13 = f(10 – f(n))$.
Question 8.
Écrire la fonction conversioncode(s)
qui prend comme argument un code ISBN10 à dix caractères, et qui retourne le code ISBN13 correspondant sous forme d’une chaîne de caractères.
Question 9.
Écrire une fonction livrejaponais(s)
qui prend comme argument un code ISBN13 sous forme d’une chaîne de caractères et qui détermine s’il s’agit d’un livre édité au Japon (tous les livres édités au Japon ont un ISBN10 dont le premier chiffre est un 4).
Correction
Question 1.
Formule :
$n = \sum_{i=1}^{9} i \times c_i$ où $c_i$ est le i-ème chiffre.
Calcul :
$n = 1 \times 2 + 2 \times 2 + 3 \times 6 + 4 \times 6 + 5 \times 1 + 6 \times 1 + 7 \times 1 + 8 \times 5 + 9 \times 6$
$n = 2 + 4 + 18 + 24 + 5 + 6 + 7 + 40 + 54 = 160$
Ensuite, le reste de la division euclidienne de $n$ par 11 donne :$160 \% 11 = 6$
Le dixième caractère est donc 6.
Question 2.
def decimal2str(c):
s = ""
for i in range(9):
s += str(c % 10)
c //= 10
return s[::-1]
Question 3.
def str2decimal(s):
n = 0
for i in range(9):
n = n * 10 + int(s[i])
return n
Question 4.
def Chiffre(s, i):
return int(s[i])
Question 5.
def clecode(s):
n = sum((i + 1) * int(s[i]) for i in range(9))
c10 = n % 11
return 'X' if c10 == 10 else str(c10)
Question 6.
def validecode(s):
if len(s) != 10:
return False
cle = clecode(s[:9])
return cle == s[9]
Question 7.
def isbn13(s):
n = 0
for i in range(6):
n += int(s[2*i+1]) + 3 * int(s[2*i])
c13 = 10 - (n % 10)
return c13 if c13 != 10 else 0
Question 8.
def conversioncode(s):
s13 = "978" + s[:9]
return s13 + str(isbn13(s13))
Question 9.
def livrejaponais(s):
return s[3] == '4'