Solution du défi
Choisis l'énigme dont tu veux voir une solution.
Explications :
On remarque dans un premier temps, qu’entre les pages 1 et 99, Adenine a utilisé 20 fois le chiffre 1 (10 fois pour les dizaines de la liste 10, 11,…,19 et 10 fois pour les unités de la liste 01, 11,…,91).
Ensuite, à partir de 100, à chaque nouvelle page, elle inscrit au moins une fois le chiffre 1. Entre les pages 100 et 109, elle a inscrit 11 fois le chiffre 1 (ne pas oublier de compter deux fois 101). Soit un total de 31 fois le chiffre 1 pour les pages 1 à 109.
A partir de là, on voit qu’elle écrit au moins deux fois le chiffre 1 pour les pages 110 à 119 (trois fois pour la page 111). Il faut donc écrire 21 fois le chiffre 1 pour les pages 110 à 119, ce qui amène le nombre de fois où on doit écrire le chiffre 1 à 31 + 21 = 52 pour les pages 1 à 119.
Donc si Adenine a écrit 50 fois le chiffre 1, c’est qu’elle a numéroté les pages de 1 à 118.
Explications :
Il ne faut pas oublier que lorsqu’on arrache une feuille d’un livre, on retire en réalité deux pages de numéros consécutifs, le premier étant impair.
Essayons dans un premier temps de trouver le nombre de pages du livre.
Entre les pages 1 et 99, le chiffre 1 a été utilisé 20 fois (dix fois pour les unités dans 1, 11, 21, … 91 et dix fois pour les dizaines dans 10, 11, 12, … 19).
Entre les pages 100 et 109, il est utilisé 11 fois (ne pas oublier de compter deux fois la page 101) et entre les pages 110 et 119, il est utilisé 21 fois (ne pas oublier de compter trois fois la page 111), et 1 fois dans la page 120.
Soit un total de 53 utilisations du chiffre 1 pour numéroter les pages de 1 à 120.
Par un raisonnement similaire, on trouve que le chiffre 0 est utilisé 9 fois entre 1 et 99, 11 fois entre 100 et 109, 1 fois entre 110 et 119, et 1 fois pour 120, soit un total de 22 fois entre 1 et 120.
On a plus précisément pour un nombre de pages situé entre 110 et 120 :
Page | Nb de 0 | Nb de 1 |
---|---|---|
110 | 21 | 33 |
111 | 21 | 36 |
112 | 21 | 38 |
113 | 21 | 40 |
114 | 21 | 42 |
115 | 21 | 44 |
116 | 21 | 46 |
117 | 21 | 48 |
118 | 21 | 50 |
119 | 21 | 52 |
120 | 22 | 53 |
De ces observations, on conclut que le livre a au moins 117 pages: en effet s'il en avait moins, il y aurait avant arrachage au plus 46 fois le chiffre 1, donc impossible d'en avoir 47 après. On nous dit que le livre a un nombre pair de pages, il en a donc 118, ou 120, ou 122, etc. Cependant, si le livre avait 120 pages, avant arrachage d’une feuille il y aurait donc 53 fois le chiffre 1 dans les numéros de page. Comme il n’y en a plus que 47 après arrachage d’une seule feuille, cela voudrait dire que cette feuille contient 6 fois le chiffre 1, ce qui n’est pas possible. Avec un livre de 122 pages il faudrait que la page supprimée ait au moins 8 fois le chiffre 1. Avec un livre de124, au moins 10 fois… Avec un livre ayant entre 1000 pages et 9999 pages, il faudrait que la page supprimée contienne beaucoup plus de 1 que les 8 chiffres maximum que contiennent une double page. Etc. Bref, le livre ne peut avoir que 118 pages exactement.
D'après le tableau, un livre de 118 pages intact a 50 fois le chiffre 1 et 21 fois le chiffre 0 inscrits dans ses numéros de page. La feuille arrachée comporte alors 50 − 47 = 3 fois le chiffre 1 et 21 − 19 = 2 fois le chiffre 0. Les seules feuilles vérifiant toutes ces conditions sont les feuilles 101/102 et 109/110.
Remarque :Bien sûr on peut laisser un ordinateur compter pour nous.
D'abord, voici un programme (en langage python) qui compte le nombre de chiffres '1' et de chiffres '0' dans tous les nombres de 1 à n.
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')
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')
# 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”
Puis, voici un 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.
# 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).count('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).count('0') + 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 |
... | ||
99 | 20 | 9 |
100 | 21 | 11 |
103 | 22 | 12 |
104 | 23 | 13 |
... | ||
116 | 43 | 19 |
117 | 45 | 19 |
118 | 47 | 19 |
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é).
# 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)
Pour finir, vérifions la proposition : « La feuille arrachée comporte alors 50 − 47 = 3 fois le chiffre 1 et 21 − 19 = 2 fois le chiffre 0. Les seules feuilles vérifiant toutes ces conditions sont les feuilles 101/102 et 109/110.»
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é).
#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 uns et 2 zéros
print(f'({page_arr_1},{page_arr_1+1})')
(101,102)
(109,110)
Retour au calendrier.