| | from bs4 import BeautifulSoup |
| | import requests |
| | import numpy as np |
| | from datetime import datetime |
| |
|
| | def gen_link(): |
| | if np.random.choice([True, False]): |
| | |
| | np.random.seed() |
| | year = np.random.randint(2015, 2023) |
| | AB = np.random.choice(['A', 'B']) |
| | |
| | mu, sigma = 18, 5 |
| | s = np.random.normal(mu, sigma, 1000) |
| | s = np.round(s) |
| | s = s[(s >= 10) & (s <= 25)] |
| | q = int(np.random.choice(s)) |
| | link = f'https://artofproblemsolving.com/wiki/index.php/{year}_AMC_12{AB}_Problems/Problem_{q}' |
| | else: |
| | |
| | np.random.seed() |
| | year = np.random.randint(2005, 2023) |
| | I = np.random.choice(['I', 'II']) |
| | mu, sigma = 6, 4 |
| | s = np.random.normal(mu, sigma, 1000) |
| | s = np.round(s) |
| | s = s[(s >= 1) & (s <= 15)] |
| | q = int(np.random.choice(s)) |
| | link = f'https://artofproblemsolving.com/wiki/index.php/{year}_AIME_{I}_Problems/Problem_{q}' |
| | return link |
| |
|
| | def convert_to_renderable_html(text): |
| | text = text.replace('//latex.artofproblemsolving.com', 'https://latex.artofproblemsolving.com') |
| | return text |
| |
|
| | def get_problem(url): |
| | headers = { |
| | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" |
| | } |
| | response = requests.get(url, headers=headers) |
| | soup = BeautifulSoup(response.text, 'html.parser') |
| | problem_headline = soup.find('span', {'class': 'mw-headline', 'id': 'Problem'}) |
| |
|
| | if problem_headline: |
| | problem_content = [] |
| | for sibling in problem_headline.parent.find_next_siblings(): |
| | if sibling.name == 'h2': |
| | break |
| | elif sibling.name == 'p': |
| | problem_content.append(convert_to_renderable_html(str(sibling))) |
| |
|
| | problem_html = " ".join(problem_content) |
| | return problem_html |
| | else: |
| | print("No problem found") |
| |
|
| | def gen_html(num): |
| | all_q = str() |
| | num_tried = 0 |
| | num_succ = 0 |
| | while True: |
| | try: |
| | link = gen_link() |
| | print(link) |
| | hype = f'<a href="{link}" target="_blank">to link</a>' |
| | qhtml = get_problem(link) |
| | all_q += (hype + qhtml) |
| | num_succ += 1 |
| | except Exception as e: |
| | print(f"Error: {e}") |
| | pass |
| | num_tried += 1 |
| | if num_succ >= num or num_tried > 20: |
| | break |
| |
|
| | all_q = f''' |
| | <html> |
| | <head> |
| | <style> |
| | body {{ |
| | font-family: Arial, sans-serif; |
| | font-size: 12pt; |
| | }} |
| | img.latex {{ |
| | font-size: 12pt; /* Ensure math font size matches the body text size */ |
| | }} |
| | a {{ |
| | color: blue; |
| | text-decoration: none; |
| | }} |
| | a:hover {{ |
| | text-decoration: underline; |
| | }} |
| | </style> |
| | </head> |
| | <body> |
| | {all_q} |
| | </body> |
| | </html> |
| | ''' |
| | return all_q |
| |
|
| | def save_html_to_file(html_content, output_filename): |
| | with open(output_filename, 'w', encoding='utf-8') as file: |
| | file.write(html_content) |
| |
|