Spaces:
Running
Running
상금 규칙 개정: 1위 부문 최다 보유자 1명 — 전 부문 제출 조건 폐지
Browse files- app.py +9 -8
- i18n.js +6 -6
- index.html +1 -2
app.py
CHANGED
|
@@ -50,11 +50,11 @@ PRIZE = {
|
|
| 50 |
"amount_usd": 1000,
|
| 51 |
"winners": 1,
|
| 52 |
"closes": "2027-12-31",
|
| 53 |
-
#
|
| 54 |
-
#
|
| 55 |
-
#
|
| 56 |
-
"rule": "
|
| 57 |
-
"require_all_boards":
|
| 58 |
}
|
| 59 |
|
| 60 |
|
|
@@ -393,12 +393,13 @@ def api_leaders():
|
|
| 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 |
standing = []
|
| 397 |
for u, bs in cover.items():
|
| 398 |
standing.append({"user": u, "firsts": tally.get(u, 0),
|
| 399 |
-
"submitted": len(bs), "missing":
|
| 400 |
-
|
| 401 |
-
standing.sort(key=lambda x: (not x["eligible"], -x["firsts"], -x["submitted"]))
|
| 402 |
return {"spec": SPEC, "n": len(rows), "rows": rows,
|
| 403 |
"submissions": submission_count(),
|
| 404 |
"held": sum(1 for r in rows if r["leader"]),
|
|
|
|
| 50 |
"amount_usd": 1000,
|
| 51 |
"winners": 1,
|
| 52 |
"closes": "2027-12-31",
|
| 53 |
+
# **1위 부문을 가장 많이 가진 한 사람.** 전 부문 제출 조건은 두지 않는다
|
| 54 |
+
# (회장님 2026-08-29 개정) - 문턱이 참가를 막으면 겨룰 사람 자체가 없다.
|
| 55 |
+
# 부문마다 지표가 달라 점수를 합산할 수 없으므로 1위 부문의 개수로 센다.
|
| 56 |
+
"rule": "most_first_places",
|
| 57 |
+
"require_all_boards": False,
|
| 58 |
}
|
| 59 |
|
| 60 |
|
|
|
|
| 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 = []
|
| 399 |
for u, bs in cover.items():
|
| 400 |
standing.append({"user": u, "firsts": tally.get(u, 0),
|
| 401 |
+
"submitted": len(bs), "missing": 0, "eligible": True})
|
| 402 |
+
standing.sort(key=lambda x: (-x["firsts"], -x["submitted"], x["user"]))
|
|
|
|
| 403 |
return {"spec": SPEC, "n": len(rows), "rows": rows,
|
| 404 |
"submissions": submission_count(),
|
| 405 |
"held": sum(1 for r in rows if r["leader"]),
|
i18n.js
CHANGED
|
@@ -30,10 +30,10 @@ ko: {
|
|
| 30 |
secBrowse: "분야", secBrowseLead: "분야를 선택하면 소속 부문의 순위표와 제출 창구로 이동합니다.",
|
| 31 |
prizeH: "상금",
|
| 32 |
prizeLead: (amt,close)=>`마감일에 <b>한 분</b>에게 미화 ${amt}달러를 드립니다. 마감 ${close}.`,
|
| 33 |
-
prizeRule: (n)=>`<b>
|
| 34 |
statSubs: "제출",
|
| 35 |
-
prizeElig: "
|
| 36 |
-
prizeMissing: (n)=>
|
| 37 |
prizeHost: "주최측 계정(SeaWolf-AI 등)은 수상 대상이 아닙니다. 눈금 역할로 표에 남되 겨루지 않습니다.",
|
| 38 |
prizeNone: "아직 수상 후보가 없습니다. 부문 하나에서 1위를 하면 이름이 여기 올라갑니다.",
|
| 39 |
prizeStanding: "현재 후보",
|
|
@@ -237,10 +237,10 @@ en: {
|
|
| 237 |
secBrowse: "Disciplines",
|
| 238 |
prizeH: "Prize",
|
| 239 |
prizeLead: (amt,close)=>`At the closing date <b>one entrant</b> receives USD ${amt}. Closes ${close}.`,
|
| 240 |
-
prizeRule: (n)=>`<b>
|
| 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",
|
|
|
|
| 30 |
secBrowse: "분야", secBrowseLead: "분야를 선택하면 소속 부문의 순위표와 제출 창구로 이동합니다.",
|
| 31 |
prizeH: "상금",
|
| 32 |
prizeLead: (amt,close)=>`마감일에 <b>한 분</b>에게 미화 ${amt}달러를 드립니다. 마감 ${close}.`,
|
| 33 |
+
prizeRule: (n)=>`<b>1위 부문을 가장 많이 가진 한 분</b>께 드립니다. 참가는 한 부문이면 되고, 몇 개를 내셨는지는 따지지 않습니다.<br>부문마다 지표가 달라 점수를 합산할 수 없으므로 <b>1위 부문의 개수</b>로 셉니다. 동수이면 먼저 도달한 분이 우선합니다.`,
|
| 34 |
statSubs: "제출",
|
| 35 |
+
prizeElig: "",
|
| 36 |
+
prizeMissing: (n)=>"",
|
| 37 |
prizeHost: "주최측 계정(SeaWolf-AI 등)은 수상 대상이 아닙니다. 눈금 역할로 표에 남되 겨루지 않습니다.",
|
| 38 |
prizeNone: "아직 수상 후보가 없습니다. 부문 하나에서 1위를 하면 이름이 여기 올라갑니다.",
|
| 39 |
prizeStanding: "현재 후보",
|
|
|
|
| 237 |
secBrowse: "Disciplines",
|
| 238 |
prizeH: "Prize",
|
| 239 |
prizeLead: (amt,close)=>`At the closing date <b>one entrant</b> receives USD ${amt}. Closes ${close}.`,
|
| 240 |
+
prizeRule: (n)=>`It goes to <b>the entrant leading the most boards</b>. One board is enough to enter, and how many you submit to is not counted against you.<br>Boards use different metrics, so scores cannot be summed: what counts is <b>the number of boards you lead</b>. Ties go to whoever got there first.`,
|
| 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",
|
index.html
CHANGED
|
@@ -437,8 +437,7 @@ function renderPrize(d){
|
|
| 437 |
<p>${t.prizeLead(p.amount_usd.toLocaleString(), p.closes)}</p>
|
| 438 |
<p>${t.prizeRule(p.n_boards)}</p>
|
| 439 |
<div class="cand"><b>${t.prizeStanding}</b> — ${
|
| 440 |
-
s.length? s.slice(0,6).map(x=>`${esc(x.user)} <span class="dim">(${
|
| 441 |
-
x.eligible? t.prizeElig : t.prizeMissing(x.missing)} · ${t.prizeFirsts(x.firsts)})</span>`).join(" · ")
|
| 442 |
: t.prizeNone}</div>
|
| 443 |
<div class="fine">${t.prizeHost}</div>`;
|
| 444 |
}
|
|
|
|
| 437 |
<p>${t.prizeLead(p.amount_usd.toLocaleString(), p.closes)}</p>
|
| 438 |
<p>${t.prizeRule(p.n_boards)}</p>
|
| 439 |
<div class="cand"><b>${t.prizeStanding}</b> — ${
|
| 440 |
+
s.length? s.slice(0,6).map(x=>`${esc(x.user)} <span class="dim">(${t.prizeFirsts(x.firsts)})</span>`).join(" · ")
|
|
|
|
| 441 |
: t.prizeNone}</div>
|
| 442 |
<div class="fine">${t.prizeHost}</div>`;
|
| 443 |
}
|