diff --git a/oioioi/contests/templates/contests/problems_list.html b/oioioi/contests/templates/contests/problems_list.html index e81e7e343..569ff0ce3 100644 --- a/oioioi/contests/templates/contests/problems_list.html +++ b/oioioi/contests/templates/contests/problems_list.html @@ -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); @@ -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; + } {% endblock %} @@ -60,9 +66,15 @@

{% trans "Problems" %}

{% trans "Name" %} {% if show_problems_limits %} - - {% trans "Limits" %} - + {% if multiple_limits %} + + {% trans "Limits" %} + + {% else %} + + {% trans "Limits" %} + + {% endif %} {% endif %} {% if show_submissions_limit %} @@ -102,21 +114,34 @@

{% trans "Problems" %}

{% endif %} {% if show_problems_limits %} - - {% if problem_limits %} - - {% for row in problem_limits %} - - {% for entry in row %} - - {% endfor %} - - {% endfor %} -
- {{ entry }} -
+ {% if multiple_limits %} + + {% if problem_limits %} + + {% for row in problem_limits %} + + {% for entry in row %} + + {% endfor %} + + {% endfor %} +
+ {{ entry }} +
+ {% endif %} + + {% else %} + {% if problem_limits and problem_limits.0 %} + + {{ problem_limits.0.1 }} + + + {{ problem_limits.0.2 }} + + {% else %} + {% endif %} - + {% endif %} {% endif %} {% if show_submissions_limit %} diff --git a/oioioi/contests/tests/tests.py b/oioioi/contests/tests/tests.py index 9c15e4e7c..cac8033ff 100755 --- a/oioioi/contests/tests/tests.py +++ b/oioioi/contests/tests/tests.py @@ -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), }, } @@ -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") diff --git a/oioioi/contests/utils.py b/oioioi/contests/utils.py index dd3954128..a48fad4a8 100755 --- a/oioioi/contests/utils.py +++ b/oioioi/contests/utils.py @@ -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}" diff --git a/oioioi/contests/views.py b/oioioi/contests/views.py index eca82f7c2..319d6c6d3 100755 --- a/oioioi/contests/views.py +++ b/oioioi/contests/views.py @@ -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) @@ -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, }, )