Informations sur la validation France-IOI: Difference between revisions
Jump to navigation
Jump to search
Wiki-cours (talk | contribs) |
Wiki-cours (talk | contribs) |
||
Line 14: | Line 14: | ||
<source lang=python> | <source lang=python> | ||
========================================================== | ============================================================ | ||
NOM Prénom | 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 | | |||
LEFEBVRE corentin | 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 | | |||
ZHOU YUANZHE | 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 | | |||
============================================================ | |||
</source> | </source> | ||
Elles sont générées avec le script suivant: | Elles sont générées avec le script suivant: | ||
<source lang=python> | <source lang=python> | ||
""" | """ | ||
Un script qui analyse les résultats d'une classe sur http://www.france-ioi.org | 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. | et qui produit un tableau de la validation des élèves. | ||
écrit | écrit par Guillaume Roux (Université Paris Sud) | ||
merci de me rapporter les bugs. | 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 | 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): | class Member(object): | ||
def __init__(self,name,num): | def __init__(self,name,num): | ||
self.name = name | |||
tmp = name.split() | |||
self.nicename = " ".join(tmp[:-2]).upper()+" "+tmp[-2] | self.nicename = " ".join(tmp[:-2]).upper()+" "+tmp[-2] | ||
self.number = num | self.number = num | ||
self.results = dict() | 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): | class Parser(HTMLParser): | ||
def __init__(self): | def __init__(self): | ||
HTMLParser.__init__(self) | HTMLParser.__init__(self) | ||
Line 97: | Line 115: | ||
self.exotype = False | self.exotype = False | ||
self.members = [] | self.members = [] | ||
self.curexo = "" | self.curexo = "" | ||
self.mcount = 0 | self.mcount = 0 | ||
Line 105: | Line 122: | ||
def handle_starttag(self, tag, attrs): | def handle_starttag(self, tag, attrs): | ||
self.inlycee = self.exotype = False | self.inlycee = self.exotype = False | ||
for attr in attrs[:1]: | for attr in attrs[:1]: | ||
Line 122: | Line 138: | ||
self.members.append(Member(data,self.mcount)) | self.members.append(Member(data,self.mcount)) | ||
self.mcount += 1 | self.mcount += 1 | ||
if self.curexo in | if self.curexo in exercises and self.count<len(self.members): | ||
self.members[self.count].results[self.curexo] = self.solved | |||
self.count += 1 | self.count += 1 | ||
if self.exotype and len(data)>=3: | if self.exotype and len(data)>=3: | ||
if "«" in data: data = data[:24] | if "«" in data: data = data[:24] | ||
if not data in jumped: | if not data in jumped: | ||
self.curexo = data | |||
self.count = 0 | self.count = 0 | ||
if (not data in | if (not data in exercises) and self.exocount<114: | ||
self.exocount += 1 | self.exocount += 1 | ||
exercises.append(data) | |||
def showMembers(self): | def showMembers(self): | ||
# print("Found",len(self.members),"members") | |||
maxlenname = max([len(m.nicename) for m in self.members]) | maxlenname = max([len(m.nicename) for m in self.members]) | ||
barre = "="*(maxlenname+31) | barre = "="*(maxlenname+31) | ||
print(barre) | print(barre) | ||
print("NOM Prénom".ljust(maxlenname),"%exo","Niv1","Niv2","Note".rjust(5),sep=" | ",end=" |\n") | |||
print(barre) | print(barre) | ||
for m in self.members: | for m in sorted(self.members,key=lambda x: x.nicename): | ||
pexo = "{:.2f}".format(m.note | pexo = "{:.2f}".format(m.note(exercises)) | ||
pniv1 = "{:.2f}".format(m. | pniv1 = "{:.2f}".format(m.note(niveau1)) | ||
pniv2 = "{:.2f}".format(m. | pniv2 = "{:.2f}".format(m.note(niveau2)) | ||
nf = "{:.2f}".format((m. | 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(m.nicename.ljust(maxlenname),pexo,pniv1,pniv2,nf.rjust(5),sep=" | ",end=" |\n") | ||
print(barre) | print(barre) | ||
def showResults(self,number=None | 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)) | if number is None: number = range(len(self.members)) | ||
print("__"*20) | print("__"*20) | ||
for n in number: | for n in number: | ||
print("Résultat de",self.members[n].nicename,"note :",\ | print("Résultat de",self.members[n].nicename,"note :",\ | ||
self.members[n].note) | self.members[n].note(exercises)) | ||
self.members[n].showResults() | |||
# mettez ici le chemin vers votre fichier à analyser | # mettez ici le chemin vers votre fichier à analyser | ||
fichier = "France-IOI.html" | fichier = "France-IOI.html" | ||
parser = Parser() | parser = Parser() | ||
Line 178: | Line 184: | ||
source.close() | source.close() | ||
parser.showMembers() | parser.showMembers() | ||
#parser.showResults([ | #parser.showResults([8]) | ||
</source> | </source> |
Revision as of 16:23, 13 October 2016
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 |
============================================================
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])