Skip to content

Commit

Permalink
#380: make Problem.get_input_format() return raw HTML strings
Browse files Browse the repository at this point in the history
  • Loading branch information
kmyk committed Mar 19, 2019
1 parent 41917af commit 83af6b5
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 11 deletions.
5 changes: 1 addition & 4 deletions onlinejudge/service/atcoder.py
Original file line number Diff line number Diff line change
Expand Up @@ -504,10 +504,7 @@ def get_input_format(self, session: Optional[requests.Session] = None) -> Option
if tag is None:
break
if tag.name in ('pre', 'blockquote'):
s = ''
for it in tag:
s += it.string or it # AtCoder uses <var>...</var> for math symbols
return s
return tag.decode_contents(formatter='html')
return None

def get_available_languages(self, session: Optional[requests.Session] = None) -> List[Language]:
Expand Down
2 changes: 1 addition & 1 deletion onlinejudge/service/yukicoder.py
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,7 @@ def get_input_format(self, session: Optional[requests.Session] = None) -> Option
soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser)
for h4 in soup.find_all('h4'):
if h4.string == '入力':
return h4.parent.find('pre').string
return h4.parent.find('pre').decode_contents(formatter=None)
return None


Expand Down
4 changes: 4 additions & 0 deletions onlinejudge/type.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,10 @@ def get_name(self) -> str:
raise NotImplementedError

def get_input_format(self, session: Optional[requests.Session] = None) -> Optional[str]:
"""
:return: the HTML in the `<pre>` tag as :py:class:`str`
"""

raise NotImplementedError

@classmethod
Expand Down
12 changes: 6 additions & 6 deletions tests/service_atcoder.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,13 +177,13 @@ def test_get_source_code(self):

class AtCoderProblemGetInputFormatTest(unittest.TestCase):
def test_normal(self):
self.assertEqual(AtCoderProblem.from_url('https://beta.atcoder.jp/contests/agc001/tasks/agc001_d').get_input_format(), 'N M\r\nA_1 A_2 ... A_M\r\n')
self.assertEqual(AtCoderProblem.from_url('https://beta.atcoder.jp/contests/agc002/tasks/agc002_d').get_input_format(), '\r\nN M\r\na_1 b_1\r\na_2 b_2\r\n:\r\na_M b_M\r\nQ\r\nx_1 y_1 z_1\r\nx_2 y_2 z_2\r\n:\r\nx_Q y_Q z_Q\r\n')
self.assertEqual(AtCoderProblem.from_url('https://beta.atcoder.jp/contests/agc003/tasks/agc003_d').get_input_format(), 'N\r\ns_1\r\n:\r\ns_N\r\n')
self.assertEqual(AtCoderProblem.from_url('https://beta.atcoder.jp/contests/agc004/tasks/agc004_d').get_input_format(), 'N K\r\na_1 a_2 ... a_N\r\n')
self.assertEqual(AtCoderProblem.from_url('https://beta.atcoder.jp/contests/agc005/tasks/agc005_d').get_input_format(), 'N K\r\n')
self.assertEqual(AtCoderProblem.from_url('https://beta.atcoder.jp/contests/agc001/tasks/agc001_d').get_input_format(), '<var>N</var> <var>M</var>\r\n<var>A_1</var> <var>A_2</var> <var>...</var> <var>A_M</var>\r\n')
self.assertEqual(AtCoderProblem.from_url('https://beta.atcoder.jp/contests/agc002/tasks/agc002_d').get_input_format(), '\r\n<var>N</var> <var>M</var>\r\n<var>a_1</var> <var>b_1</var>\r\n<var>a_2</var> <var>b_2</var>\r\n<var>:</var>\r\n<var>a_M</var> <var>b_M</var>\r\n<var>Q</var>\r\n<var>x_1</var> <var>y_1</var> <var>z_1</var>\r\n<var>x_2</var> <var>y_2</var> <var>z_2</var>\r\n<var>:</var>\r\n<var>x_Q</var> <var>y_Q</var> <var>z_Q</var>\r\n')
self.assertEqual(AtCoderProblem.from_url('https://beta.atcoder.jp/contests/agc003/tasks/agc003_d').get_input_format(), '<var>N</var>\r\n<var>s_1</var>\r\n:\r\n<var>s_N</var>\r\n')
self.assertEqual(AtCoderProblem.from_url('https://beta.atcoder.jp/contests/agc004/tasks/agc004_d').get_input_format(), '<var>N</var> <var>K</var>\r\n<var>a_1</var> <var>a_2</var> <var>...</var> <var>a_N</var>\r\n')
self.assertEqual(AtCoderProblem.from_url('https://beta.atcoder.jp/contests/agc005/tasks/agc005_d').get_input_format(), '<var>N</var> <var>K</var>\r\n')

self.assertEqual(AtCoderProblem.from_url('https://beta.atcoder.jp/contests/arc083/tasks/arc083_a').get_input_format(), 'A B C D E F\r\n')
self.assertEqual(AtCoderProblem.from_url('https://beta.atcoder.jp/contests/arc083/tasks/arc083_a').get_input_format(), '<var>A</var> <var>B</var> <var>C</var> <var>D</var> <var>E</var> <var>F</var>\r\n')

def test_old_problem(self):
# https://github.com/kmyk/online-judge-tools/issues/380
Expand Down

0 comments on commit 83af6b5

Please sign in to comment.