Problème de pagination (niveau 2)

En fouillant dans sa bibliothèque, Adenine se rend compte qu’un de ses livres a une feuille arrachée.

Dans les numéros de pages de ce livre, on retrouve exactement 47 fois le chiffre 1 et 19 fois le chiffre 0. Le livre a un nombre pair de pages.

Quelle feuille a été arrachée ?

1. Programme (en langage python) qui compte le nombre de chiffres '1' et de chiffres '0' dans tous les nombres de 1 à n.

In [1]:
def count_ones(n):
    # Compte les occurrences de '1' dans le nombre sous forme de chaîne
    return ' '.join(str(i) for i in range(1, n+1)).count('1') 
In [2]:
def count_zeros(n):
    # Compte les occurrences de '0' dans le nombre sous forme de chaîne
    return ' '.join(str(i) for i in range(1, n+1)).count('0') 
In [3]:
# Exemple d'utilisation de ces fonctions
n = 118
result = count_ones(n)
print(f"Le nombre de chiffres '1' dans les nombres de 1 à {n} est : {result}")
result = count_zeros(n)
print(f"Le nombre de chiffres '0' dans les nombres de 1 à {n} est : {result}")
Le nombre de chiffres '1' dans les nombres de 1 à 118 est : 50
Le nombre de chiffres '0' dans les nombres de 1 à 118 est : 21

2. Programme qui utilise les fonctions du programme précédent et montre le décompte incrémental des '1' et des '0', lorsque l'on parcourt un livre de 118 pages dont la feuille 101/102 a été arrachée.

In [4]:
# Dans la suite on compte tous les 1 et les zeros de notre livre en enlevant la feuille 101/102
page_arr_1 = 101 # Première page arrachée
# Nombres de 1 de la feuille arrachées (les 2 pages)
count_ones_pa_12 = (str(page_arr_1) + str(page_arr_1 +1 )).count('1') 
# Nombres de 0 de la feuille arrachées (les 2 pages)
count_zeros_pa_12 = (str(page_arr_1)+ str(page_arr_1 + 1)).count('0')

print('Page, Nb de 1, Nb de 0')
for page in range(1, 119):
    if page < page_arr_1: # On compte les 1 et les 0
        print(f'{page}, {count_ones(page)}, {count_zeros(page)}')
    elif page > page_arr_1 + 1: # On compte les 1 et les 0 en enlevant ceux de la feuille arrachée
        print(f'{page}, {count_ones(page) - count_ones_pa_12}, {count_zeros(page) - count_zeros_pa_12}')
Page, Nb de 1, Nb de 0
1, 1, 0
2, 1, 0
3, 1, 0
4, 1, 0
5, 1, 0
6, 1, 0
7, 1, 0
8, 1, 0
9, 1, 0
10, 2, 1
11, 4, 1
12, 5, 1
13, 6, 1
14, 7, 1
15, 8, 1
16, 9, 1
17, 10, 1
18, 11, 1
19, 12, 1
20, 12, 2
21, 13, 2
22, 13, 2
23, 13, 2
24, 13, 2
25, 13, 2
26, 13, 2
27, 13, 2
28, 13, 2
29, 13, 2
30, 13, 3
31, 14, 3
32, 14, 3
33, 14, 3
34, 14, 3
35, 14, 3
36, 14, 3
37, 14, 3
38, 14, 3
39, 14, 3
40, 14, 4
41, 15, 4
42, 15, 4
43, 15, 4
44, 15, 4
45, 15, 4
46, 15, 4
47, 15, 4
48, 15, 4
49, 15, 4
50, 15, 5
51, 16, 5
52, 16, 5
53, 16, 5
54, 16, 5
55, 16, 5
56, 16, 5
57, 16, 5
58, 16, 5
59, 16, 5
60, 16, 6
61, 17, 6
62, 17, 6
63, 17, 6
64, 17, 6
65, 17, 6
66, 17, 6
67, 17, 6
68, 17, 6
69, 17, 6
70, 17, 7
71, 18, 7
72, 18, 7
73, 18, 7
74, 18, 7
75, 18, 7
76, 18, 7
77, 18, 7
78, 18, 7
79, 18, 7
80, 18, 8
81, 19, 8
82, 19, 8
83, 19, 8
84, 19, 8
85, 19, 8
86, 19, 8
87, 19, 8
88, 19, 8
89, 19, 8
90, 19, 9
91, 20, 9
92, 20, 9
93, 20, 9
94, 20, 9
95, 20, 9
96, 20, 9
97, 20, 9
98, 20, 9
99, 20, 9
100, 21, 11
103, 22, 12
104, 23, 13
105, 24, 14
106, 25, 15
107, 26, 16
108, 27, 17
109, 28, 18
110, 30, 19
111, 33, 19
112, 35, 19
113, 37, 19
114, 39, 19
115, 41, 19
116, 43, 19
117, 45, 19
118, 47, 19

3. Le programme suivant compte le nombre de '1' et de '0' dans un livre de 118 pages dans les hypothèses que ce soit la feuille 1/2 ou la feuille 2/3, ..., ou la feuille 117/118 qui a été arrachée. Si il trouve 47 fois le '1' et 19 fois le '0', alors il affiche cette feuille (qui est une solution de l'énoncé).

In [5]:
# On peut aussi vérifier toutes les solutions par le code suivant :
possible_pages = [i for i in range(1, 119) if i % 2 != 0]
for page_arr_1 in possible_pages:
    feuille_arr = [page_arr_1,page_arr_1+1]
    nb_1 = len([c for c in ' '.join(str(i) for i in range(1, 119) if i not in feuille_arr) if c=="1"])
    nb_0 = len([c for c in ' '.join(str(i) for i in range(1, 119) if i not in feuille_arr) if c=="0"])
    if nb_1==47 and nb_0==19:
        print(f'({feuille_arr[0]},{feuille_arr[1]})')
(101,102)
(109,110)

4. Le programme suivant vérifie directement ce critère, en parcourant toutes les feuilles et en comptant pour chaque feuille le nombre de '1' et de '0. Si il trouve 3 fois le '1' et 2 fois le '0', alors il affiche cette feuille (qui est une solution de l'énoncé).

In [6]:
#Si l'on veut utiliser le critère que l'on a mis en place, on peut utiliser ce programme
possible_pages = [i for i in range(1, 119) if i % 2 != 0]
for page_arr_1 in possible_pages:
    feuille_arr = str(page_arr_1)+str(page_arr_1+1) 
    nb_1 = feuille_arr.count('1') 
    nb_0 = feuille_arr.count('0') 
    if nb_1 == 3 and nb_0 == 2: # On ne garde que les feuilles avec 3 un et 2 zéros
        print(f'({page_arr_1},{page_arr_1+1})')
(101,102)
(109,110)
In [ ]:
 
In [ ]: