Vylepšení výsledkové listiny
Potřeboval jsem vygenerovat výsledkovku pro krajské kolo kategorie P. Jednak jsem dodělal různé drobnosti do mo.score
a okolí, jednak napsal skript, který pomocí mo.score
vygeneruje TeXovou a webovou verzi výsledkovky.
Merge request reports
Activity
changed milestone to %Brzy
mentioned in issue #145 (closed)
- Resolved by Martin Mareš
Chováme se teď nekonzistentně k účastníkům, kteří nic neodevzdali. Z výsledkovky je odstraníme, ale při výpočtu obtížnosti úloh tam zůstávají.
Vzhledem k tomu, že neodevzdali nic v žádné úloze, tak to neovlivní pořadí úloh podle obtížnosti, ale může to být matoucí, když si někdo spočítá obtížnost podle výsledkovky ručně.
To máš pravdu, to není hezké...
Ale marně si lámu hlavu, jak to vyřešit hezky. Zatím to nejlepší, co mě napadlo, je:
- Zavést další stav účasti "neodevzdal".
- Nechat výsledkovku vypsat warning pro všechny, kdo nemají submit, ale nejsou v tomto stavu.
- Nabídnout tlačítko na převedení do tohoto stavu.
Nevím, jestli bych na to zakládal další stav.
Lepší by mi přišlo v
_load_tasks_and_sols
modifikovat for cyklusfor sol in sols
a to takto:diff --git a/mo/score.py b/mo/score.py index b7f4ed5..c403a24 100644 --- a/mo/score.py +++ b/mo/score.py @@ -160,14 +160,10 @@ class Score: for result in self._results.values(): result._sols[step] = {} - # Spočítání počtu řešitelů - num_participants = db.get_count(user_id_subq) - # Načtení úloh tasks: List[db.Task] = sess.query(db.Task).filter_by(round=round).all() for task in tasks: self._tasks[step][task.task_id] = ScoreTask(task) - self._tasks[step][task.task_id].num_solutions = num_participants # Načtení řešení task_ids = list(self._tasks[step].keys()) @@ -175,12 +171,18 @@ class Score: db.Solution.user_id.in_(user_id_subq), db.Solution.task_id.in_(task_ids), ).all() + active_participants = set() for sol in sols: + active_participants.add(sol.user_id) if sol.user_id in self._results: self._results[sol.user_id]._sols[step][sol.task_id] = sol if sol.points: self._tasks[step][sol.task_id].sum_points += sol.points + # Nastavení počtu řešení + for task in tasks: + self._tasks[step][task.task_id].num_solutions = len(active_participants) + def _mark_winners(self): for result in self._results.values(): total_points = result.get_total_points()
Mně se právě předtím líbilo, že pravidlo "účastníky bez submitů nepočítáme" bylo implementováno na jednom místě. Tahle úprava mě také napadla, ale vůbec se mi nelíbilo, že se tím implementace pravidla rozplizne po daleko větším kusu kódu.
Nestačilo by prostě při vypisování průměrných obtížností explicitně říci, z kolika účastníků se spočítaly? O:-) Tím by se neintuitivní chování vysvětlilo a všichni by mohli být happy ;)
@setnicka Jen bych to vypsal, je to suverénně nejjednodušší řešení. A co s pravidly bude příští rok, nikdo neví. Minimálně bych uvážil oficiálně říci, že o obtížnosti úloh rozhoduje součet bodů, a vyhnout se průměrům (beztak jsem slyšel hned několik výkladů, co se vlastně má průměrovat ;)).
@pracj3am Žádný pádný důvod pro to není, jen je to tak v MO zvykem. Mimo jiné to ušetří důsledné označování těch, kdo se vůbec nedostavili.
Ano, a ještě bláznivější než MO :D Už jsem to říkal Jirkovi. Do týdne bych chtěl provést úpravy v nastavení kola, aby je šlo implementovat.
Řadí se dle
- úspěšný řešitel (bodová hranice + počet úloh s nadpolovičním počtem bodů + odevzdaná praktická úloha)
- počet bodů
- modifikované body
- ročník studia
- los
Modifikované body jsou ∑ b·(max−prum), kde b je bodový zisk z dané úlohy, max je maximum bodů dané úlohy a prum je průměrný bodový zisk z dané úlohy v dané soutěžní oblasti.
Nejdůležítejší je 1. To jednoznačný pořadí podle mě letos není důležitý, když není program Excelence.
Jinak udělejte to klidně globálně, ať tam ti řešitelé, co nic neodevzdali, nejsou. Je to tak okrajový případ, že se to snad ani nikdy nestalo, aby se někdo účastnil a neodevzdal vůbec nic.
Edited by Jan Prachař
marked this merge request as draft from af4131e3
added 48 commits
-
af4131e3...957bee38 - 16 commits from branch
master
- f93a6ee4 - Přidán favicon z MO loga
- fce4dd0f - Omezení kódů úloh na písmena, čísla a -
- 53b9ce5f - DB: Zavedení maximálního počtu bodů pro úlohu (může být NULL)
- 6df209de - Nastavení a zobrazení maximálního počtu bodů pro úlohu
- 06369dc4 - Round edit: Fix MODateTimeField
- 568687c1 - Round: Lze editovat i jméno
- 22e47e75 - DB: Zavedení části kola a přidání master_round_id a master_contest_id
- 30f9677f - DB: Pomocné metody pro skupiny kol/soutěží
- 85963701 - Předělání get_round_rr, get_contest_* a SolutionContext, aby vracely master_round a master_contest
- bd8d30f6 - Dělená kola: vytváření soutěží vždy v hlavním kole
- 7adc0164 - Seznamy účastníků v kole a soutěži počítají s dělenými koly
- 6c876690 - Tabulky submitů (celková i úlohová) upraveny pro dělená kola
- 0d425d10 - Dávkové operace (import, download, upload) upraveny pro dělená kola
- 7c24a7ec - Výsledková listina upravena pro dělená kola
- 46c04ad0 - Postup z minulého kola počítá s dělenými koly
- 57dbb834 - Dělená kola - informace a rychlé prokliky pro organizátory
- c2d250fa - Výpis dělených kol v detailu účastníka
- 28cf7278 - Dělená kola v účastnické části webu
- 2e7c9554 - Při zadávání bodů kontrolujeme maximální počet bodů
- 62cd797e - Merge branch 'jirka/max-points' into 'devel'
- 6b0427b4 - Merge branch 'jirka/delena-kola3' into 'devel'
- 47e8fefe - mo.score: Typování
- 85ca5df9 - mo.score: Nechceme používat floatové dělení
- f11f5795 - mo.db: User má klíč, který třídí jen podle jména bez zjednoznačňování
- 40c8ebad - mo.score: Neúspěšní řešitelé nepotřebují jednoznačné pořadí
- a5088569 - org_score: Typování
- 4776a5fd - org_score: Exportujeme sloupeček se stavem vítěz/úspěšný/ostatní
- d1b34c06 - org_score: U neúspěšných neuvádíme pořadí
- fc812fc1 - mo.score: Dvojitá mezera
- 5fec97b6 - util_format: inflect_with_number()
- 81e624b4 - mo.score: Vynecháváme účastníky bez odevzdaných řešení
- 7c56bbca - Generátor výsledkových listin pro kategorii P
Toggle commit list-
af4131e3...957bee38 - 16 commits from branch
added 12 commits
- 05b79069 - mo.score: Typování
- 9767bbea - mo.score: Nechceme používat floatové dělení
- 7a7b732a - mo.db: User má klíč, který třídí jen podle jména bez zjednoznačňování
- 6ed9572e - mo.score: Neúspěšní řešitelé nepotřebují jednoznačné pořadí
- a2853a34 - org_score: Typování
- b51751c8 - org_score: Exportujeme sloupeček se stavem vítěz/úspěšný/ostatní
- c5747e56 - org_score: U neúspěšných neuvádíme pořadí
- b0505359 - mo.score: Dvojitá mezera
- fd377e99 - util_format: inflect_with_number()
- 9a4830d4 - mo.score: Vynecháváme účastníky bez odevzdaných řešení
- 7441f3d9 - Generátor výsledkových listin pro kategorii P
- 7871f276 - mo.score: Kosmetika
Toggle commit listadded 1 commit
- 976c399b - mo.score: Přehlednější zobrazování obtížnosti úloh
mentioned in commit 7c18ca9d