Skip to content

Commit dad9366

Browse files
authored
Merge branch 'TheAlgorithms:master' into master
2 parents 7cb52b5 + ebfdb12 commit dad9366

File tree

5 files changed

+171
-3
lines changed

5 files changed

+171
-3
lines changed

Diff for: .pre-commit-config.yaml

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ repos:
1616
- id: auto-walrus
1717

1818
- repo: https://github.com/astral-sh/ruff-pre-commit
19-
rev: v0.1.1
19+
rev: v0.1.3
2020
hooks:
2121
- id: ruff
2222

2323
- repo: https://github.com/psf/black
24-
rev: 23.10.0
24+
rev: 23.10.1
2525
hooks:
2626
- id: black
2727

@@ -33,7 +33,7 @@ repos:
3333
- tomli
3434

3535
- repo: https://github.com/tox-dev/pyproject-fmt
36-
rev: "1.2.0"
36+
rev: "1.3.0"
3737
hooks:
3838
- id: pyproject-fmt
3939

Diff for: data_structures/hashing/hash_map.py

+33
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,25 @@ def __delitem__(self, key: KEY) -> None:
242242
self._size_down()
243243

244244
def __getitem__(self, key: KEY) -> VAL:
245+
"""
246+
Returns the item at the given key
247+
248+
>>> hm = HashMap(5)
249+
>>> hm._add_item(1, 10)
250+
>>> hm.__getitem__(1)
251+
10
252+
253+
>>> hm = HashMap(5)
254+
>>> hm._add_item(10, -10)
255+
>>> hm._add_item(20, -20)
256+
>>> hm.__getitem__(20)
257+
-20
258+
259+
>>> hm = HashMap(5)
260+
>>> hm._add_item(-1, 10)
261+
>>> hm.__getitem__(-1)
262+
10
263+
"""
245264
for ind in self._iterate_buckets(key):
246265
item = self._buckets[ind]
247266
if item is None:
@@ -253,6 +272,20 @@ def __getitem__(self, key: KEY) -> VAL:
253272
raise KeyError(key)
254273

255274
def __len__(self) -> int:
275+
"""
276+
Returns the number of items present in hashmap
277+
278+
>>> hm = HashMap(5)
279+
>>> hm._add_item(1, 10)
280+
>>> hm._add_item(2, 20)
281+
>>> hm._add_item(3, 30)
282+
>>> hm.__len__()
283+
3
284+
285+
>>> hm = HashMap(5)
286+
>>> hm.__len__()
287+
0
288+
"""
256289
return self._len
257290

258291
def __iter__(self) -> Iterator[KEY]:

Diff for: maths/special_numbers/happy_number.py

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
def is_happy_number(number: int) -> bool:
2+
"""
3+
A happy number is a number which eventually reaches 1 when replaced by the sum of
4+
the square of each digit.
5+
6+
:param number: The number to check for happiness.
7+
:return: True if the number is a happy number, False otherwise.
8+
9+
>>> is_happy_number(19)
10+
True
11+
>>> is_happy_number(2)
12+
False
13+
>>> is_happy_number(23)
14+
True
15+
>>> is_happy_number(1)
16+
True
17+
>>> is_happy_number(0)
18+
Traceback (most recent call last):
19+
...
20+
ValueError: number=0 must be a positive integer
21+
>>> is_happy_number(-19)
22+
Traceback (most recent call last):
23+
...
24+
ValueError: number=-19 must be a positive integer
25+
>>> is_happy_number(19.1)
26+
Traceback (most recent call last):
27+
...
28+
ValueError: number=19.1 must be a positive integer
29+
>>> is_happy_number("happy")
30+
Traceback (most recent call last):
31+
...
32+
ValueError: number='happy' must be a positive integer
33+
"""
34+
if not isinstance(number, int) or number <= 0:
35+
msg = f"{number=} must be a positive integer"
36+
raise ValueError(msg)
37+
38+
seen = set()
39+
while number != 1 and number not in seen:
40+
seen.add(number)
41+
number = sum(int(digit) ** 2 for digit in str(number))
42+
return number == 1
43+
44+
45+
if __name__ == "__main__":
46+
import doctest
47+
48+
doctest.testmod()

Diff for: matrix/validate_sudoku_board.py

+60
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,66 @@ def is_valid_sudoku_board(sudoku_board: list[list[str]]) -> bool:
5454
... ,[".",".",".",".","8",".",".","7","9"]
5555
... ])
5656
False
57+
>>> is_valid_sudoku_board([
58+
... ["1","2","3","4","5","6","7","8","9"]
59+
... ,["4","5","6","7","8","9","1","2","3"]
60+
... ,["7","8","9","1","2","3","4","5","6"]
61+
... ,[".",".",".",".",".",".",".",".","."]
62+
... ,[".",".",".",".",".",".",".",".","."]
63+
... ,[".",".",".",".",".",".",".",".","."]
64+
... ,[".",".",".",".",".",".",".",".","."]
65+
... ,[".",".",".",".",".",".",".",".","."]
66+
... ,[".",".",".",".",".",".",".",".","."]
67+
... ])
68+
True
69+
>>> is_valid_sudoku_board([
70+
... ["1","2","3",".",".",".",".",".","."]
71+
... ,["4","5","6",".",".",".",".",".","."]
72+
... ,["7","8","9",".",".",".",".",".","."]
73+
... ,[".",".",".","4","5","6",".",".","."]
74+
... ,[".",".",".","7","8","9",".",".","."]
75+
... ,[".",".",".","1","2","3",".",".","."]
76+
... ,[".",".",".",".",".",".","7","8","9"]
77+
... ,[".",".",".",".",".",".","1","2","3"]
78+
... ,[".",".",".",".",".",".","4","5","6"]
79+
... ])
80+
True
81+
>>> is_valid_sudoku_board([
82+
... ["1","2","3",".",".",".","5","6","4"]
83+
... ,["4","5","6",".",".",".","8","9","7"]
84+
... ,["7","8","9",".",".",".","2","3","1"]
85+
... ,[".",".",".","4","5","6",".",".","."]
86+
... ,[".",".",".","7","8","9",".",".","."]
87+
... ,[".",".",".","1","2","3",".",".","."]
88+
... ,["3","1","2",".",".",".","7","8","9"]
89+
... ,["6","4","5",".",".",".","1","2","3"]
90+
... ,["9","7","8",".",".",".","4","5","6"]
91+
... ])
92+
True
93+
>>> is_valid_sudoku_board([
94+
... ["1","2","3","4","5","6","7","8","9"]
95+
... ,["2",".",".",".",".",".",".",".","8"]
96+
... ,["3",".",".",".",".",".",".",".","7"]
97+
... ,["4",".",".",".",".",".",".",".","6"]
98+
... ,["5",".",".",".",".",".",".",".","5"]
99+
... ,["6",".",".",".",".",".",".",".","4"]
100+
... ,["7",".",".",".",".",".",".",".","3"]
101+
... ,["8",".",".",".",".",".",".",".","2"]
102+
... ,["9","8","7","6","5","4","3","2","1"]
103+
... ])
104+
False
105+
>>> is_valid_sudoku_board([
106+
... ["1","2","3","8","9","7","5","6","4"]
107+
... ,["4","5","6","2","3","1","8","9","7"]
108+
... ,["7","8","9","5","6","4","2","3","1"]
109+
... ,["2","3","1","4","5","6","9","7","8"]
110+
... ,["5","6","4","7","8","9","3","1","2"]
111+
... ,["8","9","7","1","2","3","6","4","5"]
112+
... ,["3","1","2","6","4","5","7","8","9"]
113+
... ,["6","4","5","9","7","8","1","2","3"]
114+
... ,["9","7","8","3","1","2","4","5","6"]
115+
... ])
116+
True
57117
>>> is_valid_sudoku_board([["1", "2", "3", "4", "5", "6", "7", "8", "9"]])
58118
Traceback (most recent call last):
59119
...

Diff for: sorts/intro_sort.py

+27
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,18 @@ def insertion_sort(array: list, start: int = 0, end: int = 0) -> list:
1111
>>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12]
1212
>>> insertion_sort(array, 0, len(array))
1313
[1, 2, 4, 6, 7, 8, 8, 12, 14, 14, 22, 23, 27, 45, 56, 79]
14+
>>> array = [21, 15, 11, 45, -2, -11, 46]
15+
>>> insertion_sort(array, 0, len(array))
16+
[-11, -2, 11, 15, 21, 45, 46]
17+
>>> array = [-2, 0, 89, 11, 48, 79, 12]
18+
>>> insertion_sort(array, 0, len(array))
19+
[-2, 0, 11, 12, 48, 79, 89]
20+
>>> array = ['a', 'z', 'd', 'p', 'v', 'l', 'o', 'o']
21+
>>> insertion_sort(array, 0, len(array))
22+
['a', 'd', 'l', 'o', 'o', 'p', 'v', 'z']
23+
>>> array = [73.568, 73.56, -45.03, 1.7, 0, 89.45]
24+
>>> insertion_sort(array, 0, len(array))
25+
[-45.03, 0, 1.7, 73.56, 73.568, 89.45]
1426
"""
1527
end = end or len(array)
1628
for i in range(start, end):
@@ -47,6 +59,12 @@ def heap_sort(array: list) -> list:
4759
"""
4860
>>> heap_sort([4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12])
4961
[1, 2, 4, 6, 7, 8, 8, 12, 14, 14, 22, 23, 27, 45, 56, 79]
62+
>>> heap_sort([-2, -11, 0, 0, 0, 87, 45, -69, 78, 12, 10, 103, 89, 52])
63+
[-69, -11, -2, 0, 0, 0, 10, 12, 45, 52, 78, 87, 89, 103]
64+
>>> heap_sort(['b', 'd', 'e', 'f', 'g', 'p', 'x', 'z', 'b', 's', 'e', 'u', 'v'])
65+
['b', 'b', 'd', 'e', 'e', 'f', 'g', 'p', 's', 'u', 'v', 'x', 'z']
66+
>>> heap_sort([6.2, -45.54, 8465.20, 758.56, -457.0, 0, 1, 2.879, 1.7, 11.7])
67+
[-457.0, -45.54, 0, 1, 1.7, 2.879, 6.2, 11.7, 758.56, 8465.2]
5068
"""
5169
n = len(array)
5270

@@ -91,6 +109,15 @@ def partition(array: list, low: int, high: int, pivot: int) -> int:
91109
>>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12]
92110
>>> partition(array, 0, len(array), 12)
93111
8
112+
>>> array = [21, 15, 11, 45, -2, -11, 46]
113+
>>> partition(array, 0, len(array), 15)
114+
3
115+
>>> array = ['a', 'z', 'd', 'p', 'v', 'l', 'o', 'o']
116+
>>> partition(array, 0, len(array), 'p')
117+
5
118+
>>> array = [6.2, -45.54, 8465.20, 758.56, -457.0, 0, 1, 2.879, 1.7, 11.7]
119+
>>> partition(array, 0, len(array), 2.879)
120+
6
94121
"""
95122
i = low
96123
j = high

0 commit comments

Comments
 (0)