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.
- dancealgorithm/__init__.py +128 -0
- dancealgorithm/__main__.py +8 -0
- dancealgorithm/assignments/DA - Campus/Solution.java +198 -0
- dancealgorithm/assignments/DA - Campus/__init__.py +34 -0
- dancealgorithm/assignments/DA - Flight/Solution.java +204 -0
- dancealgorithm/assignments/DA - Flight/__init__.py +34 -0
- dancealgorithm/assignments/DA - Smart/Solution.java +220 -0
- dancealgorithm/assignments/DA - Smart/__init__.py +34 -0
- dancealgorithm/assignments/DA.txt +29 -0
- dancealgorithm/assignments/FK - Advertisement/Solution.java +141 -0
- dancealgorithm/assignments/FK - Advertisement/__init__.py +34 -0
- dancealgorithm/assignments/FK - Electric/Solution.java +168 -0
- dancealgorithm/assignments/FK - Electric/__init__.py +34 -0
- dancealgorithm/assignments/FK - Emergency/Solution.java +159 -0
- dancealgorithm/assignments/FK - Emergency/__init__.py +34 -0
- dancealgorithm/assignments/FK.txt +26 -0
- dancealgorithm/assignments/GC - Classroom/Solution.java +87 -0
- dancealgorithm/assignments/GC - Classroom/__init__.py +34 -0
- dancealgorithm/assignments/GC - Interference/Solution.java +88 -0
- dancealgorithm/assignments/GC - Interference/__init__.py +34 -0
- dancealgorithm/assignments/GC - University/Solution.java +88 -0
- dancealgorithm/assignments/GC - University/__init__.py +34 -0
- dancealgorithm/assignments/GC.txt +25 -0
- dancealgorithm/assignments/K - Cloud/Solution.java +115 -0
- dancealgorithm/assignments/K - Cloud/__init__.py +34 -0
- dancealgorithm/assignments/K - Disaster/Solution.java +116 -0
- dancealgorithm/assignments/K - Disaster/__init__.py +34 -0
- dancealgorithm/assignments/K - Hospital/Solution.java +115 -0
- dancealgorithm/assignments/K - Hospital/__init__.py +34 -0
- dancealgorithm/assignments/K.txt +38 -0
- dancealgorithm/assignments/LC - Delivery/Solution.java +180 -0
- dancealgorithm/assignments/LC - Delivery/__init__.py +34 -0
- dancealgorithm/assignments/LC - Drilling/Solution.java +197 -0
- dancealgorithm/assignments/LC - Drilling/__init__.py +34 -0
- dancealgorithm/assignments/LC - Flight/Solution.java +180 -0
- dancealgorithm/assignments/LC - Flight/__init__.py +34 -0
- dancealgorithm/assignments/LC.txt +31 -0
- dancealgorithm/assignments/MS - Commerce/Solution.java +162 -0
- dancealgorithm/assignments/MS - Commerce/__init__.py +34 -0
- dancealgorithm/assignments/MS - Commerce/dataset.csv +16 -0
- dancealgorithm/assignments/MS - Customer/Solution.java +144 -0
- dancealgorithm/assignments/MS - Customer/__init__.py +34 -0
- dancealgorithm/assignments/MS - Customer/dataset.csv +16 -0
- dancealgorithm/assignments/MS - Library/Solution.java +162 -0
- dancealgorithm/assignments/MS - Library/__init__.py +34 -0
- dancealgorithm/assignments/MS - Library/dataset.csv +16 -0
- dancealgorithm/assignments/MS.txt +32 -0
- dancealgorithm/assignments/MSG - Emergency/Solution.java +211 -0
- dancealgorithm/assignments/MSG - Emergency/__init__.py +34 -0
- dancealgorithm/assignments/MSG - Logistics/Solution.java +189 -0
- dancealgorithm/assignments/MSG - Logistics/__init__.py +34 -0
- dancealgorithm/assignments/MSG - Skyconnect/Solution.java +204 -0
- dancealgorithm/assignments/MSG - Skyconnect/__init__.py +34 -0
- dancealgorithm/assignments/MSG.txt +28 -0
- dancealgorithm/assignments/QS - Commerce/Solution.java +147 -0
- dancealgorithm/assignments/QS - Commerce/__init__.py +34 -0
- dancealgorithm/assignments/QS - Commerce/dataset.csv +16 -0
- dancealgorithm/assignments/QS - Movie/Solution.java +148 -0
- dancealgorithm/assignments/QS - Movie/__init__.py +34 -0
- dancealgorithm/assignments/QS - Movie/dataset.csv +16 -0
- dancealgorithm/assignments/QS - Online/Solution.java +147 -0
- dancealgorithm/assignments/QS - Online/__init__.py +34 -0
- dancealgorithm/assignments/QS - Online/dataset.csv +16 -0
- dancealgorithm/assignments/QS.txt +33 -0
- dancealgorithm/assignments/__init__.py +65 -0
- dancealgorithm/cli.py +349 -0
- dancealgorithm/config.py +125 -0
- dancealgorithm/downloader.py +330 -0
- dancealgorithm-0.1.0.dist-info/METADATA +199 -0
- dancealgorithm-0.1.0.dist-info/RECORD +74 -0
- dancealgorithm-0.1.0.dist-info/WHEEL +5 -0
- dancealgorithm-0.1.0.dist-info/entry_points.txt +3 -0
- dancealgorithm-0.1.0.dist-info/licenses/LICENSE +22 -0
- 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
|
+
[](https://pypi.org/project/dancealgorithm/)
|
|
32
|
+
[](https://www.python.org/)
|
|
33
|
+
[](https://opensource.org/licenses/MIT)
|
|
34
|
+
[]()
|
|
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,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
|