dancealgorithm 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. dancealgorithm/__init__.py +128 -0
  2. dancealgorithm/__main__.py +8 -0
  3. dancealgorithm/assignments/DA - Campus/Solution.java +198 -0
  4. dancealgorithm/assignments/DA - Campus/__init__.py +34 -0
  5. dancealgorithm/assignments/DA - Flight/Solution.java +204 -0
  6. dancealgorithm/assignments/DA - Flight/__init__.py +34 -0
  7. dancealgorithm/assignments/DA - Smart/Solution.java +220 -0
  8. dancealgorithm/assignments/DA - Smart/__init__.py +34 -0
  9. dancealgorithm/assignments/DA.txt +29 -0
  10. dancealgorithm/assignments/FK - Advertisement/Solution.java +141 -0
  11. dancealgorithm/assignments/FK - Advertisement/__init__.py +34 -0
  12. dancealgorithm/assignments/FK - Electric/Solution.java +168 -0
  13. dancealgorithm/assignments/FK - Electric/__init__.py +34 -0
  14. dancealgorithm/assignments/FK - Emergency/Solution.java +159 -0
  15. dancealgorithm/assignments/FK - Emergency/__init__.py +34 -0
  16. dancealgorithm/assignments/FK.txt +26 -0
  17. dancealgorithm/assignments/GC - Classroom/Solution.java +87 -0
  18. dancealgorithm/assignments/GC - Classroom/__init__.py +34 -0
  19. dancealgorithm/assignments/GC - Interference/Solution.java +88 -0
  20. dancealgorithm/assignments/GC - Interference/__init__.py +34 -0
  21. dancealgorithm/assignments/GC - University/Solution.java +88 -0
  22. dancealgorithm/assignments/GC - University/__init__.py +34 -0
  23. dancealgorithm/assignments/GC.txt +25 -0
  24. dancealgorithm/assignments/K - Cloud/Solution.java +115 -0
  25. dancealgorithm/assignments/K - Cloud/__init__.py +34 -0
  26. dancealgorithm/assignments/K - Disaster/Solution.java +116 -0
  27. dancealgorithm/assignments/K - Disaster/__init__.py +34 -0
  28. dancealgorithm/assignments/K - Hospital/Solution.java +115 -0
  29. dancealgorithm/assignments/K - Hospital/__init__.py +34 -0
  30. dancealgorithm/assignments/K.txt +38 -0
  31. dancealgorithm/assignments/LC - Delivery/Solution.java +180 -0
  32. dancealgorithm/assignments/LC - Delivery/__init__.py +34 -0
  33. dancealgorithm/assignments/LC - Drilling/Solution.java +197 -0
  34. dancealgorithm/assignments/LC - Drilling/__init__.py +34 -0
  35. dancealgorithm/assignments/LC - Flight/Solution.java +180 -0
  36. dancealgorithm/assignments/LC - Flight/__init__.py +34 -0
  37. dancealgorithm/assignments/LC.txt +31 -0
  38. dancealgorithm/assignments/MS - Commerce/Solution.java +162 -0
  39. dancealgorithm/assignments/MS - Commerce/__init__.py +34 -0
  40. dancealgorithm/assignments/MS - Commerce/dataset.csv +16 -0
  41. dancealgorithm/assignments/MS - Customer/Solution.java +144 -0
  42. dancealgorithm/assignments/MS - Customer/__init__.py +34 -0
  43. dancealgorithm/assignments/MS - Customer/dataset.csv +16 -0
  44. dancealgorithm/assignments/MS - Library/Solution.java +162 -0
  45. dancealgorithm/assignments/MS - Library/__init__.py +34 -0
  46. dancealgorithm/assignments/MS - Library/dataset.csv +16 -0
  47. dancealgorithm/assignments/MS.txt +32 -0
  48. dancealgorithm/assignments/MSG - Emergency/Solution.java +211 -0
  49. dancealgorithm/assignments/MSG - Emergency/__init__.py +34 -0
  50. dancealgorithm/assignments/MSG - Logistics/Solution.java +189 -0
  51. dancealgorithm/assignments/MSG - Logistics/__init__.py +34 -0
  52. dancealgorithm/assignments/MSG - Skyconnect/Solution.java +204 -0
  53. dancealgorithm/assignments/MSG - Skyconnect/__init__.py +34 -0
  54. dancealgorithm/assignments/MSG.txt +28 -0
  55. dancealgorithm/assignments/QS - Commerce/Solution.java +147 -0
  56. dancealgorithm/assignments/QS - Commerce/__init__.py +34 -0
  57. dancealgorithm/assignments/QS - Commerce/dataset.csv +16 -0
  58. dancealgorithm/assignments/QS - Movie/Solution.java +148 -0
  59. dancealgorithm/assignments/QS - Movie/__init__.py +34 -0
  60. dancealgorithm/assignments/QS - Movie/dataset.csv +16 -0
  61. dancealgorithm/assignments/QS - Online/Solution.java +147 -0
  62. dancealgorithm/assignments/QS - Online/__init__.py +34 -0
  63. dancealgorithm/assignments/QS - Online/dataset.csv +16 -0
  64. dancealgorithm/assignments/QS.txt +33 -0
  65. dancealgorithm/assignments/__init__.py +65 -0
  66. dancealgorithm/cli.py +349 -0
  67. dancealgorithm/config.py +125 -0
  68. dancealgorithm/downloader.py +330 -0
  69. dancealgorithm-0.1.0.dist-info/METADATA +199 -0
  70. dancealgorithm-0.1.0.dist-info/RECORD +74 -0
  71. dancealgorithm-0.1.0.dist-info/WHEEL +5 -0
  72. dancealgorithm-0.1.0.dist-info/entry_points.txt +3 -0
  73. dancealgorithm-0.1.0.dist-info/licenses/LICENSE +22 -0
  74. dancealgorithm-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,330 @@
1
+ """
2
+ Downloader and extractor engine for DanceAlgorithm.
3
+ Extracts bundled DAA assignments or synchronizes with remote GitHub repositories safely.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import io
9
+ import re
10
+ import shutil
11
+ import sys
12
+ import urllib.error
13
+ import urllib.request
14
+ import zipfile
15
+ from pathlib import Path
16
+ from typing import Dict, List, Optional, Tuple
17
+
18
+ USER_AGENT = "DanceAlgorithm-CLI/0.1.0"
19
+ MAX_ARCHIVE_SIZE_BYTES = 300 * 1024 * 1024 # 300 MB limit
20
+ MAX_FILE_COUNT = 10000 # 10,000 files limit
21
+
22
+ BUNDLED_DIR = Path(__file__).parent / "assignments"
23
+
24
+ ORDERED_ASSIGNMENTS = [
25
+ "MS - Customer", # 1
26
+ "MS - Commerce", # 2
27
+ "MS - Library", # 3
28
+ "QS - Movie", # 4
29
+ "QS - Commerce", # 5
30
+ "QS - Online", # 6
31
+ "FK - Emergency", # 7
32
+ "FK - Electric", # 8
33
+ "FK - Advertisement", # 9
34
+ "DA - Smart", # 10
35
+ "DA - Campus", # 11
36
+ "DA - Flight", # 12
37
+ "MSG - Logistics", # 13
38
+ "MSG - Skyconnect", # 14
39
+ "MSG - Emergency", # 15
40
+ "K - Disaster", # 16
41
+ "K - Hospital", # 17
42
+ "K - Cloud", # 18
43
+ "GC - Classroom", # 19
44
+ "GC - Interference", # 20
45
+ "GC - University", # 21
46
+ "LC - Delivery", # 22
47
+ "LC - Drilling", # 23
48
+ "LC - Flight", # 24
49
+ ]
50
+
51
+
52
+ class DanceAlgorithmError(Exception):
53
+ """Base exception for DanceAlgorithm operations."""
54
+ pass
55
+
56
+
57
+ def parse_repo_string(repo_str: str) -> Tuple[str, str]:
58
+ """Parse 'owner/repo' or GitHub URL into (owner, repo)."""
59
+ cleaned = repo_str.strip().rstrip("/")
60
+ if cleaned.startswith("https://github.com/"):
61
+ cleaned = cleaned[len("https://github.com/"):].rstrip(".git")
62
+ elif cleaned.startswith("http://github.com/"):
63
+ cleaned = cleaned[len("http://github.com/"):].rstrip(".git")
64
+
65
+ parts = cleaned.split("/")
66
+ if len(parts) != 2 or not parts[0] or not parts[1]:
67
+ raise DanceAlgorithmError(
68
+ f"Invalid repository format '{repo_str}'. Expected 'owner/repo'."
69
+ )
70
+ return parts[0], parts[1]
71
+
72
+
73
+ def extract_ps_number(name: str) -> Optional[int]:
74
+ """Extract leading problem sheet number (e.g. 'ps-1' -> 1, '10' -> 10)."""
75
+ m = re.search(r"^(?:ps)?[-_ ]*(\d+)", name.strip(), re.IGNORECASE)
76
+ if m:
77
+ return int(m.group(1))
78
+ return None
79
+
80
+
81
+ def normalize(s: str) -> str:
82
+ return (
83
+ s.strip().lower()
84
+ .replace("-", "")
85
+ .replace("_", "")
86
+ .replace(" ", "")
87
+ .replace("\u2013", "")
88
+ .replace("\u2014", "")
89
+ )
90
+
91
+
92
+ def matches_filter(first_segment: str, filter_norm: Optional[str]) -> bool:
93
+ """Normalize and match problem sheet identifiers (e.g. 13, MSG - Logistics, Logistics)."""
94
+ if not filter_norm:
95
+ return True
96
+
97
+ filter_str = filter_norm.strip()
98
+ filt_num = extract_ps_number(filter_str)
99
+
100
+ # Check numerical identifier (e.g. 13, ps13, ps-13)
101
+ if filt_num is not None and (filter_str.isdigit() or filter_str.lower().startswith("ps")):
102
+ if 1 <= filt_num <= len(ORDERED_ASSIGNMENTS):
103
+ target_name = ORDERED_ASSIGNMENTS[filt_num - 1]
104
+ if normalize(first_segment) == normalize(target_name):
105
+ return True
106
+
107
+ clean_segment = normalize(first_segment)
108
+ clean_filter = normalize(filter_str)
109
+
110
+ return clean_segment == clean_filter or clean_filter in clean_segment or clean_segment in clean_filter
111
+
112
+
113
+ def extract_bundled(
114
+ destination: Path,
115
+ subject_filter: Optional[str] = None,
116
+ overwrite: bool = True,
117
+ ) -> List[Path]:
118
+ """
119
+ Extract bundled problem sheets directly from the installed package
120
+ to the target destination folder cleanly and silently.
121
+ """
122
+ if not BUNDLED_DIR.exists():
123
+ raise DanceAlgorithmError("Bundled assignments directory not found inside package.")
124
+
125
+ destination = destination.expanduser().resolve()
126
+ destination.mkdir(parents=True, exist_ok=True)
127
+
128
+ extracted: List[Path] = []
129
+
130
+ for item in sorted(BUNDLED_DIR.iterdir()):
131
+ rel_name = item.name
132
+ if rel_name.startswith(".") or rel_name == "__pycache__":
133
+ continue
134
+
135
+ clean_item = normalize(rel_name)
136
+ clean_filt = normalize(subject_filter) if subject_filter else None
137
+
138
+ if item.is_file():
139
+ if subject_filter:
140
+ if clean_filt != clean_item and clean_filt not in clean_item:
141
+ continue
142
+ elif item.is_dir():
143
+ if subject_filter and not matches_filter(rel_name, subject_filter):
144
+ continue
145
+
146
+ target = destination / rel_name
147
+ if item.is_dir():
148
+ target.mkdir(parents=True, exist_ok=True)
149
+ for sub_file in item.rglob("*"):
150
+ if (
151
+ sub_file.name.startswith(".")
152
+ or "__pycache__" in sub_file.parts
153
+ or sub_file.name.endswith((".pyc", ".class"))
154
+ ):
155
+ continue
156
+ sub_rel = sub_file.relative_to(item)
157
+ sub_target = target / sub_rel
158
+ if sub_file.is_dir():
159
+ sub_target.mkdir(parents=True, exist_ok=True)
160
+ else:
161
+ sub_target.parent.mkdir(parents=True, exist_ok=True)
162
+ if sub_target.exists() and not overwrite:
163
+ continue
164
+ shutil.copy2(sub_file, sub_target)
165
+ extracted.append(sub_target)
166
+ else:
167
+ if target.exists() and not overwrite:
168
+ continue
169
+ shutil.copy2(item, target)
170
+ extracted.append(target)
171
+
172
+ return extracted
173
+
174
+
175
+ def fetch_archive(
176
+ owner: str,
177
+ repo: str,
178
+ branch: str = "main",
179
+ token: Optional[str] = None,
180
+ timeout: int = 60,
181
+ silent: bool = True,
182
+ ) -> bytes:
183
+ """Download zipball from GitHub."""
184
+ if token:
185
+ url = f"https://api.github.com/repos/{owner}/{repo}/zipball/{branch}"
186
+ headers = {
187
+ "User-Agent": USER_AGENT,
188
+ "Authorization": f"Bearer {token}",
189
+ "Accept": "application/vnd.github+json",
190
+ }
191
+ else:
192
+ url = f"https://codeload.github.com/{owner}/{repo}/zip/refs/heads/{branch}"
193
+ headers = {
194
+ "User-Agent": USER_AGENT,
195
+ "Accept": "*/*",
196
+ }
197
+
198
+ request = urllib.request.Request(url, headers=headers)
199
+
200
+ try:
201
+ with urllib.request.urlopen(request, timeout=timeout) as response:
202
+ chunks: List[bytes] = []
203
+ downloaded = 0
204
+ chunk_size = 64 * 1024
205
+
206
+ while True:
207
+ chunk = response.read(chunk_size)
208
+ if not chunk:
209
+ break
210
+ chunks.append(chunk)
211
+ downloaded += len(chunk)
212
+ if downloaded > MAX_ARCHIVE_SIZE_BYTES:
213
+ raise DanceAlgorithmError("Remote archive exceeds safety limit.")
214
+
215
+ return b"".join(chunks)
216
+
217
+ except urllib.error.HTTPError as e:
218
+ if e.code == 404:
219
+ raise DanceAlgorithmError(f"Repository or branch not found: '{owner}/{repo}'.") from e
220
+ elif e.code in (401, 403):
221
+ raise DanceAlgorithmError(f"Access denied ({e.code}) for '{owner}/{repo}'.") from e
222
+ else:
223
+ raise DanceAlgorithmError(f"HTTP Error {e.code} while connecting to GitHub.") from e
224
+ except urllib.error.URLError as e:
225
+ raise DanceAlgorithmError(f"Network error: {e.reason}") from e
226
+
227
+
228
+ def is_safe_path(target_path: Path, base_dir: Path) -> bool:
229
+ try:
230
+ target_path.resolve().relative_to(base_dir.resolve())
231
+ return True
232
+ except ValueError:
233
+ return False
234
+
235
+
236
+ def get_archive_root_prefix(archive: zipfile.ZipFile) -> str:
237
+ names = archive.namelist()
238
+ if not names:
239
+ return ""
240
+ first = names[0].split("/")[0]
241
+ prefix = f"{first}/"
242
+ if all(name.startswith(prefix) or name == first for name in names):
243
+ return prefix
244
+ return ""
245
+
246
+
247
+ def extract_archive(
248
+ archive_data: bytes,
249
+ destination: Path,
250
+ subject_filter: Optional[str] = None,
251
+ overwrite: bool = True,
252
+ ) -> List[Path]:
253
+ """Extract files safely and silently from remote zipball."""
254
+ try:
255
+ archive = zipfile.ZipFile(io.BytesIO(archive_data))
256
+ except zipfile.BadZipFile as e:
257
+ raise DanceAlgorithmError("Invalid archive payload.") from e
258
+
259
+ members = archive.infolist()
260
+ if len(members) > MAX_FILE_COUNT:
261
+ raise DanceAlgorithmError(f"Archive exceeds {MAX_FILE_COUNT} files limit.")
262
+
263
+ destination = destination.expanduser().resolve()
264
+ destination.mkdir(parents=True, exist_ok=True)
265
+
266
+ root_prefix = get_archive_root_prefix(archive)
267
+ extracted: List[Path] = []
268
+
269
+ for member in members:
270
+ filename = member.filename
271
+ rel_name = filename[len(root_prefix):] if root_prefix and filename.startswith(root_prefix) else filename
272
+ rel_name = rel_name.lstrip("/\\")
273
+
274
+ if not rel_name or rel_name.startswith(".git") or "__pycache__" in rel_name:
275
+ continue
276
+
277
+ first_seg = rel_name.split("/")[0]
278
+ if subject_filter and not matches_filter(first_seg, subject_filter):
279
+ continue
280
+
281
+ target_path = (destination / rel_name).resolve()
282
+ if not is_safe_path(target_path, destination):
283
+ raise DanceAlgorithmError(f"Illegal path traversal detected in '{filename}'.")
284
+
285
+ if member.is_dir():
286
+ target_path.mkdir(parents=True, exist_ok=True)
287
+ continue
288
+
289
+ target_path.parent.mkdir(parents=True, exist_ok=True)
290
+ if target_path.exists() and not overwrite:
291
+ continue
292
+
293
+ with archive.open(member) as src, open(target_path, "wb") as dst:
294
+ dst.write(src.read())
295
+
296
+ extracted.append(target_path)
297
+
298
+ return extracted
299
+
300
+
301
+ def inspect_archive(archive_data: bytes) -> Dict[str, List[str]]:
302
+ """Inspect archive without extracting."""
303
+ try:
304
+ archive = zipfile.ZipFile(io.BytesIO(archive_data))
305
+ except zipfile.BadZipFile as e:
306
+ raise DanceAlgorithmError("Invalid archive payload.") from e
307
+
308
+ root_prefix = get_archive_root_prefix(archive)
309
+ structure: Dict[str, List[str]] = {}
310
+
311
+ for member in archive.infolist():
312
+ rel_name = member.filename
313
+ if root_prefix and rel_name.startswith(root_prefix):
314
+ rel_name = rel_name[len(root_prefix):]
315
+
316
+ rel_name = rel_name.strip("/")
317
+ if not rel_name:
318
+ continue
319
+
320
+ parts = rel_name.split("/")
321
+ subject = parts[0] if len(parts) > 1 else "(Root)"
322
+ if member.is_dir():
323
+ if subject not in structure:
324
+ structure[subject] = []
325
+ continue
326
+
327
+ file_display = "/".join(parts[1:]) if len(parts) > 1 else parts[0]
328
+ structure.setdefault(subject, []).append(file_display)
329
+
330
+ return structure
@@ -0,0 +1,199 @@
1
+ Metadata-Version: 2.4
2
+ Name: dancealgorithm
3
+ Version: 0.1.0
4
+ Summary: DanceAlgorithm: Instant DAA Algorithms, Lab Problem Sheets, Datasets, and Code Vault.
5
+ Author: DanceAlgorithm Maintainer
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/AdityaxDeore/dancealgorithm
8
+ Keywords: dancealgorithm,daa,algorithms,problem-sheets,datasets,cli
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Environment :: Console
11
+ Classifier: Intended Audience :: Education
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Education
21
+ Requires-Python: >=3.9
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Dynamic: license-file
25
+
26
+ # ⚡ DanceAlgorithm
27
+
28
+ > **Instant DAA Problem Sheets, Datasets, Solutions & Algorithm Vault**
29
+ > Download, extract, organize, and directly **import** all 24 Design & Analysis of Algorithms (DAA) lab practical problem sheets, datasets, and Java solutions cleanly onto your PC with a single command or Python import.
30
+
31
+ [![PyPI Version](https://img.shields.io/pypi/v/dancealgorithm.svg)](https://pypi.org/project/dancealgorithm/)
32
+ [![Python Version](https://img.shields.io/badge/python-3.9%2B-blue.svg)](https://www.python.org/)
33
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
34
+ [![Zero Dependencies](https://img.shields.io/badge/dependencies-0%20runtime-brightgreen.svg)]()
35
+
36
+ ---
37
+
38
+ ## 🌟 The Magic Experience
39
+
40
+ ### Option A: Install & Extract All 24 Problem Sheets to `C:\DAA_Assignments`
41
+
42
+ ```powershell
43
+ pip install dancealgorithm; dance
44
+ ```
45
+
46
+ Or run `dance` (or `dancealgorithm`) anytime in your terminal:
47
+
48
+ ```powershell
49
+ dance
50
+ ```
51
+
52
+ Your `C:\DAA_Assignments` folder is cleanly populated with all 24 problem sheets:
53
+
54
+ ```text
55
+ C:\DAA_Assignments\
56
+ ├── MS - Customer/
57
+ │ ├── dataset.csv
58
+ │ └── Solution.java
59
+ ├── MS - Commerce/
60
+ │ ├── dataset.csv
61
+ │ └── Solution.java
62
+ ├── MS - Library/
63
+ ├── ...
64
+ └── LC - Flight/
65
+ └── Solution.java
66
+ ```
67
+
68
+ ---
69
+
70
+ ## 🚀 Quick Terminal CLI Usage
71
+
72
+ ### 1. View Algorithm Notes & Time Complexities directly on screen
73
+
74
+ No files extracted — instant terminal reference cheat sheets:
75
+
76
+ ```powershell
77
+ # Merge Sort recurrence & analysis
78
+ dance MS.txt
79
+
80
+ # Quick Sort partition & analysis
81
+ dance QS.txt
82
+
83
+ # Dijkstra shortest path analysis
84
+ dance DA.txt
85
+
86
+ # Graph Coloring backtracking analysis
87
+ dance GC.txt
88
+
89
+ # Fractional Knapsack greedy proof
90
+ dance FK.txt
91
+
92
+ # 0/1 Knapsack dynamic programming
93
+ dance K.txt
94
+
95
+ # Multistage Graph backward DP
96
+ dance MSG.txt
97
+
98
+ # Least Cost Branch & Bound TSP
99
+ dance LC.txt
100
+ ```
101
+
102
+ *(You can also use `dancealgorithm DA.txt` or `dance DA`)*
103
+
104
+ ### 2. Extract a Specific Assignment Folder
105
+
106
+ Extract only that particular folder:
107
+
108
+ ```powershell
109
+ # Extract unquoted or quoted
110
+ dance MSG - Logistics
111
+ dance "DA - Smart"
112
+ dance "GC - Classroom"
113
+ dance "MS - Customer"
114
+
115
+ # Or extract by problem number
116
+ dance 1
117
+ dance 13
118
+ dance 19
119
+ ```
120
+
121
+ ### 3. List All Available Problem Sheets & Notes
122
+
123
+ ```powershell
124
+ dance list
125
+ ```
126
+
127
+ ---
128
+
129
+ ## 🐍 Option B: Direct Python Import
130
+
131
+ All 24 assignments can be directly inspected or extracted programmatically:
132
+
133
+ ```python
134
+ import dancealgorithm
135
+
136
+ # 1. Access code directly
137
+ code = dancealgorithm.get("MSG - Logistics").code
138
+ print(code)
139
+
140
+ # 2. Extract a specific sheet
141
+ dancealgorithm.extract("MSG - Logistics")
142
+
143
+ # 3. Extract all sheets to custom destination
144
+ dancealgorithm.extract(destination="D:/MyLabs")
145
+
146
+ # 4. Open destination folder in Windows Explorer
147
+ dancealgorithm.open_folder()
148
+ ```
149
+
150
+ ---
151
+
152
+ ## 📚 Complete Catalogue of All 24 DAA Problem Sheets
153
+
154
+ | No. | Algorithm | Category | Problem Sheet Title | Time Complexity |
155
+ |---|---|---|---|---|
156
+ | **01** | Merge Sort | Divide & Conquer | `MS - Customer` | $O(n \log n)$ |
157
+ | **02** | Merge Sort | Divide & Conquer | `MS - Commerce` | $O(n \log n)$ |
158
+ | **03** | Merge Sort | Divide & Conquer | `MS - Library` | $O(n \log n)$ |
159
+ | **04** | Quick Sort | Divide & Conquer | `QS - Movie` | $O(n \log n)$ avg |
160
+ | **05** | Quick Sort | Divide & Conquer | `QS - Commerce` | $O(n \log n)$ avg |
161
+ | **06** | Quick Sort | Divide & Conquer | `QS - Online` | $O(n \log n)$ avg |
162
+ | **07** | Fractional Knapsack | Greedy Method | `FK - Emergency` | $O(n \log n)$ |
163
+ | **08** | Fractional Knapsack | Greedy Method | `FK - Electric` | $O(n \log n)$ |
164
+ | **09** | Fractional Knapsack | Greedy Method | `FK - Advertisement` | $O(n \log n)$ |
165
+ | **10** | Dijkstra | Shortest Path | `DA - Smart` | $O(V^2)$ / $O(E \log V)$ |
166
+ | **11** | Dijkstra | Shortest Path | `DA - Campus` | $O(V^2)$ / $O(E \log V)$ |
167
+ | **12** | Dijkstra | Shortest Path | `DA - Flight` | $O(V^2)$ / $O(E \log V)$ |
168
+ | **13** | Multistage Graph | Dynamic Programming | `MSG - Logistics` | $O(V + E)$ |
169
+ | **14** | Multistage Graph | Dynamic Programming | `MSG - Skyconnect` | $O(V + E)$ |
170
+ | **15** | Multistage Graph | Dynamic Programming | `MSG - Emergency` | $O(V + E)$ |
171
+ | **16** | 0/1 Knapsack | Dynamic Programming | `K - Disaster` | $O(n \cdot W)$ |
172
+ | **17** | 0/1 Knapsack | Dynamic Programming | `K - Hospital` | $O(n \cdot W)$ |
173
+ | **18** | 0/1 Knapsack | Dynamic Programming | `K - Cloud` | $O(n \cdot W)$ |
174
+ | **19** | Graph Coloring | Backtracking | `GC - Classroom` | $O(V \cdot m^V)$ |
175
+ | **20** | Graph Coloring | Backtracking | `GC - Interference` | $O(V \cdot m^V)$ |
176
+ | **21** | Graph Coloring | Backtracking | `GC - University` | $O(V \cdot m^V)$ |
177
+ | **22** | LC Branch & Bound | Branch & Bound | `LC - Delivery` | $O(n! \cdot n^2)$ |
178
+ | **23** | LC Branch & Bound | Branch & Bound | `LC - Drilling` | $O(n! \cdot n^2)$ |
179
+ | **24** | LC Branch & Bound | Branch & Bound | `LC - Flight` | $O(n! \cdot n^2)$ |
180
+
181
+ ---
182
+
183
+ ## ⚙️ Configuration
184
+
185
+ View or update your default preferences:
186
+
187
+ ```powershell
188
+ # Set custom destination folder
189
+ dance config --set-dest "D:\My_DAA_Folder"
190
+
191
+ # Reset configuration back to system defaults
192
+ dance config --reset
193
+ ```
194
+
195
+ ---
196
+
197
+ ## 📄 License
198
+
199
+ MIT © [AdityaxDeore](https://github.com/AdityaxDeore)
@@ -0,0 +1,74 @@
1
+ dancealgorithm/__init__.py,sha256=u_KM4uL0f9F5GxhC00KAV5-XmfR_lMU50mibk281UNI,3857
2
+ dancealgorithm/__main__.py,sha256=Px_fk89kMpM_i4FFCTSjlT220dqESkelRaJQQwhx_-c,146
3
+ dancealgorithm/cli.py,sha256=c8iLHbPfxXj7nByjj6S07rPP87nJZHjcWKBITOBRkKY,11400
4
+ dancealgorithm/config.py,sha256=DkKqK5KzWarrffRgOBXNMcP-6WO0plH7sWgRtJ_Clog,3469
5
+ dancealgorithm/downloader.py,sha256=jFCvpWGqfhwpMIEMTmT7ITc_PkWHH8rdNzBZo_34SIg,10860
6
+ dancealgorithm/assignments/DA.txt,sha256=ApbF0CgOHjkxpu1U3mz9eKAFmms4YQTCIXSCI0tmGHY,821
7
+ dancealgorithm/assignments/FK.txt,sha256=jkYwT6a9kHoLBGlqY49johxZ5nZ7hFvLB4rhO5Ta6Yc,677
8
+ dancealgorithm/assignments/GC.txt,sha256=QYL1Bo4oZC1btUjj7tZJi-Toh3uDE9klzYJGDp9at9g,788
9
+ dancealgorithm/assignments/K.txt,sha256=z_qzBXO6X_6-X8giUxMyPiJMzPKQHvzsLCd43gZ6RQM,881
10
+ dancealgorithm/assignments/LC.txt,sha256=_WYTS6tpfXrJzrTgnsRghdi9Etb-mYVmnMfxMaO5Mjc,1003
11
+ dancealgorithm/assignments/MS.txt,sha256=quWqxFLWwj1gI36ZiOHdOrlO5Ld4Lf6M6Z5BaLq8m84,773
12
+ dancealgorithm/assignments/MSG.txt,sha256=qAuQRPFpXe-mLN-RkPWRvLwFZg5hQfrxl68W5VQFzfs,785
13
+ dancealgorithm/assignments/QS.txt,sha256=Oca81yUqcWjDqgqG2wuZdeOKIgzocllmqTpdpVpKltg,779
14
+ dancealgorithm/assignments/__init__.py,sha256=EQFvc_SNf5X_fY3lbqHAfanUxcII36pqgys0jharpvc,1656
15
+ dancealgorithm/assignments/DA - Campus/Solution.java,sha256=PKc8isqiJQgLrf5BcCIorPNC-QtYrEzTaVUupIFFhHs,5958
16
+ dancealgorithm/assignments/DA - Campus/__init__.py,sha256=g_jTHTy5L0VHVTO2Nz5hvWg1WHxiGP822dwVNuBysTA,1108
17
+ dancealgorithm/assignments/DA - Flight/Solution.java,sha256=PqZW43eOeqCo6y6gBf42Rs--rNHAlVN7GypaCtvKz8w,6165
18
+ dancealgorithm/assignments/DA - Flight/__init__.py,sha256=4OGz7eoriu7FUsDWs2z6ReEenq-qSfPvf7N-l2cN4EY,1108
19
+ dancealgorithm/assignments/DA - Smart/Solution.java,sha256=rhYrq6UQMKKZ1BJ11agqgX2gSHJmS1_Gm3VDsKhDx4o,6602
20
+ dancealgorithm/assignments/DA - Smart/__init__.py,sha256=RzRxZqNsjOvVEfcf5hOqnZ_e7DLo7TuohMjyV2AGX3I,1107
21
+ dancealgorithm/assignments/FK - Advertisement/Solution.java,sha256=hWMEEfEEsOtVcZ6WGANoDatI9fCwTEsrUOX8CHxDWn4,4116
22
+ dancealgorithm/assignments/FK - Advertisement/__init__.py,sha256=RSKWvM2tmoZraQG_FphUFFp4YfIZV4pdZ7FpDXP4Flg,1115
23
+ dancealgorithm/assignments/FK - Electric/Solution.java,sha256=McdzpMtwOj7nogM2Dvs0D9VQjB9yNz-NfWpCHfRHJ3A,4919
24
+ dancealgorithm/assignments/FK - Electric/__init__.py,sha256=UJZPmKTkN1ATjNNtmSB5Dj3AcsJwMLdFcCWJMhSaApg,1110
25
+ dancealgorithm/assignments/FK - Emergency/Solution.java,sha256=VpDI36p3nvDmAgxCuAAouwe60U0m4GlPoWr1f3OLUJU,4376
26
+ dancealgorithm/assignments/FK - Emergency/__init__.py,sha256=kWhIIU_yJF_6Nk5flIxJS9GarRyPnIAZeXQLQjVygiI,1111
27
+ dancealgorithm/assignments/GC - Classroom/Solution.java,sha256=nBnUDMPPvjL_xadOaMH7SByugIZcW2QudFi_NbcSvJE,3192
28
+ dancealgorithm/assignments/GC - Classroom/__init__.py,sha256=rX1LESrGHL6iZ03bVc2o5hH7VmXgn3jNXSlCLGp3bAc,1111
29
+ dancealgorithm/assignments/GC - Interference/Solution.java,sha256=N_Hokbg8co3FzjcjCiFxZUiuCEGG7t_Nidja-3IuV6E,3223
30
+ dancealgorithm/assignments/GC - Interference/__init__.py,sha256=juUwLZkKfBKc9OZU6ab6SUIQp8xPNOcPa66xzl8focI,1114
31
+ dancealgorithm/assignments/GC - University/Solution.java,sha256=VNdxYE3M7IJ7d4CntPSeoIA0hEmhKMfR0w3zy1lhHz4,3224
32
+ dancealgorithm/assignments/GC - University/__init__.py,sha256=bDR-YOqxc2jId02Bi9K1CXnkslrgn1MWo62jJkfWfI4,1112
33
+ dancealgorithm/assignments/K - Cloud/Solution.java,sha256=YxfVvtj1z-oEnCJGLE9KW5piqOXXq-UyFY-Cw7rb4pQ,3651
34
+ dancealgorithm/assignments/K - Cloud/__init__.py,sha256=WYaHzteMikTCEtwUSdgxTNtQN9c-xBpGmO0d1PsuQWQ,1106
35
+ dancealgorithm/assignments/K - Disaster/Solution.java,sha256=MEtGgOqiwP9oWPnDszLGudaytwasHmcKlUp3utMcPl4,3647
36
+ dancealgorithm/assignments/K - Disaster/__init__.py,sha256=BvOOm6Y999ITjg91gIrKnnXwRwWv_ITMCwbbmy-d8mg,1109
37
+ dancealgorithm/assignments/K - Hospital/Solution.java,sha256=LrvcnmmErFjBs6y29e42JsIuu4JnZElFP3s-fTaAy7o,3737
38
+ dancealgorithm/assignments/K - Hospital/__init__.py,sha256=x7cka_hgSMmumPIn0EGXX8faYjKBBvb4I9un8B5BCj0,1109
39
+ dancealgorithm/assignments/LC - Delivery/Solution.java,sha256=179RRi8_wJLsVi1YjkrOeA2dnzrJILvSfi-1Vil_5qA,6080
40
+ dancealgorithm/assignments/LC - Delivery/__init__.py,sha256=2pmExK77gz_xeywyzdt2RH6ikSEdWpCyqtifrJ9NMog,1110
41
+ dancealgorithm/assignments/LC - Drilling/Solution.java,sha256=H6u8IsYGBXwJbk0IduW2Tya6XGeuCyGPqTgwWNW2vkg,6609
42
+ dancealgorithm/assignments/LC - Drilling/__init__.py,sha256=NpG_S3iUslbAEAjQlPXvBUv4W_V7KMv6K5ArEiE2DXs,1110
43
+ dancealgorithm/assignments/LC - Flight/Solution.java,sha256=xVKAGAALyPWNsAN3jbW73sfvrfyuw20ppq4QOW9tpuQ,6067
44
+ dancealgorithm/assignments/LC - Flight/__init__.py,sha256=dD5VTEZ6jQ8cwpXetqgrfdlw5ExaU_MOoxFqanxNriQ,1108
45
+ dancealgorithm/assignments/MS - Commerce/Solution.java,sha256=KZlxjeT0Zw1I06SnfsEfM5GJ-HFs8j4y5Nuoe5YaMmw,4457
46
+ dancealgorithm/assignments/MS - Commerce/__init__.py,sha256=_Og2__SdIC9OXNUwPWwQPUfzVjOHvw-jJQxMCQ3nzNY,1110
47
+ dancealgorithm/assignments/MS - Commerce/dataset.csv,sha256=zi5vDgC45LcQUMUumAJd1e7bUludJe6MtfI713BxCIY,720
48
+ dancealgorithm/assignments/MS - Customer/Solution.java,sha256=K4e3VgAbxIPT1FIw4QHxi7kXKiGX7CXFdCu2gJKhefA,3762
49
+ dancealgorithm/assignments/MS - Customer/__init__.py,sha256=L2jihdJcydHaz5IeekGgABV-1WZUJZNarhS12E81xeo,1110
50
+ dancealgorithm/assignments/MS - Customer/dataset.csv,sha256=RTEtOyoQPfL1sqCMiKY9gUs0LJfCPCKRtUaDddYOcvU,725
51
+ dancealgorithm/assignments/MS - Library/Solution.java,sha256=MlYVSxeMhB229rKGi_P2amtPpiTAKLrwnBEbn82jZnk,4214
52
+ dancealgorithm/assignments/MS - Library/__init__.py,sha256=PwyxPkWEfKRImJqYiPJYIvhiy7Y2fCn3ri6PhHfeZLQ,1109
53
+ dancealgorithm/assignments/MS - Library/dataset.csv,sha256=9qfxa3ipUxro7csXuEir0vnaOjeygrB4uhqYDgEI1sc,809
54
+ dancealgorithm/assignments/MSG - Emergency/Solution.java,sha256=218ZsZD1Jt8aeSOL4CGuYHTzQopCB9k8sJRKHU3M8I8,6347
55
+ dancealgorithm/assignments/MSG - Emergency/__init__.py,sha256=EGrYboXI3OIMfTvdNqAEiMA8SYMdcvQNU20madlC6Bg,1112
56
+ dancealgorithm/assignments/MSG - Logistics/Solution.java,sha256=m-H-p4oA_tiB0xfKahqfeVPkyUCTpw0499_pl6rp3Og,5167
57
+ dancealgorithm/assignments/MSG - Logistics/__init__.py,sha256=QR3INcprU-EihvjjS40ardyl7aVH6y_6uXLBt9kDL0c,1112
58
+ dancealgorithm/assignments/MSG - Skyconnect/Solution.java,sha256=uOToRaiothqxh8CwtRMbDcAkHSloSx3_TXa2FlvNLkQ,5983
59
+ dancealgorithm/assignments/MSG - Skyconnect/__init__.py,sha256=XBRcNh84nsk5FlB2VDIryblJwBcUraUsNCMOmEtdStY,1113
60
+ dancealgorithm/assignments/QS - Commerce/Solution.java,sha256=K_IXP___lnrGwUuy8jL3EjhMp8XGJLElWsWDkj1VZpY,3898
61
+ dancealgorithm/assignments/QS - Commerce/__init__.py,sha256=fmCnUx9kyB4y9GBXUPpMxq37l_lKYOYjltKTPWZvemg,1110
62
+ dancealgorithm/assignments/QS - Commerce/dataset.csv,sha256=_BXt-P7o4DMGM1FZ6Kdm42BmfIj7LbhGZw9L-o5SSxk,634
63
+ dancealgorithm/assignments/QS - Movie/Solution.java,sha256=jhekIeomEkmB6V23gLE00ZxWfHSFoqvyYlzDCiw2ll8,3848
64
+ dancealgorithm/assignments/QS - Movie/__init__.py,sha256=H6aq5DyaJpVqzIEXiGfkqbZ501bkEkIS2bnaYeDtFi4,1107
65
+ dancealgorithm/assignments/QS - Movie/dataset.csv,sha256=rsnfsXCCQWrRfNEB_lUdNWi6W8JKNNwUUZ3B2VFaRXw,480
66
+ dancealgorithm/assignments/QS - Online/Solution.java,sha256=A8bALrw4QDgazRTUKpYZ1nBr1rVXezoFWjnvSQKHk_I,3747
67
+ dancealgorithm/assignments/QS - Online/__init__.py,sha256=JrcTPkZ5WvNdZM-_9Uv3cgPOdBCEnlK11raTpDCXr4Y,1108
68
+ dancealgorithm/assignments/QS - Online/dataset.csv,sha256=jLrUusfK5fqLRT9ZmJKZPDZ5s2Zw94JixGrKJGoGHNc,631
69
+ dancealgorithm-0.1.0.dist-info/licenses/LICENSE,sha256=eE9Hj40DYTIwVR4OoOhSuK0sijGtFXOK9_atK1Lz6-A,1083
70
+ dancealgorithm-0.1.0.dist-info/METADATA,sha256=qJ9C6wzyvZkDoU_dvQnM4nhFdXHMSvYDb-ItOeeeyn4,6479
71
+ dancealgorithm-0.1.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
72
+ dancealgorithm-0.1.0.dist-info/entry_points.txt,sha256=y31VtV8oOHRSQbU5bVTxqQndGGOyRCOaK_Cmd9bUcyI,91
73
+ dancealgorithm-0.1.0.dist-info/top_level.txt,sha256=gst6Jq05KzE4EKbhCzRDSKtchmLdmeYDIqlqry342lM,15
74
+ dancealgorithm-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.2.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ dance = dancealgorithm.cli:main
3
+ dancealgorithm = dancealgorithm.cli:main
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 DanceAlgorithm Maintainer
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
@@ -0,0 +1 @@
1
+ dancealgorithm