|
import gradio as gr |
|
import os |
|
from openai import OpenAI |
|
import time |
|
|
|
def solve_competitive_problem(problem_statement, language_choice, api_key, progress=gr.Progress()): |
|
""" |
|
Generate a solution for a competitive programming problem |
|
|
|
Args: |
|
problem_statement (str): The problem statement |
|
language_choice (str): Programming language for the solution |
|
api_key (str): OpenRouter API key |
|
progress: Gradio progress tracker |
|
|
|
Returns: |
|
str: Step-by-step solution with code |
|
""" |
|
if not api_key.strip(): |
|
return "Error: Please provide your OpenRouter API key." |
|
|
|
if not problem_statement.strip(): |
|
return "Error: Please provide a problem statement." |
|
|
|
try: |
|
progress(0.1, "Initializing...") |
|
|
|
|
|
client = OpenAI( |
|
base_url="https://openrouter.ai/api/v1", |
|
api_key=api_key, |
|
) |
|
|
|
progress(0.3, "Creating prompt...") |
|
|
|
|
|
prompt = f""" |
|
You are an expert competitive programmer. Analyze the following problem and provide a step-by-step solution with explanations and code in {language_choice}. |
|
Problem: |
|
{problem_statement} |
|
Your response should include: |
|
1. Problem Analysis: |
|
- Clear restatement of the problem in your own words |
|
- Identification of input/output formats |
|
- Key constraints and edge cases to consider |
|
- Time and space complexity requirements |
|
2. Approach: |
|
- High-level strategy to solve the problem |
|
- Why this approach is optimal compared to alternatives |
|
- Any mathematical insights or observations |
|
- Data structures that will be helpful |
|
3. Algorithm: |
|
- Detailed step-by-step breakdown of the algorithm |
|
- Clear explanation of the logic behind each step |
|
- Time complexity analysis with justification |
|
- Space complexity analysis with justification |
|
- Any optimizations made to improve performance |
|
4. Implementation: |
|
- Clean, efficient, and well-commented {language_choice} code |
|
- Proper variable naming and code organization |
|
- Error handling and edge case management |
|
- Optimized for both readability and performance |
|
5. Testing: |
|
- Example test cases with expected outputs |
|
- Edge case testing scenarios |
|
- Explanation of how to verify correctness |
|
- Potential areas where the solution might need improvement |
|
Format your answer with clear headings and subheadings. Use markdown formatting for better readability. |
|
""" |
|
|
|
progress(0.5, "Generating solution...") |
|
|
|
|
|
completion = client.chat.completions.create( |
|
extra_headers={ |
|
"HTTP-Referer": "https://competitive-programming-assistant.app", |
|
"X-Title": "Competitive Programming Assistant", |
|
}, |
|
model="open-r1/olympiccoder-7b:free", |
|
messages=[ |
|
{ |
|
"role": "user", |
|
"content": prompt |
|
} |
|
], |
|
temperature=0.7, |
|
stream=False |
|
) |
|
|
|
progress(0.9, "Processing response...") |
|
|
|
solution = completion.choices[0].message.content |
|
|
|
progress(1.0, "Complete!") |
|
return solution |
|
|
|
except Exception as e: |
|
return f"Error: {str(e)}" |
|
|
|
|
|
with gr.Blocks(title="Competitive Programming Assistant", theme=gr.themes.Soft()) as app: |
|
gr.Markdown(""" |
|
# π Competitive Programming Assistant |
|
|
|
Upload a problem statement from Codeforces, LeetCode, or any competitive programming platform to get: |
|
- Step-by-step analysis |
|
- Optimal solution approach |
|
- Complete code implementation |
|
- Time and space complexity analysis |
|
|
|
Powered by the OlympicCoder model. |
|
""") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=2): |
|
api_key_input = gr.Textbox( |
|
placeholder="Enter your OpenRouter API key here", |
|
label="OpenRouter API Key", |
|
type="password" |
|
) |
|
|
|
problem_input = gr.Textbox( |
|
placeholder="Paste your competitive programming problem statement here...", |
|
label="Problem Statement", |
|
lines=10 |
|
) |
|
|
|
language = gr.Dropdown( |
|
choices=["Python", "C++", "Java", "JavaScript"], |
|
value="Python", |
|
label="Programming Language" |
|
) |
|
|
|
submit_btn = gr.Button("Generate Solution", variant="primary") |
|
|
|
with gr.Column(scale=3): |
|
solution_output = gr.Markdown( |
|
label="Generated Solution" |
|
) |
|
|
|
with gr.Accordion("About", open=False): |
|
gr.Markdown(""" |
|
### How to use this app: |
|
|
|
1. Enter your OpenRouter API key (get one at [openrouter.ai](https://openrouter.ai)) |
|
2. Paste the complete problem statement |
|
3. Select your preferred programming language |
|
4. Click "Generate Solution" |
|
|
|
### Tips for best results: |
|
|
|
- Include the entire problem, including input/output formats and constraints |
|
- Make sure to include example inputs and outputs |
|
- For complex problems, consider adding clarifying notes |
|
|
|
### Solution Format: |
|
|
|
Your solution will include: |
|
1. **Problem Analysis** - Breaking down the problem into manageable components |
|
2. **Approach** - Strategic methodology with mathematical insights |
|
3. **Algorithm** - Detailed step-by-step procedure with complexity analysis |
|
4. **Implementation** - Clean, commented code in your chosen language |
|
5. **Testing** - Example test cases and verification methods |
|
""") |
|
|
|
|
|
submit_btn.click( |
|
solve_competitive_problem, |
|
inputs=[problem_input, language, api_key_input], |
|
outputs=solution_output |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
app.launch() |