From 9e8440ff6b1cc1bb48bb02a804c555298e724a30 Mon Sep 17 00:00:00 2001 From: himooooono Date: Sun, 1 Jun 2025 13:13:03 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=E3=82=B9=E3=82=AF=E3=83=AC=E3=82=A4?= =?UTF-8?q?=E3=83=94=E3=83=B3=E3=82=B0=E3=81=AE=E3=83=A1=E3=83=A2=E3=83=AA?= =?UTF-8?q?=E8=A1=A8=E8=A8=98=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- onlinejudge/service/atcoder.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/onlinejudge/service/atcoder.py b/onlinejudge/service/atcoder.py index e558f24..48903f1 100644 --- a/onlinejudge/service/atcoder.py +++ b/onlinejudge/service/atcoder.py @@ -542,10 +542,10 @@ def _from_table_row(cls, tr: bs4.Tag, *, session: requests.Session, response: re time_limit_msec = int(float(utils.remove_suffix(tds[2].text, ' sec')) * 1000) else: assert False - if tds[3].text.endswith(' KB'): - memory_limit_byte = int(float(utils.remove_suffix(tds[3].text, ' KB')) * 1000) - elif tds[3].text.endswith(' MB'): - memory_limit_byte = int(float(utils.remove_suffix(tds[3].text, ' MB')) * 1000 * 1000) # TODO: confirm this is MB truly, not MiB + if tds[3].text.endswith(' KiB'): + memory_limit_byte = int(float(utils.remove_suffix(tds[3].text, ' KiB')) * 1024) + elif tds[3].text.endswith(' MiB'): + memory_limit_byte = int(float(utils.remove_suffix(tds[3].text, ' MiB')) * 1024 * 1024) # TODO: confirm this is MB truly, not MiB else: assert False if len(tds) == 5: @@ -583,15 +583,15 @@ def _from_html(cls, html: bytes, *, problem: 'AtCoderProblem', session: Optional assert False # When login as the admin, a link is added after memory limit. See https://github.com/online-judge-tools/api-client/issues/90 - parsed_memory_limit = re.search(r'^(メモリ制限|Memory Limit): ([0-9.]+) (KB|MB)', memory_limit) + parsed_memory_limit = re.search(r'^(メモリ制限|Memory Limit): ([0-9.]+) (KiB|MiB)', memory_limit) assert parsed_memory_limit memory_limit_value = parsed_memory_limit.group(2) memory_limit_unit = parsed_memory_limit.group(3) - if memory_limit_unit == 'KB': - memory_limit_byte = int(float(memory_limit_value) * 1000) - elif memory_limit_unit == 'MB': - memory_limit_byte = int(float(memory_limit_value) * 1000 * 1000) + if memory_limit_unit == 'KiB': + memory_limit_byte = int(float(memory_limit_value) * 1024) + elif memory_limit_unit == 'MiB': + memory_limit_byte = int(float(memory_limit_value) * 1024 * 1024) else: assert False @@ -1160,7 +1160,7 @@ def _from_table_row(cls, tr: bs4.Tag, *, session: requests.Session, response: re status = tds[6].text if len(tds) == 10: exec_time_msec = int(utils.remove_suffix(tds[7].text, ' ms')) # type: Optional[int] - memory_byte = int(utils.remove_suffix(tds[8].text, ' KB')) * 1000 # type: Optional[int] + memory_byte = int(utils.remove_suffix(tds[8].text, ' KiB')) * 1024 # type: Optional[int] else: exec_time_msec = None memory_byte = None From 23a0626ad2a931888d2189a19d4ecb2667fc0646 Mon Sep 17 00:00:00 2001 From: himooooono Date: Sun, 1 Jun 2025 13:24:30 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20tests=E3=81=AE=E3=83=A1=E3=83=A2?= =?UTF-8?q?=E3=83=AA=E5=88=B6=E9=99=90=E3=81=AE=E5=8D=98=E4=BD=8D=E3=82=92?= =?UTF-8?q?KiB=E3=80=81MiB=E3=81=AB=E5=AF=BE=E5=BF=9C=E3=81=99=E3=82=8B?= =?UTF-8?q?=E5=BD=A2=E3=81=AB=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/service_atcoder.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/service_atcoder.py b/tests/service_atcoder.py index e7a1b1d..924c2fc 100644 --- a/tests/service_atcoder.py +++ b/tests/service_atcoder.py @@ -84,7 +84,7 @@ def test_list_problems(self): time.sleep(0.5) self.assertEqual(problems[0].download_data().time_limit_msec, 2000) time.sleep(0.5) - self.assertEqual(problems[0].download_data().memory_limit_byte, 1024 * 1000 * 1000) + self.assertEqual(problems[0].download_data().memory_limit_byte, 1024 * 1024 * 1024) time.sleep(0.5) self.assertEqual(problems[5].download_data().alphabet, 'F') time.sleep(0.5) @@ -106,11 +106,11 @@ def test_list_problems_with_float_values(self): time.sleep(0.5) self.assertEqual(problems[0].download_data().time_limit_msec, 2525) time.sleep(0.5) - self.assertEqual(problems[0].download_data().memory_limit_byte, 246 * 1000 * 1000) + self.assertEqual(problems[0].download_data().memory_limit_byte, 246 * 1024 * 1024) time.sleep(0.5) self.assertEqual(problems[1].download_data().time_limit_msec, 5252) time.sleep(0.5) - self.assertEqual(problems[1].download_data().memory_limit_byte, 512 * 1000 * 1000) + self.assertEqual(problems[1].download_data().memory_limit_byte, 512 * 1024 * 1024) def test_list_problems_time_limit_is_less_than_msec(self): contest = AtCoderContest.from_url('https://atcoder.jp/contests/joi2019ho') @@ -132,9 +132,9 @@ def test_list_problems_memory_limit_is_zero(self): time.sleep(0.5) problems = contest.list_problems() time.sleep(0.5) - self.assertEqual(problems[0].download_data().memory_limit_byte, 1024 * 1000 * 1000) # 1024 MB + self.assertEqual(problems[0].download_data().memory_limit_byte, 1024 * 1024 * 1024) # 1024 MiB time.sleep(0.5) - self.assertEqual(problems[1].download_data().memory_limit_byte, 0) # 0 KB + self.assertEqual(problems[1].download_data().memory_limit_byte, 0) # 0 KiB @unittest.skip('Breaking change in AtCoder') def test_iterate_submissions(self): @@ -195,7 +195,7 @@ def test_load_details(self): self.assertEqual(data.alphabet, 'A') self.assertEqual(data.name, 'B +/- A') self.assertEqual(data.time_limit_msec, 2000) - self.assertEqual(data.memory_limit_byte, 1024 * 1000 * 1000) + self.assertEqual(data.memory_limit_byte, 1024 * 1024 * 1024) self.assertEqual(data.score, 100) def test_get_alphabet(self): @@ -259,7 +259,7 @@ def test_from_html_very_old(self): self.assertEqual(data.available_languages, None) self.assertEqual(data.html, html) self.assertEqual(data.input_format, None) - self.assertEqual(data.memory_limit_byte, 292 * 1000 * 1000) + self.assertEqual(data.memory_limit_byte, 292 * 1024 * 1024) self.assertEqual(data.name, 'プログラミングコンテスト') self.assertEqual(data.problem, AtCoderProblem.from_url(url)) self.assertEqual(data.sample_cases, [ @@ -281,7 +281,7 @@ def test_from_html_old(self): self.assertEqual(data.available_languages, None) self.assertEqual(data.html, html) self.assertEqual(data.input_format, '\r\nR C\r\nX Y\r\nD L\r\n') - self.assertEqual(data.memory_limit_byte, 64 * 1000 * 1000) + self.assertEqual(data.memory_limit_byte, 64 * 1024 * 1024) self.assertEqual(data.name, 'AtCoder社の冬') self.assertEqual(data.problem, AtCoderProblem.from_url(url)) self.assertEqual(data.sample_cases, [ @@ -304,7 +304,7 @@ def test_from_html_standard(self): self.assertEqual(data.available_languages, None) self.assertEqual(data.html, html) self.assertEqual(data.input_format, 'N\r\n') - self.assertEqual(data.memory_limit_byte, 1024 * 1000 * 1000) + self.assertEqual(data.memory_limit_byte, 1024 * 1024 * 1024) self.assertEqual(data.name, '756') self.assertEqual(data.problem, AtCoderProblem.from_url(url)) self.assertEqual(data.sample_cases, [ @@ -326,7 +326,7 @@ def test_from_html_with_empty_output(self): self.assertEqual(data.available_languages, None) self.assertEqual(data.html, html) self.assertEqual(data.input_format, 'N K\r\nA_0 A_1 \\cdots A_{N-1}\r\n') - self.assertEqual(data.memory_limit_byte, 1024 * 1000 * 1000) + self.assertEqual(data.memory_limit_byte, 1024 * 1024 * 1024) self.assertEqual(data.name, 'Do Not Duplicate') self.assertEqual(data.problem, AtCoderProblem.from_url(url)) self.assertEqual(data.sample_cases, [ @@ -349,7 +349,7 @@ def test_from_html_without_sample_cases(self): self.assertEqual(data.available_languages, None) self.assertEqual(data.html, html) self.assertEqual(data.input_format, None) - self.assertEqual(data.memory_limit_byte, 64 * 1000 * 1000) + self.assertEqual(data.memory_limit_byte, 64 * 1024 * 1024) self.assertEqual(data.name, '天下一株式会社採用情報') self.assertEqual(data.problem, AtCoderProblem.from_url(url)) self.assertEqual(data.sample_cases, []) @@ -367,7 +367,7 @@ def test_from_html_issue_414(self): self.assertEqual(data.available_languages, None) self.assertEqual(data.html, html) self.assertEqual(data.input_format, None) - self.assertEqual(data.memory_limit_byte, 256 * 1000 * 1000) + self.assertEqual(data.memory_limit_byte, 256 * 1024 * 1024) self.assertEqual(data.name, 'Graph Cut') self.assertEqual(data.problem, AtCoderProblem.from_url(url)) self.assertEqual(data.sample_cases, [ From 9f52b9a47d0d488730572f22faa410a2c6e914b8 Mon Sep 17 00:00:00 2001 From: himooooono Date: Sun, 1 Jun 2025 13:30:28 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20memoryLimit=E3=81=AEdescription?= =?UTF-8?q?=E3=82=92=E8=A6=96=E8=AA=8D=E3=81=97=E3=81=9F=E3=81=AE=E3=81=A7?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- onlinejudge_api/get_problem.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/onlinejudge_api/get_problem.py b/onlinejudge_api/get_problem.py index f357ff8..9d7fdec 100644 --- a/onlinejudge_api/get_problem.py +++ b/onlinejudge_api/get_problem.py @@ -67,7 +67,7 @@ }, "memoryLimit": { "type": "integer", - "description": "in megabytes (MB), not in mebibytes (MiB); Decimals are truncated for compatibility to competitive-companion", + "description": "in mebibytes (MiB), not in megabytes (MB); Decimals are truncated for compatibility to competitive-companion", }, "timeLimit": { "type": "integer", @@ -316,7 +316,7 @@ def main(problem: Problem, *, is_system: bool, is_compatibility: bool, is_full: }, "alphabet": data.alphabet, } - result["memoryLimit"] = data.memory_limit_byte // 1000 // 1000 + result["memoryLimit"] = data.memory_limit_byte // 1024 // 1024 result["timeLimit"] = data.time_limit_msec if is_full: result["raw"] = {