Informations sur la validation France-IOI: Difference between revisions

From Wiki Cours
Jump to navigation Jump to search
No edit summary
Line 11: Line 11:


La note sur 20 est calculée selon la formule :  
La note sur 20 est calculée selon la formule :  
<math>\text{Note} = 10*(\%\text{Niv1} + \%\text{Niv2})</math>
<math>\text{Note} = 10\times(\%\text{Niv1} + \%\text{Niv2})</math>


<source lang=python>
<source lang=python>

Revision as of 11:09, 6 October 2016

<-- 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 06/10/16

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

==========================================================
NOM Prénom                  | %exo | Niv1 | Niv2 |  Note |
==========================================================
GRABSCH Aurelien            | 0.04 | 0.27 | 0.00 |  2.67 |
BREBAN Arthur               | 0.28 | 0.87 | 0.00 |  8.67 |
BOUDRIES Fahem              | 0.24 | 0.27 | 0.00 |  2.67 |
CAILLAS Augustin            | 0.12 | 0.73 | 0.00 |  7.33 |
DE GRANDSAIGNES Hervé       | 0.09 | 0.67 | 0.00 |  6.67 |
EID Doris                   | 0.62 | 0.67 | 0.56 | 12.29 |
COQUIDÉ Erwan               | 0.11 | 0.80 | 0.00 |  8.00 |
JOIE Mathieu                | 0.63 | 1.00 | 0.00 | 10.00 |
FLORES GALICIA Fatima       | 0.27 | 0.47 | 0.00 |  4.67 |
LIÉNARD--MAYOR Théo         | 0.44 | 0.80 | 0.00 |  8.00 |
DEFOORT Grégoire            | 0.33 | 0.60 | 0.00 |  6.00 |
LOUIS DE CANONVILLE Cyprien | 0.10 | 0.73 | 0.00 |  7.33 |
VIDALOT Jeoffray            | 0.49 | 0.67 | 0.00 |  6.67 |
MARENA Kéba                 | 0.12 | 0.07 | 0.00 |  0.67 |
DEPONTAILLER Lucie          | 0.49 | 0.73 | 0.00 |  7.33 |
LIANG chenmeijing           | 0.14 | 0.13 | 0.00 |  1.33 |
LIM kyungtak                | 0.99 | 1.00 | 1.00 | 20.00 |
LIU Shu                     | 0.51 | 0.73 | 0.00 |  7.33 |
LI Ying                     | 0.55 | 0.73 | 0.00 |  7.33 |
GUERFA Driffa               | 0.55 | 0.87 | 0.00 |  8.67 |
DIAF Mohamed                | 0.57 | 0.67 | 0.00 |  6.67 |
NOUR-EDDINE Imam            | 0.14 | 0.13 | 0.00 |  1.33 |
ORIEUX François             | 0.03 | 0.00 | 0.00 |  0.00 |
LEFEBVRE corentin           | 0.39 | 0.60 | 0.50 | 11.00 |
BRILLOUET Pierre            | 0.51 | 0.73 | 0.00 |  7.33 |
REZARD Quentin              | 0.23 | 0.27 | 0.00 |  2.67 |
BRETEL Rémi                 | 0.34 | 0.47 | 0.00 |  4.67 |
KUMAR ritesh                | 0.12 | 0.13 | 0.00 |  1.33 |
SUREAU Robin                | 0.30 | 0.27 | 0.00 |  2.67 |
SAMB cheikh                 | 0.16 | 0.27 | 0.00 |  2.67 |
SIMON Stéphane              | 0.23 | 0.27 | 0.00 |  2.67 |
CASTELAIN Maxime            | 0.23 | 0.73 | 0.00 |  7.33 |
HU Xu                       | 0.50 | 0.73 | 0.00 |  7.33 |
VANDERMAESEN Tiphaine       | 0.32 | 0.87 | 0.00 |  8.67 |
BOUFFETIER victorien        | 0.15 | 0.73 | 0.00 |  7.33 |
BEN HAMOUDA Wassim          | 0.11 | 0.07 | 0.00 |  0.67 |
JALAL Yassine               | 0.11 | 0.27 | 0.00 |  2.67 |
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 le 5/10/16 par Guillaume Roux (Université Paris Sud)                                                      
   merci de me rapporter les bugs.                                                                                 
"""
from html.parser import HTMLParser

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.note = 0
        self.results = dict()
        self.note_niveau1 = 0
        self.note_niveau2 = 0

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 Braderi\
e","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 : construction \
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 mi\
ne","Banquet municipal","Choix des emplacements","Une ligne sur deux ","Lire ou ne pas lire, telle est la question\
","Analyse de fréquence","Écriture en miroir","La bataille","Analyse d’une langue","Sans espaces","Formes creuses"\
,"Convertisseur d'unités"]
niveau1max = len(niveau1)
niveau2max = len(niveau2)

# create a subclass and override the handler methods                                                               
class Parser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.inlycee = False
        self.exotype = False
        self.members = []
        self.exercises = []
        self.curexo = ""
        self.mcount = 0
        self.exocount = 0
        self.solved = 0
        self.count = 0

    def handle_starttag(self, tag, attrs):
        #print( "Encountered a start tag:", 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 self.exercises and self.count<len(self.members):
		self.members[self.count].results[self.curexo] = self.solved
                self.members[self.count].note += self.solved
                if self.curexo in niveau1:
                    self.members[self.count].note_niveau1 += self.solved
                if self.curexo in niveau2:
                    self.members[self.count].note_niveau2 += 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 self.exercises) and self.exocount<114:
                    self.exocount += 1
                    self.exercises.append(data)

    def showMembers(self):
        totalexo = len(self.exercises)
        #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 self.members:
            pexo = "{:.2f}".format(m.note/totalexo)
            pniv1 = "{:.2f}".format(m.note_niveau1/niveau1max)
            pniv2 = "{:.2f}".format(m.note_niveau2/niveau2max)
            nf = "{:.2f}".format((m.note_niveau1/niveau1max+m.note_niveau2/niveau2max)*10)
            print(m.nicename.ljust(maxlenname),pexo,pniv1,pniv2,nf.rjust(5),sep=" | ",end=" |\n")
        print(barre)

    def showResults(self,number=None,verbose=False):
        if number is None: number = range(len(self.members))
        if verbose:
            print("Found",len(self.exercises),"exercises")
            for e in self.exercises: print(e)
        print("__"*20)
        for n in number:
            note = 0
            print("Résultat de",self.members[n].nicename,"note :",\
                  self.members[n].note)
            if verbose:
                for exo in self.exercises:
                    note += self.members[n].results[exo]
                    print("\t",exo,":",self.members[n].results[exo])
                print( note )

# 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([0,4,5])