# Python Version: 3.x
"""
the module for Anarchy Golf (http://golf.shinh.org/)
"""
import urllib.parse
from typing import *
import bs4
import requests
import onlinejudge._implementation.testcase_zipper
import onlinejudge._implementation.utils as utils
import onlinejudge.dispatch
import onlinejudge.type
[docs]class AnarchyGolfService(onlinejudge.type.Service):
[docs] def get_url(self) -> str:
return 'http://golf.shinh.org/'
[docs] def get_name(self) -> str:
return 'Anarchy Golf'
[docs] @classmethod
def from_url(cls, url: str) -> Optional['AnarchyGolfService']:
# example: http://golf.shinh.org/
result = urllib.parse.urlparse(url)
if result.scheme in ('', 'http', 'https') \
and result.netloc == 'golf.shinh.org':
return cls()
return None
[docs]class AnarchyGolfProblem(onlinejudge.type.Problem):
def __init__(self, *, problem_id: str):
self.problem_id = problem_id
[docs] 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 h2 in soup.find_all('h2'):
it = self._parse_sample_tag(h2)
if it is not None:
s, name = it
samples.add(s.encode(), name)
return samples.get()
def _parse_sample_tag(self, tag: bs4.Tag) -> Optional[Tuple[str, str]]:
assert isinstance(tag, bs4.Tag)
assert tag.name == 'h2'
name = tag.contents[0]
if ':' in name:
name = name[:name.find(':')]
if name in ['Sample input', 'Sample output']:
nxt = tag.next_sibling
while nxt and nxt.string.strip() == '':
nxt = nxt.next_sibling
if nxt.name == 'pre':
s = utils.textfile(utils.dos2unix(nxt.string.lstrip()))
else:
s = ''
return s, name
return None
[docs] def get_url(self) -> str:
return 'http://golf.shinh.org/p.rb?{}'.format(self.problem_id)
[docs] def get_service(self) -> AnarchyGolfService:
return AnarchyGolfService()
[docs] @classmethod
def from_url(cls, url: str) -> Optional['AnarchyGolfProblem']:
# example: http://golf.shinh.org/p.rb?The+B+Programming+Language
result = urllib.parse.urlparse(url)
if result.scheme in ('', 'http', 'https') \
and result.netloc == 'golf.shinh.org' \
and utils.normpath(result.path) == '/p.rb' \
and result.query:
return cls(problem_id=result.query)
return None
onlinejudge.dispatch.services += [AnarchyGolfService]
onlinejudge.dispatch.problems += [AnarchyGolfProblem]