SeaWolf-AI commited on
Commit
d781026
·
verified ·
1 Parent(s): 4149f1b

상금 집계에서 주최측 제출 제외 — 부문 선두는 참가자 중 최상위

Browse files
Files changed (2) hide show
  1. app.py +14 -6
  2. i18n.js +2 -2
app.py CHANGED
@@ -345,14 +345,23 @@ def api_leaders():
345
  """
346
  def build():
347
  out = []
348
- cover = {} # 누가 어느 부문에 제출했나. 자격 판정에 쓴다.
 
349
  for name, b in boards().items():
350
  rolled = ledger_read("leaderboard/%s.json" % name.lower(), {}) or {}
351
  ent = (rolled.get("entries") or [])
 
 
 
 
 
352
  for e in ent:
353
  u = e.get("user")
354
  if u and not is_host(u):
355
  cover.setdefault(u, set()).add(name)
 
 
 
356
  top = ent[0] if ent else None
357
  nf = (b.get("noise_floor") or {}).get("sd_single")
358
  base = b.get("baselines") or {}
@@ -379,7 +388,8 @@ def api_leaders():
379
  "verified": bool(top.get("verified")), "leak": top.get("leak")}
380
  out.append(row)
381
  out.sort(key=lambda r: (r["leader"] is None, -(r["n_test"] or 0)))
382
- return {"rows": out, "cover": {u: sorted(s) for u, s in cover.items()}}
 
383
 
384
  got = cached("leaders", 60, build)
385
  rows, cover = got["rows"], got["cover"]
@@ -389,10 +399,8 @@ def api_leaders():
389
  # **자격 = 전 부문 제출.** 못 채운 사람도 표에는 올린다 - 몇 개 남았는지 보여야
390
  # 채우러 온다. 감추면 왜 자기가 후보가 아닌지 알 수 없다.
391
  tally = {}
392
- for r in rows:
393
- u = (r.get("leader") or {}).get("user")
394
- if u and not is_host(u):
395
- tally[u] = tally.get(u, 0) + 1
396
  # 후보 목록. 1위를 가진 사람이 먼저 오고, 그 다음 참가 부문 수 순이다.
397
  # 1위가 없어도 목록에 남긴다 - 참가한 사람이 보여야 판이 살아 있는 것으로 읽힌다.
398
  standing = []
 
345
  """
346
  def build():
347
  out = []
348
+ cover = {} # 누가 어느 부문에 제출했나
349
+ prize_lead = {} # 부문별 **참가자 중** 선두. 상금은 이것으로 센다.
350
  for name, b in boards().items():
351
  rolled = ledger_read("leaderboard/%s.json" % name.lower(), {}) or {}
352
  ent = (rolled.get("entries") or [])
353
+ # 상금 집계는 **주최측 제출을 아예 없는 것으로 보고** 계산한다.
354
+ # 주최측을 수상 대상에서만 빼는 것으로는 부족했다 - 기준 제출이 46부문
355
+ # 1위를 전부 점유하자 외부 참가자의 1위가 0이 되어, 상금을 받을 수 있는
356
+ # 사람이 구조적으로 없어졌다. 표시상 1위는 그대로 두고(넘어야 할 눈금이
357
+ # 보여야 한다), 상금에서는 참가자 중 최상위를 그 부문의 선두로 센다.
358
  for e in ent:
359
  u = e.get("user")
360
  if u and not is_host(u):
361
  cover.setdefault(u, set()).add(name)
362
+ lead_p = next((e for e in ent if e.get("user") and not is_host(e.get("user"))), None)
363
+ if lead_p:
364
+ prize_lead[name] = lead_p.get("user")
365
  top = ent[0] if ent else None
366
  nf = (b.get("noise_floor") or {}).get("sd_single")
367
  base = b.get("baselines") or {}
 
388
  "verified": bool(top.get("verified")), "leak": top.get("leak")}
389
  out.append(row)
390
  out.sort(key=lambda r: (r["leader"] is None, -(r["n_test"] or 0)))
391
+ return {"rows": out, "cover": {u: sorted(s) for u, s in cover.items()},
392
+ "prize_lead": prize_lead}
393
 
394
  got = cached("leaders", 60, build)
395
  rows, cover = got["rows"], got["cover"]
 
399
  # **자격 = 전 부문 제출.** 못 채운 사람도 표에는 올린다 - 몇 개 남았는지 보여야
400
  # 채우러 온다. 감추면 왜 자기가 후보가 아닌지 알 수 없다.
401
  tally = {}
402
+ for u in (got.get("prize_lead") or {}).values():
403
+ tally[u] = tally.get(u, 0) + 1
 
 
404
  # 후보 목록. 1위를 가진 사람이 먼저 오고, 그 다음 참가 부문 수 순이다.
405
  # 1위가 없어도 목록에 남긴다 - 참가한 사람이 보여야 판이 살아 있는 것으로 읽힌다.
406
  standing = []
i18n.js CHANGED
@@ -34,7 +34,7 @@ ko: {
34
  statSubs: "제출",
35
  prizeElig: "",
36
  prizeMissing: (n)=>"",
37
- prizeHost: "주최측 계정(SeaWolf-AI 등)은 수상 대상이 아닙니다. 눈금 역할로 표에 남되 겨루지 않습니다.",
38
  prizeNone: "아직 수상 후보가 없습니다. 부문 하나에서 1위를 하면 이름이 여기 올라갑니다.",
39
  prizeStanding: "현재 후보",
40
  prizeFirsts: (n)=>`1위 ${n}개 부문`,
@@ -241,7 +241,7 @@ en: {
241
  statSubs: "submissions",
242
  prizeElig: "",
243
  prizeMissing: (n)=>"",
244
- prizeHost: "Host accounts (SeaWolf-AI and others) are not eligible. They stay on the tables as a scale to read against, but they do not compete.",
245
  prizeNone: "No contenders yet. Take first place on any board and your name appears here.",
246
  prizeStanding: "Current contenders",
247
  prizeFirsts: (n)=>`${n} board${n===1?"":"s"} led`,
 
34
  statSubs: "제출",
35
  prizeElig: "",
36
  prizeMissing: (n)=>"",
37
+ prizeHost: "🔸 <b>주최측 제출(SeaWolf-AI 등)은 상금 집계에서 제외됩니다.</b> 표에는 넘어야 할 기준선으로 남지만, 상금 순위에서는 없는 것으로 봅니다 — 어느 부문의 상금 선두인지는 <b>참가자 중 최상위</b>로 정합니다. 주최측이 표시상 1위여도 그 부문의 상금 선두는 그 다음 참가자입니다.",
38
  prizeNone: "아직 수상 후보가 없습니다. 부문 하나에서 1위를 하면 이름이 여기 올라갑니다.",
39
  prizeStanding: "현재 후보",
40
  prizeFirsts: (n)=>`1위 ${n}개 부문`,
 
241
  statSubs: "submissions",
242
  prizeElig: "",
243
  prizeMissing: (n)=>"",
244
+ prizeHost: "🔸 <b>Host submissions (SeaWolf-AI and others) are excluded from the prize count.</b> They stay on the tables as the line to beat, but for the prize they are treated as absent — a board is led, for prize purposes, by <b>the top entrant</b>. Where a host entry shows first, the prize lead on that board is the next entrant down.",
245
  prizeNone: "No contenders yet. Take first place on any board and your name appears here.",
246
  prizeStanding: "Current contenders",
247
  prizeFirsts: (n)=>`${n} board${n===1?"":"s"} led`,