commit e58200ef9498d35ce85961572a45b454094b79b2
Author: Nihal Jere <nihal@nihaljere.xyz>
Date: Tue, 26 May 2020 22:49:36 -0500
initial commit
Diffstat:
A | eul | | | 83 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 83 insertions(+), 0 deletions(-)
diff --git a/eul b/eul
@@ -0,0 +1,83 @@
+#!/usr/bin/python
+
+import requests
+import re
+from dataclasses import dataclass
+import datetime
+import argparse
+
+table_exp = '<table.*</table>'
+problem_exp = r'<tr><td.*?n">(.*?)</td><td><a.*?Pu.*?on (.*?)">(.*?)</a>.*'
+
+@dataclass
+class Problem:
+ number: int
+ name: str
+ date: datetime.datetime
+
+ def __str__(self):
+ return f"{self.number}\t{self.name}\t{self.date}"
+
+ @staticmethod
+ def printlist(l: list):
+ maxname = max(len(p.name) for p in l)
+ maxnum = max(len(str(p.number)) for p in l)
+ for p in l:
+ datestr = p.date.strftime('%d %b %Y')
+ print(str(p.number).ljust(maxnum), p.name.ljust(maxname), datestr)
+
+def parse(page: str):
+ raw_table = next(re.finditer(table_exp, page, re.DOTALL)).group(0)
+ raw_problems = re.finditer(problem_exp, raw_table)
+
+ problems = []
+ for p in raw_problems:
+ number = p.group(1)
+ dt = p.group(2)
+ name = p.group(3)
+
+ name = re.sub('<[/]?.*?>', '', name)
+
+ dt = re.sub(' ([0-9]{1,2}?)[a-z]{2} ', r' \1 ', dt)
+ dt = datetime.datetime.strptime(dt, '%A, %d %B %Y, %I:%M %p')
+ problems.append(Problem(number, name, dt))
+
+ return problems
+
+
+def handle_recent(args):
+ resp = requests.get(f'https://projecteuler.net/recent')
+ problems = parse(resp.text)
+ Problem.printlist(problems)
+
+def handle_archives(args):
+ resp = requests.get(f'https://projecteuler.net/archives;page={args.n}')
+ problems = parse(resp.text)
+ Problem.printlist(problems)
+
+
+def handle_problem(args):
+ resp = requests.get(f'https://projecteuler.net/minimal={args.n}')
+ #text = re.sub('<[/]?.*?>', '', resp.text)
+ print(resp.text)
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description='view Project Euler problems')
+ subparsers = parser.add_subparsers(required=True)
+
+ recent_parser = subparsers.add_parser('recent',
+ help='retrieve list of recent problems')
+ recent_parser.set_defaults(func=handle_recent)
+
+ archives_parser = subparsers.add_parser('archives',
+ help='retrieve nth page of archived problems')
+ archives_parser.add_argument('n', type=int, help='page to retrieve')
+ archives_parser.set_defaults(func=handle_archives)
+
+ problem_parser = subparsers.add_parser('problem', help='retrieve nth problem')
+ problem_parser.add_argument('n', type=int, help='problem to retrieve')
+ problem_parser.set_defaults(func=handle_problem)
+
+ args = parser.parse_args()
+ args.func(args)