import random

###Devs enlevés :
#Générateurs de SL2(Z),, pourrait rentrer dans la 108, mais pas besoin d'elle sinon.
#Irréductibilité des polynômes cyclotomiques,141

###But du script :
#L'objectif de ce script était de servir à retrouver rapidement mes leçons et leurs développements, à savoir si certains de ces développements sont en trop ou si des leçons n'en ont pas assez. Je l'ai fait pendant le confinement et l'aurai sans doute complétée si les oraux n'avaient pas étés annulés.


fichier_devs = open("/home/pierrels/Agreg/devs.txt", "r")

liste_num_lecons = [(101, "Groupe opérant sur un ensemble. Exemples et applications."),(104,"Groupes abéliens et non abéliens finis. Exemples et applications."),(105,"Groupe des permutations d’un ensemble fini. Applications."),(106,"Groupe linéaire d’un espace vectoriel de dimension finieE, sous-groupes de GL(E). Applica-tions."),(108,"Exemples de parties génératrices d’un groupe. Applications."),(120,"AnneauxZ{nZ. Applications."),(121,"Nombres premiers. Applications."),(123,"Corps finis. Applications."),(126,"Exemples d’équations en arithmétique."),(141,"Polynômes irréductibles à une indéterminée. Corps de rupture. Exemples et applications."),(151,"Dimension d’un espace vectoriel (on se limitera au cas de la dimension finie). Rang. Exempleset applications."),(152,"Déterminant. Exemples et applications."),(153,"Polynômes d’endomorphisme en dimension finie. Réduction d’un endomorphisme en dimen-sion finie. Applications."),(156,"Exponentielle de matrices. Applications."),(157,"Endomorphismes trigonalisables. Endomorphismes nilpotents."),(158,"Matrices symétriques réelles, matrices hermitiennes."),(159,"Formes linéaires et dualité en dimension finie. Exemples et applications."),(162,"Systèmes d’équations linéaires ; opérations élémentaires, aspects algorithmiques et consé-quences théoriques."),(170,"Formes quadratiques sur un espace vectoriel de dimension finie. Orthogonalité, isotropie.Applications."),(190,"Méthodes combinatoires, problèmes de dénombrement."),(191,"Exemples d’utilisation des techniques d’algèbre en géométrie."),(203,"Utilisation de la notion de compacité."),(208,"Espaces vectoriels normés, applications linéaires continues. Exemples."),(214,"Théorème d’inversion locale, théorème des fonctions implicites. Exemples et applications enanalyse et en géométrie."),(219,"Extremums : existence, caractérisation, recherche. Exemples et applications."),(220,"Équations différentielles ordinaires. Exemples de résolution et d’études de solutions en di-mension 1 et 2."),(221,"Équations différentielles linéaires. Systèmes d’équations différentielles linéaires. Exemples etapplications."),(223,"Suites numériques. Convergence, valeurs d’adhérence. Exemples et applications."),(226,"Suites vectorielles et réelles définies par une relation de récurrenceun`1“fpunq. Exemples.Applications à la résolution approchée d’équations."),(228,"Continuité, dérivabilité, dérivation faible des fonctions réelles d’une variable réelle. Exempleset applications."),(229,"Fonctions monotones. Fonctions convexes. Exemples et applications."),(230,"Séries de nombres réels ou complexes. Comportement des restes ou des sommes partielles desséries numériques. Exemples."),(233,"Analyse numérique matricielle. Résolution approchée de systèmes linéaires, recherche d’élé-ments propres, exemples."),(236,"Illustrer par des exemples quelques méthodes de calcul d’intégrales de fonctions d’une ouplusieurs variables."),(239,"Fonctions définies par une intégrale dépendant d’un paramètre. Exemples et applications."),(241,"Suites et séries de fonctions. Exemples et contre-exemples."),(243,"Séries entières, propriétés de la somme. Exemples et applications."),(246,"Séries deFourier. Exemples et applications."),(250,"Transformation deFourier.Applications."),(262,"Convergences d’une suite de variables aléatoires. Théorèmes limite. Exemples et applications."),(264,"Variables aléatoires discrètes. Exemples et applications."),(265,"Exemples d’études et d’applications de fonctions usuelles et spécial")]

temp = fichier_devs.read()

liste_devs = temp.split(sep = "\n")

n = len(liste_devs) #le nombre de développements
m = len(liste_num_lecons) #le nombre de leçons

for k in range(n):
    liste_devs[k] = liste_devs[k].split(sep = ",")

for k in range(n) :
    liste_devs[k][1] = liste_devs[k][1].split(sep=";")
    if liste_devs[k][1][0] == '':
        liste_devs[k][1] = []
    else:
        for j in range(len(liste_devs[k][1])) :
            liste_devs[k][1][j] = int(liste_devs[k][1][j])

def random_dev():
    """ Retourne un numéro de développement au hasard, qui correspond à au moins une leçon """
    k = random.randint(0, n-1)
    while len(liste_devs[k][1]) == 0:
        k = random.randint(0, n-1)
    print(liste_devs[k][0])
    return k

def dev_to_lecon(num_dev) :
    """ à un numéro de développement retourne les leçons associées dans devs.txt """
    return liste_devs[k][1]

def lecon_to_dev(num_lecon, verbose = False):
    """ à un numéro de leçon renvoie les développements associés """
    liste_devs_lecon = []
    for k in range(n) :
        if num_lecon in liste_devs[k][1] :
            if verbose :
                print(liste_devs[k][0])
            liste_devs_lecon.append(k)
    return liste_devs_lecon

def lecon_to_string(num_lecon) :
    """ à un numéro de leçon renvoie son nom """
    for j in range(m) :
        if liste_num_lecons[j][0] == num_lecon :
            print(liste_num_lecons[j])
    
def lecons_incompletes():
    """ Renvoie les lecons qui n'ont pas assez de développements """
    l = []
    for k in range(m):
        if len(lecon_to_dev(liste_num_lecons[k][0])) < 2 :
            l.append((liste_num_lecons[k][0], lecon_to_dev(liste_num_lecons[k][0])))
    return l

def lecons_surchargees():
    """ Renvoie les leçons qui ont strictement plus que 3 développements """
    l = []
    for k in range(m):
        if len(lecon_to_dev(liste_num_lecons[k][0])) >= 3 :
            l.append((liste_num_lecons[k][0], lecon_to_dev(liste_num_lecons[k][0])))
    return l

def developpements_en_trop():
    """ Renvoie les développements que l'on peut enlever de la liste sans avoir de leçons incomplètes """
    compte_devs = n * [0]
    lec_surch = lecons_surchargees()
    for lec in lec_surch :
        for dev in lec[1] :
            compte_devs[dev] += 1
    for k in range(n):
        if len(liste_devs[k][1]) == compte_devs[k]:
            print(liste_devs[k])
    return None

fichier_devs.close()