Skip to content
Snippets Groups Projects

Vylepšení výsledkové listiny

Merged Martin Mareš requested to merge mj/vysledky-p into devel
1 unresolved thread

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.

Edited by Martin Mareš

Merge request reports

Loading
Loading

Activity

Filter activity
  • Approvals
  • Assignees & reviewers
  • Comments (from bots)
  • Comments (from users)
  • Commits & branches
  • Edits
  • Labels
  • Lock status
  • Mentions
  • Merge request status
  • Tracking
    • 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 cyklus for 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 ;)

    • Osobně mám lehkou preferenci to počítat přesně, ale komplikovat dalším stavem účastníka se mi to nechce.

      Ale nemám na to nikterak silný názor, takže jestli ti to přijde lepší jen vypsat, klidně to udělejme tak.

    • Proč nemůžou bejt ve výsledkovce ti, co nic neodevzdali? Podle mě tam patří. I když teda v FO se těm, co nic neodevzdají, většinou píše 0 za úlohu.

    • @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.

    • To vypadá jako další věc, která by se mohla řídit buď módem výsledkovky (v MO pravidlech neuvádět lidi bez odevzdání, v FO ano) nebo explicitním přepínačem v nastavení kola.

    • Jsem pro mód výsledkovky.

      Honzo, jaká pravidla pro výsledkovky vlastně má FO? Také nějaký bláznivý algoritmus na zjednoznačnění pořadí?

    • 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

      1. úspěšný řešitel (bodová hranice + počet úloh s nadpolovičním počtem bodů + odevzdaná praktická úloha)
      2. počet bodů
      3. modifikované body
      4. ročník studia
      5. 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ř
    • Please register or sign in to reply
  • Martin Mareš added 1 commit

    added 1 commit

    • af4131e3 - org_score: fixup! typování

    Compare with previous version

  • Martin Mareš marked this merge request as draft from af4131e3

    marked this merge request as draft from af4131e3

  • Martin Mareš resolved all threads

    resolved all threads

  • Martin Mareš added 48 commits

    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

    Compare with previous version

  • Martin Mareš added 12 commits

    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

    Compare with previous version

  • Martin Mareš added 1 commit

    added 1 commit

    • 976c399b - mo.score: Přehlednější zobrazování obtížnosti úloh

    Compare with previous version

  • Martin Mareš marked this merge request as ready

    marked this merge request as ready

  • Martin Mareš changed target branch from master to devel

    changed target branch from master to devel

  • Martin Mareš mentioned in commit 7c18ca9d

    mentioned in commit 7c18ca9d

  • merged

  • Please register or sign in to reply
    Loading