Informations sur la validation France-IOI

From Wiki Cours
Jump to navigation Jump to search

<-- Site du cours

Changements dans les dates requises de validation : il vous faut

  • valider le niveau I pour le 20/10/16
  • valider le niveau II pour le 10/11/16

France-IOI vous permet de travailler en autonomie en dehors des séances de TDs. On privilégiera maintenant les exercices des TDs, la validation consistera donc à du travail personnel.

Notes de validation provisoires des étudiants au 13/10/16

La note sur 20 est calculée selon la formule :

============================================================
NOM Prénom                    | %exo | Niv1 | Niv2 |  Note |
============================================================
ADA SIMA MARIE JOELLE DOLIANA | 0.05 | 0.07 | 0.00 |  0.67 |
BEN HAMOUDA Wassim            | 0.11 | 0.07 | 0.00 |  0.67 |
BOUDRIES Fahem                | 0.39 | 0.73 | 0.00 |  7.33 |
BOUFFETIER victorien          | 0.18 | 1.00 | 0.00 | 10.00 |
BREBAN Arthur                 | 0.38 | 1.00 | 0.38 | 13.75 |
BRETEL Rémi                   | 0.50 | 0.73 | 0.00 |  7.33 |
BRILLOUET Pierre              | 0.59 | 0.87 | 0.00 |  8.67 |
CAILLAS Augustin              | 0.19 | 1.00 | 0.25 | 12.50 |
CASTELAIN Maxime              | 0.34 | 1.00 | 0.50 | 15.00 |
COQUIDÉ Erwan                 | 0.11 | 0.80 | 0.00 |  8.00 |
DE GRANDSAIGNES Hervé         | 0.09 | 0.67 | 0.00 |  6.67 |
DEFOORT Grégoire              | 0.40 | 0.73 | 0.00 |  7.33 |
DEPONTAILLER Lucie            | 0.56 | 0.80 | 0.00 |  8.00 |
DIAF Mohamed                  | 0.71 | 0.93 | 0.12 | 10.58 |
EID Doris                     | 0.55 | 0.80 | 0.19 |  9.88 |
FLORES GALICIA Fatima         | 0.27 | 0.47 | 0.00 |  4.67 |
GUERFA Driffa                 | 0.72 | 0.93 | 0.44 | 13.71 |
HU Xu                         | 0.60 | 0.93 | 0.00 |  9.33 |
JALAL Yassine                 | 0.33 | 0.67 | 0.00 |  6.67 |
JOIE Mathieu                  | 0.80 | 1.00 | 0.44 | 14.38 |
JULIEN Claveau                | 0.00 | 0.00 | 0.00 |  0.00 |
KUMAR ritesh                  | 0.12 | 0.13 | 0.00 |  1.33 |
LEFEBVRE corentin             | 0.40 | 0.80 | 0.19 |  9.88 |
LI Ying                       | 0.61 | 0.93 | 0.00 |  9.33 |
LIANG chenmeijing             | 0.17 | 0.13 | 0.00 |  1.33 |
LIM kyungtak                  | 1.00 | 1.00 | 1.00 | 20.00 |
LIU Shu                       | 0.63 | 1.00 | 0.00 | 10.00 |
LIÉNARD--MAYOR Théo           | 0.48 | 1.00 | 0.00 | 10.00 |
LOUIS DE CANONVILLE Cyprien   | 0.13 | 0.80 | 0.12 |  9.25 |
MARENA Kéba                   | 0.15 | 0.07 | 0.00 |  0.67 |
NOUR-EDDINE Imam              | 0.14 | 0.13 | 0.00 |  1.33 |
REZARD Quentin                | 0.23 | 0.27 | 0.00 |  2.67 |
SAMB cheikh                   | 0.25 | 0.67 | 0.00 |  6.67 |
SIMON Stéphane                | 0.31 | 0.47 | 0.00 |  4.67 |
SUREAU Robin                  | 0.42 | 0.60 | 0.00 |  6.00 |
VANDERMAESEN Tiphaine         | 0.35 | 1.00 | 0.00 | 10.00 |
VIDALOT Jeoffray              | 0.54 | 0.80 | 0.19 |  9.88 |
ZHOU YUANZHE                  | 0.04 | 0.07 | 0.00 |  0.67 |
============================================================

Elles sont générées avec le script suivant:

"""                                                                                                              
   Un script qui analyse les résultats d'une classe sur http://www.france-ioi.org                                
   et qui produit un tableau de la validation des élèves.                                                        
   écrit par Guillaume Roux (Université Paris Sud)                                                               
   merci de me rapporter les bugs.                                                                               
                                                                                                                 
   Utilisation sous Linux:                                                                                       
      python3 validation-france-ioi.py                                                                           
                                                                                                                 
   ToDo list:                                                                                                    
   * recuperer le fichier depuis internet via le numero de groupe ou un lien                                     
   * eliminer les superviseurs des membres                                                                       
   * verifier automatiquement qu'il n'y a pas d'anomalies dans les dates de resolution (triche)                  
   * faire afficher les moyennes et la date de validation                                                        
   * export vers tableau Excell ou OpenOffice                                                                    
"""
from html.parser import HTMLParser

exercises = []
jumped = ["c'est plus, c'est moins",": mélange explosif"]
niveau1 = ["Dans le fourré","Vendanges","Course avec les enfants","Construction d'une pyramide","La Grande Brade\
rie","Socles pour statues","Le plus beau Karva","Concours de tir à la corde","Mot de passe du village","Planning\
 de la journée","Le juste prix","Casernes de pompiers","Zones de couleurs","Département d'architecture : constru\
ction d'une pyramide","Département de chimie"]
niveau2 = ["Augmentation des taxes","Achat de livres","Une belle récolte","La roue de la fortune","Visite de la \
mine","Banquet municipal","Choix des emplacements","Une ligne sur deux ","Lire ou ne pas lire, telle est la ques\
tion","Analyse de fréquence","Écriture en miroir","La bataille","Analyse d’une langue","Sans espaces","Formes cr\
euses","Convertisseur d'unités"]

class Member(object):

    def __init__(self,name,num):
	self.name = name
	tmp = name.split()
        self.nicename = " ".join(tmp[:-2]).upper()+" "+tmp[-2]
        self.number = num
        self.results = dict()

    def note(self,exos=[]):
        if exos: return sum([self.results[e] for e in exos])/len(exos)
        else: return 0.0

    def showResults(self):
        note = 0
        for exo in exercises:
            note += self.results[exo]
            print("\t",exo,":",self.results[exo])

class Parser(HTMLParser):

    def __init__(self):
        HTMLParser.__init__(self)
        self.inlycee = False
        self.exotype = False
        self.members = []
        self.curexo = ""
        self.mcount = 0
        self.exocount = 0
        self.solved = 0
        self.count = 0

    def handle_starttag(self, tag, attrs):
        self.inlycee = self.exotype = False
        for attr in attrs[:1]:
            self.inlycee = attr[0] == 'class' and attr[1] == "lycee_resume_value"
            self.exotype = attr[0] == 'href' and \
                           attr[1][:35] == "http://www.france-ioi.org/algo/task"
        if self.inlycee and len(attrs)==2:
            self.solved = int(attrs[1][1]=="background-color:lightgreen")
        else:
            self.solved = 0

    def handle_data(self, data):
        if self.inlycee:
            if '(' in data:
                if not data in [m.name for m in self.members]:
                    self.members.append(Member(data,self.mcount))
                    self.mcount += 1
            if self.curexo in exercises and self.count<len(self.members):
                self.members[self.count].results[self.curexo] = self.solved
                self.count += 1
        if self.exotype and len(data)>=3:
            if "«" in data: data = data[:24]
            if not data in jumped:
                self.curexo = data
                self.count = 0
                if (not data in exercises) and self.exocount<114:
                    self.exocount += 1
                    exercises.append(data)

    def showMembers(self):
#        print("Found",len(self.members),"members")                                                              
        maxlenname = max([len(m.nicename) for m in self.members])
        barre = "="*(maxlenname+31)
        print(barre)
        print("NOM Prénom".ljust(maxlenname),"%exo","Niv1","Niv2","Note".rjust(5),sep=" | ",end=" |\n")
        print(barre)
        for m in sorted(self.members,key=lambda x: x.nicename):
            pexo = "{:.2f}".format(m.note(exercises))
            pniv1 = "{:.2f}".format(m.note(niveau1))
            pniv2 = "{:.2f}".format(m.note(niveau2))
            nf = "{:.2f}".format((m.note(niveau1)+m.note(niveau2))*10)
            print(m.nicename.ljust(maxlenname),pexo,pniv1,pniv2,nf.rjust(5),sep=" | ",end=" |\n")
        print(barre)

    def showExercises(self):
        print("Found",len(exercises),"exercises")
        for e in exercises: print(e)

    def showResults(self,number=None):
        if number is None: number = range(len(self.members))
        print("__"*20)
        for n in number:
            print("Résultat de",self.members[n].nicename,"note :",\
                  self.members[n].note(exercises))
            self.members[n].showResults()

# mettez ici le chemin vers votre fichier à analyser                                                             
fichier = "France-IOI.html"
parser = Parser()
source = open(fichier, 'r')
parser.feed(source.read())
source.close()
parser.showMembers()
#parser.showResults([8])