Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 43 additions & 18 deletions oioioi/contests/templates/contests/problems_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
animation-iteration-count: 6;
background-color: rgba(255, 255, 0 , .4);
}

@keyframes target-glow {
0%, 100% {
background-color: rgba(255, 255, 0 , .4);
Expand All @@ -24,6 +24,12 @@
box-shadow: 0px 0px 4px 6px rgba(255, 255, 0, .8);
}
}

td.problem-limits-column {
white-space: nowrap;
overflow-wrap: break-word;
text-align: left;
}
</style>
{% endblock %}

Expand Down Expand Up @@ -60,9 +66,15 @@ <h1>{% trans "Problems" %}</h1>
<th></th>
<th class="problem-name-column">{% trans "Name" %}</th>
{% if show_problems_limits %}
<th>
{% trans "Limits" %}
</th>
{% if multiple_limits %}
<th>
{% trans "Limits" %}
</th>
{% else %}
<th colspan="2">
{% trans "Limits" %}
</th>
{% endif %}
{% endif %}
{% if show_submissions_limit %}
<th class="text-right">
Expand Down Expand Up @@ -102,21 +114,34 @@ <h1>{% trans "Problems" %}</h1>
{% endif %}
</td>
{% if show_problems_limits %}
<td class="text-right">
{% if problem_limits %}
<table>
{% for row in problem_limits %}
<tr class="problem-limits-row">
{% for entry in row %}
<td>
{{ entry }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
{% if multiple_limits %}
<td class="text-right">
{% if problem_limits %}
<table>
{% for row in problem_limits %}
<tr class="problem-limits-row">
{% for entry in row %}
<td>
{{ entry }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
{% endif %}
</td>
{% else %}
{% if problem_limits and problem_limits.0 %}
<td class="problem-limits-column">
{{ problem_limits.0.1 }}
</td>
<td class="problem-limits-column">
{{ problem_limits.0.2 }}
</td>
{% else %}
<td colspan="2"> </td>
{% endif %}
</td>
{% endif %}
{% endif %}
{% if show_submissions_limit %}
<td class="text-right">
Expand Down
54 changes: 27 additions & 27 deletions oioioi/contests/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -4904,30 +4904,30 @@ def __init__(self, timestamp, contest):
def test_stringify_limits(self):
raw_limits = {
"1": {
"default": (1000, 2000, 1000, 2000),
"cpp": (1000, 2000, 1000, 2000),
"py": (1000, 2000, 1000, 2000),
"default": (1000, 2000, 1024, 2048),
"cpp": (1000, 2000, 1024, 2048),
"py": (1000, 2000, 1024, 2048),
},
"2": {"default": (2000, 4000, 2000, 4000), "cpp": (1000, 3000, 1000, 4000), "py": (3000, 5000, 2000, 5000)},
"2": {"default": (2000, 4000, 2048, 4096), "cpp": (1000, 3000, 1024, 4096), "py": (3000, 5000, 2048, 5120)},
"3": {
"default": (1000, 2000, 1000, 2000),
"cpp": (500, 2000, 500, 1000),
"py": (1000, 3000, 1000, 3000),
"default": (1000, 2000, 1024, 2048),
"cpp": (500, 2000, 512, 1024),
"py": (1000, 3000, 1024, 3072),
},
"4": {
"default": (1000, 2000, 1000, 2000),
"cpp": (500, 2000, 2000, 3000),
"py": (1000, 2000, 1000, 2000),
"default": (1000, 2000, 1024, 2048),
"cpp": (500, 2000, 2048, 3072),
"py": (1000, 2000, 1024, 2048),
},
"5": {
"default": (1000, 2000, 1000, 2000),
"cpp": (1000, 2000, 1000, 2000),
"py": (3000, 4000, 1000, 3000),
"default": (1000, 2000, 1024, 2048),
"cpp": (1000, 2000, 1024, 2048),
"py": (3000, 4000, 1024, 3072),
},
"6": {
"default": (1000, 2000, 500, 2000),
"cpp": (100, 500, 100, 200),
"py": (1000, 2000, 500, 2000),
"default": (1000, 2000, 512, 2048),
"cpp": (100, 500, 128, 256),
"py": (1000, 2000, 512, 2048),
},
}

Expand All @@ -4937,49 +4937,49 @@ def test_stringify_limits(self):
self.assertEqual(len(stringified["1"]), 1)
self.assertEqual(stringified["1"][0][0], "")
self.assertEqual(stringified["1"][0][1], "1-2 s")
self.assertEqual(stringified["1"][0][2], "1-2 MB")
self.assertEqual(stringified["1"][0][2], "1-2 MiB")

# Test two simple overrides
self.assertEqual(len(stringified["2"]), 2)
self.assertEqual(stringified["2"][0][0], "C++:")
self.assertEqual(stringified["2"][0][1], "1-3 s")
self.assertEqual(stringified["2"][0][2], "1-4 MB")
self.assertEqual(stringified["2"][0][2], "1-4 MiB")
self.assertEqual(stringified["2"][1][0], "Python:")
self.assertEqual(stringified["2"][1][1], "3-5 s")
self.assertEqual(stringified["2"][1][2], "2-5 MB")
self.assertEqual(stringified["2"][1][2], "2-5 MiB")

# Test two overrides, one with small memory limit
self.assertEqual(len(stringified["3"]), 2)
self.assertEqual(stringified["3"][0][0], "C++:")
self.assertEqual(stringified["3"][0][1], "0.5-2 s")
self.assertEqual(stringified["3"][0][2], "500-1000 KiB")
self.assertEqual(stringified["3"][0][2], "512-1024 KiB")
self.assertEqual(stringified["3"][1][0], "Python:")
self.assertEqual(stringified["3"][1][1], "1-3 s")
self.assertEqual(stringified["3"][1][2], "1-3 MB")
self.assertEqual(stringified["3"][1][2], "1-3 MiB")

# Test one override, cpp
self.assertEqual(len(stringified["4"]), 2)
self.assertEqual(stringified["4"][0][0], "Default:")
self.assertEqual(stringified["4"][0][1], "1-2 s")
self.assertEqual(stringified["4"][0][2], "1-2 MB")
self.assertEqual(stringified["4"][0][2], "1-2 MiB")
self.assertEqual(stringified["4"][1][0], "C++:")
self.assertEqual(stringified["4"][1][1], "0.5-2 s")
self.assertEqual(stringified["4"][1][2], "2-3 MB")
self.assertEqual(stringified["4"][1][2], "2-3 MiB")

# Test one override, python
self.assertEqual(len(stringified["5"]), 2)
self.assertEqual(stringified["5"][0][0], "Default:")
self.assertEqual(stringified["5"][0][1], "1-2 s")
self.assertEqual(stringified["5"][0][2], "1-2 MB")
self.assertEqual(stringified["5"][0][2], "1-2 MiB")
self.assertEqual(stringified["5"][1][0], "Python:")
self.assertEqual(stringified["5"][1][1], "3-4 s")
self.assertEqual(stringified["5"][1][2], "1-3 MB")
self.assertEqual(stringified["5"][1][2], "1-3 MiB")

# Test small memory limits
self.assertEqual(len(stringified["6"]), 2)
self.assertEqual(stringified["6"][0][0], "Default:")
self.assertEqual(stringified["6"][0][1], "1-2 s")
self.assertEqual(stringified["6"][0][2], "500-2000 KiB")
self.assertEqual(stringified["6"][0][2], "512-2048 KiB")
self.assertEqual(stringified["6"][1][0], "C++:")
self.assertEqual(stringified["6"][1][1], "0.1-0.5 s")
self.assertEqual(stringified["6"][1][2], "100-200 KiB")
self.assertEqual(stringified["6"][1][2], "128-256 KiB")
28 changes: 19 additions & 9 deletions oioioi/contests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -819,23 +819,33 @@ def stringify_problems_limits(raw_limits):
- For mixed limits (one language differs): (('Default:', time_limit, memory_limit), language_limits)
"""

def KiB_to_MB(KiBs):
return (KiBs * 1024) // 1000000
def KiB_to_MiB(KiBs):
return (KiBs) // 1024

def ms_to_seconds(ms: int) -> str:
seconds: int = ms // 1000
ms %= 1000
if ms == 0:
return str(seconds)
return f"{seconds}.{str(ms).rjust(3, '0').rstrip('0')}"

def format_limits(pi_limits):
time_lower = f"{pi_limits[0] / 1000:.1g}"
time_higher = f"{pi_limits[1] / 1000:.1g}"
lower_ms = pi_limits[0]
higher_ms = pi_limits[1]

time_lower = ms_to_seconds(lower_ms)
time_higher = ms_to_seconds(higher_ms)

time_limit = f"{time_lower} s" if time_lower == time_higher else f"{time_lower}-{time_higher} s"
time_limit = f"{time_lower} s" if lower_ms == higher_ms else f"{time_lower}-{time_higher} s"

if pi_limits[2] < 1000000 / 1024: # lower memory limit is smaller than 1MB, display KiB
if pi_limits[2] < 1024: # lower memory limit is smaller than 1MiB, display KiB
unit = "KiB"
memory_lower = pi_limits[2]
memory_higher = pi_limits[3]
else:
unit = "MB"
memory_lower = KiB_to_MB(pi_limits[2])
memory_higher = KiB_to_MB(pi_limits[3])
unit = "MiB"
memory_lower = KiB_to_MiB(pi_limits[2])
memory_higher = KiB_to_MiB(pi_limits[3])

memory_limit = f"{memory_lower} {unit}" if memory_lower == memory_higher else f"{memory_lower}-{memory_higher} {unit}"

Expand Down
6 changes: 6 additions & 0 deletions oioioi/contests/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,13 @@ def problems_list_view(request):

show_problems_limits = controller.can_see_problems_limits(request)
problems_limits = {}

multiple_limits = False
if show_problems_limits:
problems_limits = stringify_problems_limits(controller.get_problems_limits(request))
for limit in problems_limits.values():
if len(limit) > 1:
multiple_limits = True

problem_instances = visible_problem_instances(request)

Expand Down Expand Up @@ -199,6 +204,7 @@ def problems_list_view(request):
"show_submit_button": show_submit_button,
"table_columns": table_columns,
"problems_on_page": getattr(settings, "PROBLEMS_ON_PAGE", 100),
"multiple_limits": multiple_limits,
},
)

Expand Down