Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
455 changes: 442 additions & 13 deletions .idea/study_project.xml

Large diffs are not rendered by default.

7 changes: 4 additions & 3 deletions 5_Trees/Heap/task.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
<html>
الگوریتمی در زمان خطی طرح کنید؛ که با دریافت ارایه یک هرم بیشبنه، هرم کمینه معادل را در خروجی قرار دهد.
Write your task text here.
<br>
<br>

<div class="hint">
You can add hints anywhere in task text. Copy all hint div block and change its content.
</div>
</html>
</html>
47 changes: 4 additions & 43 deletions 5_Trees/Trie/task.html
Original file line number Diff line number Diff line change
@@ -1,47 +1,8 @@
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>Trie Task 1</title>
<script type="text/javascript" async
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML" async>
</script>
</head>
<body dir="rtl">
<p >
در این task، آرابه A از n عدد به شما داده میشود. فرض کنید تابعی مانند XOR_ARRAY داریم به طوریکه دو اندیس L و R به عنوان وروری میگیرد و در خروجی XOR عناصر A از اندیس L تا R (با احتساب خودِ L و R) میدهد.
شما باید تابع main را طوری تکمیل کنید که ماکسیموم تابع
</p>
<p dir="ltr">
XOR_Array(L,R)
</p>
به ازای تمامی
<p dir="ltr">
\(L \le R\)
</p>
را return کند.<hr>

محدودیت ها:
<p dir="ltr">
\(n < 3 \times 10^3 \) <br>
\(A[i] < 10^9 \)
</p>
<hr>
ورودی نمونه:
<p dir="ltr">
n = 5<br>
A = [3, 7, 7, 7, 0]
</p>
خروجی نمونه:
<p dir="ltr">
7
</p>
Write your task text here.
<br>
<br>
<div class="hint">
توجه کنید که میتوان XOR_ARRAY را به صورت زیر حساب کرد:
<p dir="ltr">
XOR_ARRAY(L , R) = XOR( XOR_ARRAY(1, R) , XOR_ARRAY(1, L-1))
</p>
You can add hints anywhere in task text. Copy all hint div block and change its content.
</div>
</body>
</html>
</html>
25 changes: 3 additions & 22 deletions 6_Binary Search - K Select/K Select/task.html
Original file line number Diff line number Diff line change
@@ -1,27 +1,8 @@
<html>
پیش‌نیاز: ابتدا جزوهٔ درس را به دقت مطالعه کنید. پس از آن برای پاسخ‌گویی به این تسک لطفا دیگر به جزوه و کدهای آن
مراجعه نکنید.
Write your task text here.
<br>
complete find_kth() to find kth smallest element of two arrays.
<br>
<div class="hint">
ابتدا سعی کنید با استفاده از مرتب‌سازی و ادغام مسئله را حل کنید.
You can add hints anywhere in task text. Copy all hint div block and change its content.
</div>
پیچیدگی زمانی این راه‌حل چقدر است؟
<div class="hint">
n: length of longer array
<br>
Time Complexity: O(n*lg(n))
</div>
<div class="hint">
حال برای کاهش مدت زمان اجرای الگوریتم از انتخاب سریع استفاده کنید.
</div>
<div class="hint">
برای کاهش پیچیدگی حافظه سعی کنید الگوریتم را به صورت درجا پیاده‌سازی کنید.
</div>
پیچیدگی زمانی این راه‌حل چقدر است؟
<div class="hint">
Average Time Complexity: O(n)<br>
Worst case Time Complexity: O(n^2)
</div>
</html>
</html>
56 changes: 0 additions & 56 deletions 7_Hashing/Task 1(Part 1)/hash_table.py

This file was deleted.

56 changes: 36 additions & 20 deletions 7_Hashing/Task 1(Part 1)/task.html
Original file line number Diff line number Diff line change
@@ -1,22 +1,38 @@
<html>
Prerequisite: <br>
Read the hashing notebook.<br><br>

Task: <br>
Complete the function answer. Given an array of integers arr your
function has to check if there exist four elements in the array such that
they add up to a specific value k. Return a 4-tuple such that its elements
add up to k if there exists such a 4-tuple and None otherwise. If there are
more than one 4-tuple satisfying that condition, return one of them.<br>
Please note that if you want to use a hash table, you can't use python's
dictionary and you should implement your own.
<br>
<br>

Limitations: <br>
Array size is not greater than 10^3 <br>
Array's elements are positive integers less than 10^12<br>
<div class="hint">
An optimized algorithm can run in O(n^2)
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8">
</head>
<body>
یکی از روش‌های تشخیص ایرادات تایپی (typoها) در متون و پیشنهاد کلمه‌های جایگزین
استفاده از جدول درهم‌ سازیست. در این سوال می‌خواهیم که یک مدل ساده برنامه spell checker
را پیاده سازی کنیم.<br>
شما باید پیاده سازی توابع setup و suggestions را کامل کنید. تابع setup
یکبار در ابتدای برنامه صدا زده می‌شود و کل کلمات صحیح موجود در دیکشنری
به عنوان ورودی به آن داده می‌شود. پس از صدا زدن تابع setup، با هر بار صدا زدن
تابع suggestions این تابع باید یک دوتایی برگرداند که مقدار اول آن True است در صورتیکه
تایپ کلمه صحیح باشد(کلمه در دیکشنری موجود باشد) و در غیر اینصورت false است.
مقدار دوم این دوتایی درصورتی که در کلمه غلط نگراشی موجود نبود یک مجموعه تهی
و در غیر این صورت مجموعه‌ای از کلمات مشابه آن کلمه است. یک کلمه مشابه کلمه‌ای است که نسبت
به کلمه ورودی دقیقا یک کارکتر بیشتر یا دقیقا یک کاراکتر کمتر داشته باشد
یا اگر تعداد کاراکترها یکی بود در دقیقا یک کارکتر متفاوت باشند.
ترتیب کلمات در لیست خروجی اهمیتی ندارند. برای درک بهتر
به مثال مراجعه کنید.<br><br>
مثال:<br>
فرض کنید تابع setup با ورودی {'hello', 'bye', 'salaam', 'salam'} صدا زده شود
سپس خروجی هرکدام از توابع زیر، به شکل زیر است.<br>
<div dir="ltr">
suggestions("bye")<br>
suggestions("hallo")<br>
suggestions("hablo")<br>
suggestions("salaa")<br>
suggestions("aye")<br>
Output:<br>
(True, set())<br>
(False, {"hello"})<br>
(False, set())<br>
(False, {"salaam", "salam"})<br>
(False, {"bye"})<br>
</div>
</body>
</html>
43 changes: 30 additions & 13 deletions 7_Hashing/Task 1(Part 1)/task.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,30 @@
from hash_table import HashTable


def answer(arr, k):
table = HashTable(1000003)
for i in range(len(arr)):
for j in range(i + 1, len(arr)):
pair = table.get(k - arr[i] - arr[j])
if pair is not None:
if i not in pair and j not in pair:
return (arr[i], arr[j]) + table.get(k - arr[i] - arr[j])
table.insert(arr[i] + arr[j], (arr[i], arr[j]))
return None
import string


def setup(dictionary):
global words
words = set(dictionary)


def suggestions(word):
result = set()
is_legit = word in words
if not is_legit:
# add char
for i in range(len(word) + 1):
for char in string.ascii_lowercase:
possible = word[:i] + char + word[i:]
if possible in words:
result.add(possible)
# remove char
for i in range(len(word)):
possible = word[:i] + word[i + 1:]
if possible in words:
result.add(possible)
# change char
for i in range(len(word)):
for char in string.ascii_lowercase:
possible = word[:i] + char + word[i + 1:]
if possible in words:
result.add(possible)
return is_legit, result
66 changes: 39 additions & 27 deletions 7_Hashing/Task 1(Part 1)/tests.py
Original file line number Diff line number Diff line change
@@ -1,36 +1,48 @@
import task
import random
from task import answer
import string
from time_limit import put_limit
from test_helper import failed


def solution(arr, k):
sums = {}
for i in range(len(arr)):
for j in range(i + 1, len(arr)):
if k - arr[i] - arr[j] in sums:
return (arr[i], arr[j]) + sums[k - arr[i] - arr[j]]
sums[arr[i] + arr[j]] = (arr[i], arr[j])
return None
def sol_setup(dictionary):
global words
words = set(dictionary)


def generate_test():
return [random.randint(0, 10 ** 12) for i in range(random.randint(10, 1000))]
def sol_suggestions(word):
result = set()
is_legit = word in words
if not is_legit:
# add char
for i in range(len(word) + 1):
for char in string.ascii_lowercase:
possible = word[:i] + char + word[i:]
if possible in words:
result.add(possible)
# remove char
for i in range(len(word)):
possible = word[:i] + word[i + 1:]
if possible in words:
result.add(possible)
# change char
for i in range(len(word)):
for char in string.ascii_lowercase:
possible = word[:i] + char + word[i + 1:]
if possible in words:
result.add(possible)
return is_legit, result


if __name__ == '__main__':
for i in range(5):
arr = generate_test()
values = random.sample(arr, 4)
result = answer(arr, sum(values))
if result is None or len(set(result)) < 4 or sum(result) != sum(values):
failed()
for i in range(3):
arr = generate_test()
value = random.randint(0, 10 ** 12)
result = answer(arr, value)
ans = solution(arr, value)
if ans is None != result is None:
failed()
elif ans is not None:
if len(set(result)) < 4 or sum(result) != sum(ans):
failed()
put_limit(10)
try:
dic = {''.join(random.choice(string.ascii_lowercase) for _ in range(random.randint(1, 50))) for _ in range(10000)}
test = {''.join(random.choice(string.ascii_lowercase) for _ in range(random.randint(1, 10))) for _ in range(10000)}
task.setup(dic)
sol_setup(dic)
for word in test:
if task.suggestions(word) != sol_suggestions(word):
failed("Wrong Answer!")
except Exception:
failed("Timed Out!")
10 changes: 10 additions & 0 deletions 7_Hashing/Task 1(Part 1)/time_limit.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import signal


def signal_handler(signum, frame):
raise Exception("Timed out!")


def put_limit(time):
signal.signal(signal.SIGALRM, signal_handler)
signal.alarm(time)
19 changes: 19 additions & 0 deletions 7_Hashing/Task 2(Part 1)/hash_table.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
class HashTable:

def __init__(self, size):
self._size = size
self._table = [[] for _ in range(size)]

def _hash(self, key):
return key % self._size

def insert(self, key, value):
key_hash = self._hash(key)
self._table[key_hash].append((key, value))

def get(self, key):
key_hash = self._hash(key)
for pair in self._table[key_hash]:
if key == pair[0]:
return pair[1]
return None
Loading