eul

view project euler problems from the command line for some reason
git clone git://nihaljere.xyz/eul
Log | Files | Refs

commit e58200ef9498d35ce85961572a45b454094b79b2
Author: Nihal Jere <nihal@nihaljere.xyz>
Date:   Tue, 26 May 2020 22:49:36 -0500

initial commit

Diffstat:
Aeul | 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)