Bonjour,
Trois urnes de contenances illimitées contiennent chacune un nombre entier (en cm3) de liquide.
On ne peut transférer d'une urne dans une autre que la quantité présente dans l'urne réceptrice.
Pouvez-vous vider entièrement une des trois urnes ?
Exemple : 9, 8 et 21 cm3. Une méthode générale est demandée, pour tous contenus.
Bonjour à tous!
Le problème posé est voisin du vieux problème des "trois cruches".
Ce problème a fait l'objet d'une épreuve écrite du Concours Commun de Centrale.
Voir sur le site du Concours Centrale Supélec , à la page des "rapports et sujets",
l'épreuve de Mathématiques2 de la filière TSI de 2014.
On y présente une méthode généralisable à ces problèmes de transvasements entre trois récipients, basée sur des endomorphismes de l'espace vectoriel R^6.
>> rogerd : vieux problème , c'est vrai. mais bien moins général que l'étude proposée sur le site du Concours Centrale Supélec , à la page des "rapports et sujets",
l'épreuve de Mathématiques2 de la filière TSI de 2014.
et une méthode généralisée à tous contenus initiaux en est de formulation bien plus simple.
>>flight : j'ai manqué votre réponse sous blank, Mon commentaire fait à carpediem (à 15;22) était pour vous...
>> flight : Oui, en démontrant que le programme va aboutir (s'arrêter avec une suite de manipulations finie) quels que soient les contenus initiaux...
Un programme de ce type existe.
>>wham
L'idée du sujet de Centrale était de montrer qu'on peut traiter un tel problème avec les techniques de l'algèbre linéaire dans R^6:
3 variables pour les volumes occupés par l'eau et 3 variables pour les volumes vides.
A chaque transfert de liquide d'une cruche dans une autre on associe un endomorphisme de R^6.
Par ailleurs, la dernière partie de l'énoncé faisait appel à l'informatique (vérification d'un programme résolvant le problème posé).
Re Bonjour,
>>flight :
Pourquoi vous dites que mon programme ne s arrêtera pas ??.. Je vous ai montré un exemple de traitement avec des valeurs..
Bonjour,
>> carpediem : Ubound(t) c'est le plus grand index du tableau qui contient donc Ubound(t) + 1 valeurs.
>> flight : je vous montre que votre programme tournera indéfiniment avec les valeurs initiales 12 15 18, car la succession des trois valeurs sera 24 15 6, 12 15 18, 24 15 6,..... Votre méthode ne répond pas au problème
"Une méthode générale est demandée, pour tous contenus."
Avant de donner une solution, je précise les indices donnés précédemment pour une méthode générale :
utiliser un principe simple accessible aux lycéens (division euclidienne)
Ensuite une méthode facile à mettre en oeuvre est utilisée dans un jeu d'allumettes célèbre.
Carpediem pourrais tu m expliquer ceci :
"cependant je dois dire que flight programmant ??"
C est quoi?...du rabaissement ?
Bonjour à tous.
>> jsvdb :
rogerd : merci
flight : nul rabaissement : seulement le constat que tu utilises un langage ... disons un peu désuet ... voire ""peu connu"" (enfin "peu utilisé" dans le milieu éducatif en tout cas) et je rejoignais seulement vham dans sa remarque blanckée de 17h52 plussoyée par jsvdb à 11h27 ...
je ne demande pas de détailler la logique de l'algo (ou plus tard) mais de préciser certains mots du langage
c'est l'avantage de l'algo qui peut être compris par tout le monde ... mais qui alors peut faire comprendre la logique de la solution
donc un pgm ok ... mais avec qq éléments d'explication surtout pour le vocabulaire utilisé
Bonjour,
Rappel : Trois urnes de contenances illimitées contiennent chacune un nombre entier (en cm3) de liquide.
On ne peut transférer d'une urne dans une autre que la quantité présente dans l'urne réceptrice.
Pouvez-vous vider entièrement une des trois urnes ?
Solution en Python 3.5
def vidage(L): # les contenus de 3 vases A,B,C sont dans une liste indicée de 0 à 2
print( L)
while not L[1]==0: #tant que B ne sera pas vide
L=sorted(L) # contenus ordonnés croissants : a <= b <= c
q=L[1]//L[0] # quotient dans b = aq + r division euclidienne
lg=len(bin(q))-2 #longueur de q exprimé en binaire
for i in range(lg): #index des bits de q
# transfert dans A depuis B si bit=1 ou depuis C si bit=0
# le membre de gauche n'est mis à jour qu'après calcul à droite
L[0],L[2-((q>>i)&1)]=L[0]*2,L[2-((q>>i)&1)]-L[0]
print( L)
vidage([887,79,491]) # pour exemple
print("***************")
vidage([8,9,21]) # pour exemple
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :