Skip to content

Commit 7a44d91

Browse files
authored
Switch to full name in scoreboard (#744)
1 parent bec16d3 commit 7a44d91

7 files changed

Lines changed: 26 additions & 70 deletions

File tree

docs/user_guide/submit_work.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ Tips for tests
113113

114114
.. code-block:: json
115115
116-
{ "student": { "first_name": "Имя", "last_name": "Фамилия", "middle_name": "Отчество", "group_number": "Группа", "task_number": "1" } }
116+
{ "student": { "full_name": "Фамилия Имя Отчество", "group_number": "Группа", "task_number": "1" } }
117117
118118
Build and local run
119119
-------------------

scoreboard/assign_variant.py

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
66
Algorithm:
77
1) Normalize strings (NFKC, trim, lowercase, map 'ё'->'е', collapse spaces).
8-
2) Build a key: "surname|name|patronymic|group|repo".
8+
2) Build a key: "full_name|group|repo".
99
3) SHA-256(key) -> big integer -> modulo `num_variants`.
1010
1111
Properties:
@@ -17,9 +17,7 @@
1717
Usage:
1818
from assign_variant import assign_variant
1919
v = assign_variant(
20-
surname="Petrov",
21-
name="Pyotr",
22-
patronymic="Petrovich",
20+
full_name="Petrov Pyotr Petrovich",
2321
group="MEN-201",
2422
repo="learning-process/parallel_programming_course",
2523
num_variants=31, # produces values in 0..30
@@ -62,23 +60,19 @@ def _hash_int(key: str) -> int:
6260

6361

6462
def assign_variant(
65-
surname: str,
66-
name: str,
63+
full_name: str,
6764
group: str,
6865
repo: str,
69-
patronymic: Optional[str] = "",
7066
num_variants: int = 31,
7167
) -> int:
7268
"""
7369
Deterministically returns a variant index in [0 .. num_variants-1]
74-
based on (surname, name, patronymic, group) and the repository name (repo)
70+
based on (full_name, group) and the repository name (repo)
7571
as the sole salt.
7672
77-
:param surname: Last name
78-
:param name: First name
73+
:param full_name: Full name (e.g., "Petrov Pyotr Petrovich")
7974
:param group: Group identifier (e.g., "MEN-201")
8075
:param repo: Repository name used as salt (e.g., "org/repo" or just "repo")
81-
:param patronymic: Middle name / patronymic (optional)
8276
:param num_variants: Total number of variants (> 0). Output range: 0..num_variants-1
8377
:return: int — the variant index
8478
"""
@@ -89,9 +83,7 @@ def assign_variant(
8983

9084
key = "|".join(
9185
(
92-
normalize(surname),
93-
normalize(name),
94-
normalize(patronymic),
86+
normalize(full_name),
9587
normalize(group),
9688
normalize(repo),
9789
)
@@ -107,28 +99,22 @@ def demo():
10799
print("Demo: deterministic assignment\n")
108100

109101
v1 = assign_variant(
110-
surname="Петров",
111-
name="Пётр",
112-
patronymic="Петрович",
102+
full_name="Петров Пётр Петрович",
113103
group="МЕН-201",
114104
repo="learning-process/parallel_programming_course",
115105
num_variants=31,
116106
)
117107
# Different casing/spacing/ё→е should not change the result:
118108
v2 = assign_variant(
119-
surname="ПЕТРОВ",
120-
name="петр ",
121-
patronymic="пЕТРОВИЧ",
109+
full_name="ПЕТРОВ петр пЕТРОВИЧ",
122110
group=" мен-201 ",
123111
repo="learning-process/parallel_programming_course",
124112
num_variants=31,
125113
)
126114
assert v1 == v2, "Normalization should make results identical"
127115

128116
v_other_repo = assign_variant(
129-
surname="Petrov",
130-
name="Pyotr",
131-
patronymic="Petrovich",
117+
full_name="Petrov Pyotr Petrovich",
132118
group="MEN-201",
133119
repo="learning-process/ppc_2025_fall", # different salt → likely different value
134120
num_variants=31,

scoreboard/main.py

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,9 @@
3636
except Exception:
3737

3838
def assign_variant(
39-
surname: str,
40-
name: str,
39+
full_name: str,
4140
group: str,
4241
repo: str,
43-
patronymic: str = "",
4442
num_variants: int = 1,
4543
) -> int:
4644
return 0
@@ -549,10 +547,7 @@ def _load_student_info_label(dir_name: str):
549547
with open(info_path, "r") as f:
550548
data = json.load(f)
551549
s = data.get("student", {})
552-
last = s.get("last_name", "")
553-
first = s.get("first_name", "")
554-
middle = s.get("middle_name", "")
555-
parts = [p for p in [last, first, middle] if p]
550+
parts = [p for p in str(s.get("full_name", "")).strip().split() if p]
556551
label = "<br/>".join(parts)
557552
return label if label else None
558553
except Exception:
@@ -568,12 +563,7 @@ def _load_student_fields(dir_name: str):
568563
with open(info_path, "r") as f:
569564
data = json.load(f)
570565
s = data.get("student", {})
571-
return (
572-
str(s.get("last_name", "")),
573-
str(s.get("first_name", "")),
574-
str(s.get("middle_name", "")),
575-
str(s.get("group_number", "")),
576-
)
566+
return str(s.get("full_name", "")).strip(), str(s.get("group_number", ""))
577567
except Exception:
578568
return None
579569

@@ -644,14 +634,12 @@ def _load_student_fields(dir_name: str):
644634
threads_vmax = int((cfg.get("threads", {}) or {}).get("variants_max", 1))
645635
fields = _load_student_fields(dir)
646636
if fields:
647-
last, first, middle, group = fields
637+
full_name, group = fields
648638
try:
649639
v_idx = assign_variant(
650-
last,
651-
first,
652-
group,
653-
REPO_SALT,
654-
patronymic=middle,
640+
full_name=full_name,
641+
group=group,
642+
repo=REPO_SALT,
655643
num_variants=threads_vmax,
656644
)
657645
variant = str(v_idx + 1)
@@ -985,9 +973,7 @@ def _load_student_info(dir_name: str):
985973
def _identity_key(student: dict) -> str:
986974
return "|".join(
987975
[
988-
str(student.get("first_name", "")),
989-
str(student.get("last_name", "")),
990-
str(student.get("middle_name", "")),
976+
str(student.get("full_name", "")).strip(),
991977
str(student.get("group_number", "")),
992978
]
993979
)
@@ -1051,9 +1037,7 @@ def _build_cell(dir_name: str, ttype: str, perf_map: dict[str, dict]):
10511037

10521038
def _sort_identity(student: dict):
10531039
return (
1054-
str(student.get("last_name", "")),
1055-
str(student.get("first_name", "")),
1056-
str(student.get("middle_name", "")),
1040+
str(student.get("full_name", "")).strip(),
10571041
str(student.get("group_number", "")),
10581042
)
10591043

@@ -1182,9 +1166,7 @@ def _build_process_rows(processes_dirs: list[str]):
11821166
proc_r_values.append(0)
11831167

11841168
name_parts = [
1185-
str(student.get("last_name", "")),
1186-
str(student.get("first_name", "")),
1187-
str(student.get("middle_name", "")),
1169+
p for p in str(student.get("full_name", "")).strip().split() if p
11881170
]
11891171
name_html = "<br/>".join([p for p in name_parts if p]) or "processes"
11901172

@@ -1193,9 +1175,7 @@ def _build_process_rows(processes_dirs: list[str]):
11931175
vmax = _find_process_variants_max(cfg, n)
11941176
try:
11951177
v_idx = assign_variant(
1196-
surname=str(student.get("last_name", "")),
1197-
name=str(student.get("first_name", "")),
1198-
patronymic=str(student.get("middle_name", "")),
1178+
full_name=str(student.get("full_name", "")).strip(),
11991179
group=str(student.get("group_number", "")),
12001180
repo=f"{REPO_SALT}/processes/task-{n}",
12011181
num_variants=vmax,
@@ -1422,9 +1402,7 @@ def _load_student_info_group(dir_name: str):
14221402
def _id_key(stud: dict) -> str:
14231403
return "|".join(
14241404
[
1425-
str(stud.get("first_name", "")),
1426-
str(stud.get("last_name", "")),
1427-
str(stud.get("middle_name", "")),
1405+
str(stud.get("full_name", "")).strip(),
14281406
str(stud.get("group_number", "")),
14291407
]
14301408
)

tasks/example_processes/info.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
{
22
"student": {
3-
"first_name": "first_name_p",
3+
"full_name": "full_name_p",
44
"group_number": "2222222_p",
5-
"last_name": "last_name_p",
6-
"middle_name": "middle_name_p",
75
"task_number": "1"
86
}
97
}
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
{
22
"student": {
3-
"first_name": "first_name_p",
3+
"full_name": "full_name_p",
44
"group_number": "2222222_p",
5-
"last_name": "last_name_p",
6-
"middle_name": "middle_name_p",
75
"task_number": "2"
86
}
97
}
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
{
22
"student": {
3-
"first_name": "first_name_p",
3+
"full_name": "full_name_p",
44
"group_number": "2222222_p",
5-
"last_name": "last_name_p",
6-
"middle_name": "middle_name_p",
75
"task_number": "3"
86
}
97
}

tasks/example_threads/info.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
{
22
"student": {
3-
"first_name": "first_name_t",
3+
"full_name": "full_name_t",
44
"group_number": "2222222_t",
5-
"last_name": "last_name_t",
6-
"middle_name": "middle_name_t",
75
"task_number": "1"
86
}
97
}

0 commit comments

Comments
 (0)