﻿# Créé par francoisd, le 15/03/2018 en Python 3.2

def ordonne_Liste(L):
    """
    Fonction qui ordonne les éléments d'une liste L
    """
    LL = L
    l = len(L)
    Liste_Ordonnee =[]
    for i in range(l):
        m = min(L)
        Liste_Ordonnee.append(m)
        try:
            LL.remove(m)
        except :
            pass
    return Liste_Ordonnee


def masses_possibles(a,b,c,d):
    """
    Fonction qui détermine les masses évaluables à l'aide d'une balance à plateaux
    si l'on dispose de 4 masses a, b, c, d.
    retourne deux listes les solutions et les masses impossibles à peser.
    """
    # Initialisation des listes
    Possibles = []
    Absentes = []

    # Détermination de la masse maximale accessible
    ttl = a+b+c+d

    # Liste Absente contient les masses non trouvée (au départ la liste est "pleine")
    for m in range(ttl):
        Absentes.append(m+1)

    # boucle effectuant toutes les pesées réalisables
    for i in range(-1,2):
        for j in range(-1,2):
            for k in range(-1,2):
                for l in range(-1,2):
                    # Chaque masse se voit affectée d'un coefficient -1, 0, 1
                    #traduisant sa présence sur le plateau de droite, de gauche ou son absence
                    p = a*i+b*j+c*k+d*l
                    # Complétion des Listes
                    if (p not in Possibles) and (p>0):
                        Possibles.append(p)
                        try :
                            Absentes.remove(p)
                        except :
                            pass
    print("Les masses acessibles sont : ",ordonne_Liste(Possibles))
    print("Les masses impossibles à atteindre sont : ",ordonne_Liste(Absentes), " ainsi que celles supérieures à ", ttl)
    return Possibles, Absentes

masses_possibles(2,5,9,17)
