Serrure bloquée

Résolu
Jean-Louis - Modifié le 17 nov. 2023 à 14:34
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 - 22 nov. 2023 à 10:28

Bonjour, donnez moi toutes les combinaisons possibles de 1 à 45 par groupe de 4 


Android / Chrome 105.0.5195.136

4 réponses

[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
15 nov. 2023 à 15:30

Salut à tous,

Jean-Louis a posté sur le forum "Programmation".

S'il doit écrire un programme qui affiche toutes les combinaisons possibles d'une serrure imaginaire à 4 entrées de 1 à 45 (alors sa question est mal posée et n'indique pas non plus le langage dans lequel il souhaite le faire), mais ce n'est pas très difficile, et en fait le langage importe peu, puisqu'il suffit de pouvoir faire des boucles imbriquées pour afficher les 45^4 possibilités successives.

0
brucine Messages postés 14470 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 6 mai 2024 1 849
15 nov. 2023 à 16:20

Bonjour,

Avec la nouvelle nomenclature des forums (et même avant) là où les gens écrivent n'est pas forcément un critère et on finit par ne plus y faire attention.

Mais même si tu es dans le vrai, l'exercice ne pourrait être que théorique: avant d'avoir fini d'afficher toutes les possibilités, ou même du seul fait de les calculer, le programme, il risque fort de faire tilt.

0
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083 > brucine Messages postés 14470 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 6 mai 2024
Modifié le 16 nov. 2023 à 15:05

C'est l'affichage qui prend du temps. Lancé en console, la sortie standard du programme peut être redirigée sur un fichier et l'exécution ne prend alors que quelques instants sur un ordinateur raisonnablement récent.

Par exemple, en C :

#include <stdio.h>
  
int main(void) {
    for (int m = 1; m < 46; m++)
        for (int c = 1; c < 46; c++)
            for (int d = 1; d < 46; d++)
                for (int u = 1; u < 46; u++)
                    printf("%d-%d-%d-%d\n", m, c, d, u);
    return 0;
}

Sous Linux avec mon ordinateur portable :

$ gcc -Wall -Wextra 37946477.c
$ time ./a.out > 37946477.txt

real	0m0,591s
user	0m0,571s
sys	0m0,020s
$ head 37946477.txt
1-1-1-1
1-1-1-2
1-1-1-3
1-1-1-4
1-1-1-5
1-1-1-6
1-1-1-7
1-1-1-8
1-1-1-9
1-1-1-10
$ tail 37946477.txt
45-45-45-36
45-45-45-37
45-45-45-38
45-45-45-39
45-45-45-40
45-45-45-41
45-45-45-42
45-45-45-43
45-45-45-44
45-45-45-45

Sous Linux, la commande head ci-dessus affiche les 10 premières lignes et la commande tail les 10 dernières. Le fichier contient 4100625 lignes (45^4) et pèse 44 Mo chez moi.

Pas de tilt :-)

1
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752 > [Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024
Modifié le 17 nov. 2023 à 13:18

Merci [Dal] pour ton programme. Attention toutefois, le programme que tu proposes retourne le produit cartésien, pas toutes les combinaisons.

  • S'il est question par exemple d'un coffre fort avec 4 molettes chacune ayant 45 positions, c'est effectivement bien le produit cartésien.
  • S'il est question des combinaisons au sens mathématiques, ce n'est pas la même chose. De plus il faudrait spécifier si elles sont avec ou sans répétitions (au lycée, elles sont implicitement sans répétitions). Et il ne faut pas confondre avec les arrangements (ou permutations)

En fonction du problème que l'on cherche à traiter python plusieurs fonctions dans le module itertools:

Iterator

Arguments

Résultat

product()

p, q, … [repeat=1]

Produit cartésien, équivalent à des boucles for imbriquées

permutations()

p[, r]

Tuples de le longueur r non triés mais sans répétition

(arrangement)

combinations()

p, r

Tuples de longueur r triés et sans répétition

(combinaison)

combinations_with_replacement()

p, r

Tuples de longueur r triés et avec répétition

(combinaison avec répétition)

Exemples : 

Exemple

Résultat

product('ABCD', repeat=2)

AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD

permutations('ABCD', 2)

AB AC AD BA BC BD CA CB CD DA DB DC

combinations('ABCD', 2)

AB AC AD BC BD CD

combinations_with_replacement('ABCD', 2)

AA AB AC AD BB BC BD CC CD DD

Dans le cas présent :

from itertools import (
    combinations,
    combinations_with_replacement,
    permutations,
    product
)

for f in combinations, combinations_with_replacement, permutations:
    l = list(f(range(1, 46), 4))
    print(f, len(l))  # Afficher le nombre de solutions

l = list(product(range(1, 46), repeat=4))
print(product, len(l))

Résultat :

<class 'itertools.combinations'> 148995
<class 'itertools.combinations_with_replacement'> 194580
<class 'itertools.permutations'> 3575880
<class 'itertools.product'> 4100625

Bref si on revient à la question, le programme python qui retourne les combinaisons (sans répétition) de 4 éléments compris entre 1 et 45 inclus serait :

from itertools import combinations

print(combinations(range(1, 46), repeat=4))

... ou le produit cartésien :

from itertools import product

print(product(range(1, 46), repeat=4))

Bonne chance

1
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083 > mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024
17 nov. 2023 à 15:07

Le sujet indique qu'il s'agit d'une "serrure" bloquée et la question bien que très succincte et certainement mal posée parait parler des nombres possibles pour l'ouverture de cette serrure. Il me semble donc que l'on parle de ce que l'on appelle communément une "serrure à combinaison de chiffres" (ici des nombres).

Ma compréhension est qu'il s'agit d'un problème identique à celui consistant à déterminer toutes les positions possibles pour tenter l'ouverture d'un cadenas à combinaison de 4 chiffres de 0 à 9, où il y a simplement de 0000 à 9999 possibilités, c'est à dire 10000 c'est à dire 10^4.

Il paraît évident qu'une serrure pourrait avoir des répétitions (2-2-4-4 serait une "combinaison" valide pour une serrure quand bien mêmes les chiffres 2 et 4 sont répétés) et que l'ordre des numéros a une importance (si 2-2-4-4 ouvre la serrure c'est la bonne "combinaison" et cela ne signifie pas que 4-4-2-2 le fasse).

S'il faut appliquer des termes mathématiques, il me semble qu'on se situerait dans un problème de détermination d'arrangements avec répétition

https://fr.wikipedia.org/wiki/Arrangement_avec_r%C3%A9p%C3%A9tition

Le programme que je propose retourne tous ces arrangements.

Maintenant, comme les maths et moi cela fait 2, je vais attendre patiemment qu'on me contredise de nouveau :-)

0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752 > [Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024
21 nov. 2023 à 14:43

À ceci prêt qu'un "arrangement avec répétition" est simplement un produit cartésien, je suis entièrement d'accord avec ce que tu dis :-)

0
THeo_9230 Messages postés 2 Date d'inscription vendredi 17 novembre 2023 Statut Membre Dernière intervention 28 mars 2024
Modifié le 17 nov. 2023 à 15:56

Bonjour, as tu essayé de poser la question à une IA ? (chat gpt , bing etc) Je pense que tu aurais une réponse plus rapide et simple pour résoudre ton problème.

Bon courage :)

0
georges97 Messages postés 11862 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 6 mai 2024 2 262
17 nov. 2023 à 18:05

Bonjour,

Aaah l'IA !!!!! L' Alpha et l' IAmega.

On se demande pourquoi les gens s'inscrivent encore sur des forums. Peut-être pour avoir des adresses d'IA.

0
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
Modifié le 17 nov. 2023 à 19:06

@THeo_9230 StatutMembre a écrit :

Bonjour, as tu essayé de poser la question à une IA ? (chat gpt , bing etc) Je pense que tu aurais une réponse plus rapide et simple pour résoudre ton problème.

Une réponse rapide oui, simple et exacte pas forcément.

Encore faut-il savoir formuler la question, qui est mal formulée en l'état, et qui de plus utilise sémantiquement le terme "combinaisons" qui a des chances d'induire en erreur l'IA sur la nature réelle du problème.

Voilà la conversation que je viens d'avoir avec ChatGPT 3.5  avec le "Prompt" suivant fidèle à la question de l'OP et son contexte : "Dans un forum d'assistance informatique, une personne poste dans la rubrique "programmation" une question avec un intitulé "Serrure bloquée" et dont le contenu est le suivant : "Bonjour, donnez moi toutes les combinaisons possibles de 1 à 45 par groupe de 4". Pouvez-vous donner une réponse à cette question ?"

https://chat.openai.com/share/154ccfc1-249e-4af9-b17d-51cc41b55d77

ChatGPT répond immédiatement :

from itertools import combinations

# Générer toutes les combinaisons de 4 nombres de 1 à 45
combinations_list = list(combinations(range(1, 46), 4))

# Afficher les combinaisons
for combo in combinations_list:
    print(combo)

ChatGPT comprend donc qu'une réponse appropriée est de fournir un code permettant un affichage, plutôt que d'afficher la liste elle même.

Sauf que la réponse n'est pas bonne.

Au début je donne une chance l'IA de se rattraper toute seule en lui disant qu'elle ne répond pas au problème posé. Elle me demande alors des précisions sur le fonctionnement de la serrure et j'écris :

Moi : La serrure fonctionne comme un cadenas à 4 chiffres dont les chiffres peuvent aller de 0 à 9, sauf qu'ici il s'agit de 4 nombres pouvant aller de 1 à 45.

Elle semble comprendre ce que je dis :

ChatGPT : Si la serrure fonctionne comme un cadenas à 4 chiffres, mais avec des nombres de 1 à 45, cela signifie que chaque chiffre de la combinaison peut être n'importe quel nombre entre 1 et 45.

C'est exactement comme cela que devrait fonctionner la serrure. Mais l'IA n'a pas pour autant "compris" le problème et me soutient que le code initialement proposé répond à la question.

Alors pour lui faire additionner 2 + 2, je lui demande ceci, ce qui donne ce passage amusant :

Moi : Le code que vous avez proposé est-il susceptible de générer, par exemple, la combinaison : 1-1-1-2 ?

ChatGPT : Non, le code que j'ai fourni génère des combinaisons uniques de 4 nombres parmi les nombres de 1 à 45. Donc, dans ce cas, il ne générera pas la combinaison spécifique que vous avez mentionnée (1-1-1-2). Chaque nombre dans la combinaison est unique. 

Cela ne lui pose apparemment aucun problème... alors je l'interpelle :

Moi : Une serrure dont le code numérique empêcherait son utilisateur de répéter les chiffres ne serait-elle pas mal conçue ?

ChatGPT : C'est une excellente observation. En effet, dans la plupart des conceptions de serrures numériques, il est généralement permis de répéter les chiffres dans le code. Limiter la possibilité de répétition peut rendre la serrure moins sécurisée, car cela réduit le nombre total de combinaisons possibles.

Les serrures numériques classiques permettent généralement aux utilisateurs de choisir des combinaisons où les chiffres peuvent être répétés. Cela contribue à accroître la complexité et la sécurité du code. (...)

Ce n'est qu'au bout de 7 questions que ChatGPT 3.5 se rend compte que sa réponse est erronée, et il faut constamment lui tirer les vers du nez et lui rappeler quelle est la question posée pour espérer obtenir quelque chose de partiellement correct à la 8ème question et il en faudra une 9ème car entre-temps ChatGPT avait oublié qu'on demandait toutes les possibilités et non pas seulement les 5 premières générées :

ChatGPT : Bien sûr, je comprends mieux maintenant. Voici le code qui génère toutes les combinaisons possibles de 1 à 45 par groupes de 4, en permettant la répétition des chiffres :

from itertools import product

# Générer toutes les combinaisons de 4 nombres de 1 à 45 avec répétition
combinations_list = list(product(range(1, 46), repeat=4))

# Afficher toutes les combinaisons
for combo in combinations_list:
    print(combo)

Pourquoi ChatGPT me propose-t-elle initialement un code pour une serrure à combinaison numérique dont la conception serait non sécurisée ?

Moi : Pouvez-vous m'indiquer pourquoi vous m'avez initialement proposé un code Python répondant à question pour une serrure non sécurisée ?

ChatGPT : Je m'excuse pour cette erreur. C'était une malentendu de ma part. J'ai initialement fourni un code qui génère des combinaisons uniques sans répétition, ce qui n'est pas conforme aux attentes d'une serrure numérique classique. C'était une omission de ma part, et je m'excuse pour la confusion que cela a pu causer.

Merci de votre patience et de m'avoir permis de corriger cela. Si vous avez d'autres questions ou si vous avez besoin de clarifications, n'hésitez pas.

Il y a la mention "ChatGPT can make mistakes. Consider checking important information." en bas de l'interface... ce n'est pas pour rien :-)

Et vivent les humains !

0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
21 nov. 2023 à 14:42

Merci pour ton retour d'expérience, qui montre typiquement que trop de paresse intellectuelle en aurait fait foncer plus d'un à pieds joints dans une réponse incorrecte.

0
brucine Messages postés 14470 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 6 mai 2024 1 849 > mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024
21 nov. 2023 à 14:55

Bonjour,

Une question mal posée est une question mal répondue hors IA parce que comme il a été remarqué il ne s'agit pas d'une combinaison de k nombres parmi n mais d'un arrangement avec répétition de k nombres parmi n, et ce pour quoi si on pose ces termes à Google ou à qui on voudra on obtiendra immédiatement la formule donnant le nombre de possibilité, leur liste c'est un peu plus complexe d'autant qu'on a le choix des armes (le logiciel ou script de programmation).

A contrario, nous constatons à nouveau qu'une question à une IA, même quand elle finit par être posée dans les termes idoines, n'aura finalement rien fait d'autre que de nous faire perdre notre temps.

En dehors des capacités réelles ou supposées de cette IA, le mythe est de penser qu'elle pourra répondre à un raisonnement mal structuré alors que ce dernier même réclame, sinon un minimum "d'intelligence", en tout cas comme tu le soulignes une absence de paresse intellectuelle.

1
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083 > brucine Messages postés 14470 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 6 mai 2024
Modifié le 22 nov. 2023 à 10:32

Oui, si tu poses la question suivante à ChatGPT : "Pouvez vous me proposer un programme informatique qui génère tous les arrangements avec répétition de 4 nombres parmi 25 numérotés de 1 à 25 ?", il te donnera immédiatement le bon code car elle est posée en termes qualifiant déjà le problème en un type de problème mathématique de dénombrement.
 

Une fois qu'on a fait cela on a fait 90% du travail et pour les 10% restants on doit juste trouver et appliquer la bonne méthode correspondante. Sachant qu'avec Python et le module itertools on a des fonctions toutes prêtes qui nous mâchent le travail on pourrait même dire que c'est alors 1% du travail qui reste à faire (lire la doc du module et lancer correctement la bonne fonction, ce qui se fait en 1 ligne de code).

0