示例#1
0
 def download_sample_cases(
     self,
     *,
     session: Optional[requests.Session] = None
 ) -> List[onlinejudge.type.TestCase]:
     session = session or utils.get_default_session()
     resp = utils.request('GET', self.get_url(), session=session)
     soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding),
                              utils.html_parser)
     samples = onlinejudge._implementation.testcase_zipper.SampleZipper()
     for table in soup.find_all('table', class_="samples"):
         log.debug('table: %s', str(table))
         case = table.find('tbody').find('tr')
         assert len(list(case.children)) == 2
         input_pre, output_pre = list(
             map(lambda td: td.find('pre'), list(case.children)))
         assert input_pre.name == 'pre'
         assert output_pre.name == 'pre'
         assert re.search("^preSample.*Input$", input_pre.attrs['id'])
         assert re.search("^preSample.*Output$", output_pre.attrs['id'])
         samples.add(
             utils.parse_content(input_pre).lstrip().encode(), "Input")
         samples.add(
             utils.parse_content(output_pre).lstrip().encode(), "Output")
     return samples.get()
示例#2
0
 def download_sample_cases(
     self,
     *,
     session: Optional[requests.Session] = None
 ) -> List[onlinejudge.type.TestCase]:
     session = session or utils.get_default_session()
     # get
     resp = utils.request('GET', self.get_url(), session=session)
     # parse
     soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding),
                              utils.html_parser)
     samples = onlinejudge._implementation.testcase_zipper.SampleZipper()
     for tag in soup.find_all('div', class_=re.compile(
             '^(in|out)put$')):  # Codeforces writes very nice HTML :)
         log.debug('tag: %s', str(tag))
         non_empty_children = [
             child for child in tag.children if child.name or child.strip()
         ]
         log.debug("tags after removing empty strings: %s",
                   non_empty_children)
         assert len(non_empty_children
                    ) == 2  # if not 2, next line throws ValueError.
         title, pre = list(non_empty_children)
         assert 'title' in title.attrs['class']
         assert pre.name == 'pre'
         data = utils.format_sample_case(str(utils.parse_content(pre)))
         samples.add(data.encode(), title.string)
     return samples.get()
示例#3
0
    def _parse_sample_tag(self, tag: bs4.Tag) -> Optional[Tuple[str, str]]:
        assert isinstance(tag, bs4.Tag)
        assert tag.name == 'pre'
        prv = utils.previous_sibling_tag(tag)
        pprv = tag.parent and utils.previous_sibling_tag(tag.parent)
        if prv.name == 'h6' and tag.parent.name == 'div' and tag.parent['class'] == ['paragraph'] and pprv.name == 'h5':
            logger.debug('h6: %s', str(prv))
            logger.debug('name.encode(): %s', prv.string.encode())

            s = utils.parse_content(tag)

            return utils.textfile(s.lstrip()), pprv.string + ' ' + prv.string
        return None
示例#4
0
    def download_sample_cases(
            self,
            *,
            session: Optional[requests.Session] = None) -> List[TestCase]:
        session = session or utils.get_default_session()

        # get samples via the official API
        # reference: http://developers.u-aizu.ac.jp/api?key=judgedat%2Ftestcases%2Fsamples%2F%7BproblemId%7D_GET
        url = 'https://judgedat.u-aizu.ac.jp/testcases/samples/{}'.format(
            self.problem_id)
        resp = utils.request('GET', url, session=session)
        samples = []  # type: List[TestCase]
        for i, sample in enumerate(
                json.loads(resp.content.decode(resp.encoding))):
            samples += [
                TestCase(
                    'sample-{}'.format(i + 1),
                    str(sample['serial']),
                    sample['in'].encode(),
                    str(sample['serial']),
                    sample['out'].encode(),
                )
            ]

        # parse HTML if no samples are registered
        # see: https://github.com/kmyk/online-judge-tools/issues/207
        if not samples:
            logger.warning(
                "sample cases are not registered in the official API")
            logger.info("fallback: parsing HTML")

            # reference: http://developers.u-aizu.ac.jp/api?key=judgeapi%2Fresources%2Fdescriptions%2F%7Blang%7D%2F%7Bproblem_id%7D_GET
            url = 'https://judgeapi.u-aizu.ac.jp/resources/descriptions/ja/{}'.format(
                self.problem_id)
            resp = utils.request('GET', url, session=session)
            html = json.loads(resp.content.decode(resp.encoding))['html']

            # list h3+pre
            zipper = onlinejudge._implementation.testcase_zipper.SampleZipper()
            expected_strings = ('入力例', '出力例', 'Sample Input', 'Sample Output')
            soup = bs4.BeautifulSoup(html, utils.HTML_PARSER)
            for pre in soup.find_all('pre'):
                tag = pre.find_previous_sibling()
                if tag and tag.name == 'h3' and tag.string and any(
                        s in tag.string for s in expected_strings):
                    s = utils.textfile(utils.parse_content(pre).lstrip())
                    zipper.add(s.encode(), tag.string)
            samples = zipper.get()

        return samples
示例#5
0
    def download_sample_cases(
            self,
            *,
            session: Optional[requests.Session] = None) -> List[TestCase]:
        """
        :raises SampleParseError:
        """
        session = session or utils.get_default_session()

        url = 'https://www.spoj.com/problems/{}'.format(self.problem_id)
        resp = utils.request('GET', url, session=session)
        soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding),
                                 utils.html_parser)
        samples = onlinejudge._implementation.testcase_zipper.SampleZipper()
        for pre, h3 in self._find_sample_tags(soup):
            s = utils.textfile(
                utils.dos2unix(utils.parse_content(pre).lstrip()))
            name = h3.string
            samples.add(s.encode(), name)
        return samples.get()