A local-first single-page Vue 3 application that helps you generate randomized DSA practice contests from a CSV file of questions.
- CSV Upload: Upload a CSV file containing DSA practice questions
- Filter Panel: Filter questions by difficulty type, topics, and source
- Contest Generator: Generate random questions based on selected filters
- State Management: Pinia store for managing questions and filters
- Type Safety: Full TypeScript support
- Responsive Design: Works on both desktop and mobile devices
- Vue 3 (Composition API)
- TypeScript
- Pinia (State Management)
- TailwindCSS
- PapaParse (CSV parsing)
- Vite
The application expects a CSV file with the following columns:
Question Link: URL to the questionType: Difficulty level (Easy/Medium/Hard)Topics: Pipe-separated list of topics (e.g., "Array|Two Pointers|Sorting")Source List: Source of the question (e.g., "LeetCode", "CodeForces")
Example:
Question Link,Type,Topics,Source List
https://leetcode.com/problems/two-sum,Easy,Array|Hash Table,LeetCode
https://leetcode.com/problems/add-two-numbers,Medium,Linked List|Math,LeetCode
-
Clone the repository:
git clone <repository-url> cd contest-generator
-
Install dependencies:
npm install
-
Start the development server:
npm run dev
-
Open http://localhost:5173 in your browser
src/
├── components/ # Vue components
│ ├── FileUpload.vue # CSV upload component
│ ├── FilterPanel.vue # Filter controls
│ └── QuestionList.vue # Question display
├── store/ # Pinia stores
│ └── useQuestionStore.ts
├── types/ # TypeScript types
│ └── question.ts
├── utils/ # Utility functions
│ ├── parseCSV.ts
│ └── filterQuestions.ts
├── App.vue # Root component
└── main.ts # Application entry
- Prepare your CSV file following the format described above
- Upload the CSV file using the upload panel
- Use the filter panel to select:
- Difficulty types (Easy/Medium/Hard)
- Topics
- Sources
- Choose a difficulty combination for your contest:
- Medium & Hard
- Hard Only
- Medium Only
- All Difficulties
- Click "Generate Contest" to create a new contest
- Mark questions as done when completed
- Backend integration with Flask or Node.js
- Database persistence for user history
- Integration with Google Sheets or LeetCode API
- Analytics dashboard (average time per topic, etc.)
- React version in a monorepo structure
Feel free to open issues or submit pull requests for any improvements or bug fixes.
MIT