MOJ — Placares multi-modo — MOJ docs

MOJ — Placares multi-modo

Princípio: adicionar um modo = 1 gerador (server/score/updatescore-<modo>.sh) + 1 renderizador (web/contest/score/score-<modo>.js), ligados pela mesma string de modo.

Fluxo

  1. O conf do contest define CONTEST_TYPE (icpc | obi | treino | heuristic | outro; lista-publica/lista-privadatreino; ausente → icpc).
  2. A fonte de dados dos geradores é users/<login>/metrics.json (mantido incremental pelo daemon a cada veredicto via metrics_recompute): cada metrics carrega, por problema, counted (tentativas até o 1º AC — quais verdicts contam obedece o PENALTY_VERDICTS do conf; ver modo icpc abaixo), first_ac_epoch, pending, best_score (NNp), heur (Score/Score Ajustado) e a visão frozen (pré-FREEZE_TIME). Os geradores leem tudo numa passada só (sc_cells em score-common.sh: find users -name metrics.json | xargs jq) — rebuild O(usuários), sem varrer history.
  3. server/score/build.sh <contest> recomputa os metrics em massa se o conf mudou desde o último build (var/.metrics-stamp — cobre edição de FREEZE_TIME e o 1º build de um contest importado), despacha para updatescore-<modo>.sh e grava contests/<contest>/var/placar.txt (atômico; var/placar-full.txt = sem freeze, p/ privilegiados). É chamado pelo daemon após cada veredicto.
  4. A rota GET /api/v1/contest/score?contest=<c> serve esse TXT cru — com cache preguiçoso: se o placar.txt está velho (var/.score-dirty — tocado a cada escrita de history — ou conf mais novos) ou nunca foi gerado, a rota chama build.sh na hora (sob flock, sem estampida) e então serve. Assim contests importados deixam de ficar com placar vazio.
  5. O front (web/contest/score/) lê a 1ª linha = modo e despacha para o renderizador.

Formato do TXT

icpc                                                  ← linha 1: o modo (bare)
desc:asc:flag:username:univ short:team name:univ full:A:B:C:D:Total:Penalty:LastAC   ← cabeçalho
BR:br-df-alfa:UNB:ALFA:Universidade de Brasília:1/30:2/40:1/55::3/68::4:213:68

Células por modo

Modo Célula de problema Ordenação Cor
icpc vazio=não tentou · tentativas/minuto=resolveu · tentativas/minuto*=first to solve (★ + contorno; menor first_ac_epoch do problema entre os times do placar, na mesma visão frozen/full) · tentativas/-=tentou acertos↓ · penalidade↑ (penalidade=(tent−1)·PENALTY_MINUTES+minuto; default 20) · minuto do ÚLTIMO problema resolvido↑ (LastAC) pinta com a cor do balão

Penalidade configurável (modo icpc) — duas vars de conf, editáveis pelo /contest/admin/settings (mudar em prova recomputa o placar no próximo GET):

Como adicionar um modo novo (ex.: xyz)

  1. server/score/updatescore-xyz.sh <contest> — emite o TXT (1ª linha xyz + cabeçalho + linhas ordenadas). Reaproveite server/score/score-common.sh.
  2. Registre no dispatcher server/score/build.sh (case xyz) updatescore-xyz.sh ;;).
  3. web/contest/score/score-xyz.js — recebe o TXT já parseado e renderiza.
  4. Registre no dispatcher do front web/contest/score/score.js.

Geradores existentes (testados contra dados reais, batem com os placares legados): updatescore-icpc.sh, updatescore-obi.sh, updatescore-treino.sh, updatescore-heuristic.sh, updatescore-outro.sh.

Recursos do placar (web/contest/score/)