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 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"] = { 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, [