diff --git a/README.md b/README.md index a0f27a8..64f6f22 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,26 @@ This repo tracks my journey solving LeetCode problems — not just code, but my ## 🛠️ Tools & Scripts - `create_missing_notes.sh`: Automatically creates missing note files for solved problems +- `update_difficulties.sh`: Manage problem difficulties dynamically without hardcoding + +### Script Usage Examples: +```bash +# Create missing notes for new problems +./create_missing_notes.sh + +# Add difficulty mapping for a problem +./update_difficulties.sh -a 1 Easy +./update_difficulties.sh -a 4 Hard + +# List all difficulty mappings +./update_difficulties.sh -l + +# Update all note files with correct difficulties +./update_difficulties.sh -u + +# Remove difficulty mapping +./update_difficulties.sh -r 1 +``` ## 📚 Resources - [LeetCode Problem Set](https://leetcode.com/problemset/) diff --git a/create_missing_notes.sh b/create_missing_notes.sh index ca0a680..a9a9b18 100755 --- a/create_missing_notes.sh +++ b/create_missing_notes.sh @@ -37,26 +37,6 @@ filename_to_title() { echo "$title" | sed 's/-/ /g' | sed 's/\b\w/\U&/g' | sed 's/\bii\b/II/g' | sed 's/\biii\b/III/g' } -# Function to determine difficulty based on problem number ranges -get_difficulty() { - local problem_num=$1 - - # Hard problems (known) - case $problem_num in - 4|10|42|135|149|248) - echo "Hard" - ;; - # Easy problems (known) - 1|9|13|14|20|21|28|35|66|69|88|121|125|141|169|202|205|206|217|219|228|242|243|246|290|383|392|704|1200|2053|2441|3442|3445) - echo "Easy" - ;; - # Everything else is Medium - *) - echo "Medium" - ;; - esac -} - # Function to get difficulty color for shields get_difficulty_color() { local difficulty=$1 @@ -76,6 +56,15 @@ get_difficulty_color() { esac } +# Function to determine difficulty dynamically (default to Medium for unknown problems) +get_difficulty() { + local problem_num=$1 + + # For now, default to Medium for all problems + # This can be enhanced later with API calls or a separate difficulty mapping file + echo "Medium" +} + # Function to create note file create_note_file() { local problem_num=$1 @@ -157,7 +146,7 @@ if [ -d "$EXERCISES_DIR" ]; then # Convert filename to title title=$(filename_to_title "$filename") - # Get difficulty + # Get difficulty (default to Medium for now) difficulty=$(get_difficulty "$problem_num") # Create note file @@ -180,4 +169,5 @@ echo "✅ New notes created: $created_count" echo "⏭️ Notes skipped (already exist): $skipped_count" echo "📁 Notes directory: $NOTES_DIR" echo "" -echo "💡 Tip: Run this script whenever you solve new problems to automatically create note templates." \ No newline at end of file +echo "💡 Tip: Run this script whenever you solve new problems to automatically create note templates." +echo "🔧 Note: All problems default to 'Medium' difficulty. You can manually update difficulties in the notes." \ No newline at end of file diff --git a/update_difficulties.sh b/update_difficulties.sh new file mode 100755 index 0000000..e91bbc2 --- /dev/null +++ b/update_difficulties.sh @@ -0,0 +1,191 @@ +#!/bin/bash + +# LeetCode Difficulty Updater +# This script helps manage problem difficulties dynamically + +NOTES_DIR="src/notes" +DIFFICULTY_FILE=".difficulty_mapping" + +# Function to show usage +show_usage() { + echo "Usage: $0 [OPTIONS]" + echo "" + echo "Options:" + echo " -a, --add Add/update difficulty for a problem" + echo " -r, --remove Remove difficulty mapping for a problem" + echo " -l, --list List all difficulty mappings" + echo " -u, --update-notes Update all note files with correct difficulties" + echo " -h, --help Show this help message" + echo "" + echo "Difficulties: Easy, Medium, Hard" + echo "" + echo "Examples:" + echo " $0 -a 1 Easy" + echo " $0 -a 4 Hard" + echo " $0 -r 1" + echo " $0 -l" + echo " $0 -u" +} + +# Function to get difficulty color for shields +get_difficulty_color() { + local difficulty=$1 + case $difficulty in + "Easy") + echo "brightgreen" + ;; + "Medium") + echo "orange" + ;; + "Hard") + echo "red" + ;; + *) + echo "blue" + ;; + esac +} + +# Function to add/update difficulty mapping +add_difficulty() { + local problem_num=$1 + local difficulty=$2 + + # Validate difficulty + case $difficulty in + "Easy"|"Medium"|"Hard") + ;; + *) + echo "❌ Error: Invalid difficulty '$difficulty'. Use Easy, Medium, or Hard." + exit 1 + ;; + esac + + # Create difficulty file if it doesn't exist + touch "$DIFFICULTY_FILE" + + # Remove existing entry if it exists + sed -i.bak "/^$problem_num:/d" "$DIFFICULTY_FILE" + + # Add new entry + echo "$problem_num:$difficulty" >> "$DIFFICULTY_FILE" + + echo "✅ Added difficulty mapping: Problem $problem_num -> $difficulty" +} + +# Function to remove difficulty mapping +remove_difficulty() { + local problem_num=$1 + + if [ -f "$DIFFICULTY_FILE" ]; then + sed -i.bak "/^$problem_num:/d" "$DIFFICULTY_FILE" + echo "✅ Removed difficulty mapping for problem $problem_num" + else + echo "⚠️ No difficulty mapping file found" + fi +} + +# Function to list all difficulty mappings +list_difficulties() { + if [ -f "$DIFFICULTY_FILE" ] && [ -s "$DIFFICULTY_FILE" ]; then + echo "📋 Current Difficulty Mappings:" + echo "Problem | Difficulty" + echo "--------|-----------" + sort -n "$DIFFICULTY_FILE" | while IFS=':' read -r problem difficulty; do + printf "%-7s | %s\n" "$problem" "$difficulty" + done + else + echo "📋 No difficulty mappings found" + fi +} + +# Function to get difficulty from mapping file +get_difficulty_from_file() { + local problem_num=$1 + + if [ -f "$DIFFICULTY_FILE" ]; then + local difficulty=$(grep "^$problem_num:" "$DIFFICULTY_FILE" | cut -d':' -f2) + if [ -n "$difficulty" ]; then + echo "$difficulty" + return 0 + fi + fi + + # Default to Medium if no mapping found + echo "Medium" + return 1 +} + +# Function to update note files with correct difficulties +update_notes() { + echo "🔄 Updating note files with correct difficulties..." + + local updated_count=0 + + if [ -d "$NOTES_DIR" ]; then + for note_file in "$NOTES_DIR"/*.md; do + if [ -f "$note_file" ]; then + # Extract problem number from filename + local filename=$(basename "$note_file") + local problem_num=$(echo "$filename" | sed 's/^\([0-9]*\)_.*/\1/') + + if [ -n "$problem_num" ] && [ "$problem_num" != "$filename" ]; then + # Get correct difficulty + local correct_difficulty=$(get_difficulty_from_file "$problem_num") + local difficulty_color=$(get_difficulty_color "$correct_difficulty") + + # Update difficulty in note file + sed -i.bak "s/\[!\[Difficulty\].*\]/\[!\[Difficulty\](https:\/\/img.shields.io\/badge\/Difficulty-$correct_difficulty-$difficulty_color?style=for-the-badge)\]/" "$note_file" + sed -i.bak "s/\*\*Difficulty:\*\* \[.*\]/\*\*Difficulty:\*\* \[$correct_difficulty\](https:\/\/leetcode.com\/problemset\/?difficulty=$(echo "$correct_difficulty" | tr '[:lower:]' '[:upper:]'))/" "$note_file" + + echo "✅ Updated: $filename -> $correct_difficulty" + ((updated_count++)) + fi + fi + done + + # Clean up backup files + rm -f "$NOTES_DIR"/*.bak + rm -f "$DIFFICULTY_FILE.bak" + + echo "🎉 Updated $updated_count note files" + else + echo "❌ Notes directory not found" + fi +} + +# Main script logic +case "${1:-}" in + -a|--add) + if [ $# -eq 3 ]; then + add_difficulty "$2" "$3" + else + echo "❌ Error: Missing arguments for --add" + show_usage + exit 1 + fi + ;; + -r|--remove) + if [ $# -eq 2 ]; then + remove_difficulty "$2" + else + echo "❌ Error: Missing problem number for --remove" + show_usage + exit 1 + fi + ;; + -l|--list) + list_difficulties + ;; + -u|--update-notes) + update_notes + ;; + -h|--help|"") + show_usage + ;; + *) + echo "❌ Error: Unknown option '$1'" + show_usage + exit 1 + ;; +esac \ No newline at end of file