From 3ba96f05e59c0045443abff750fd05427d41349f Mon Sep 17 00:00:00 2001 From: Sedat Aybars Nazlica Date: Mon, 13 Jun 2022 22:00:59 +0900 Subject: [PATCH 1/4] Add hamming distance --- strings/hamming_distance.py | 41 +++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 strings/hamming_distance.py diff --git a/strings/hamming_distance.py b/strings/hamming_distance.py new file mode 100644 index 000000000000..03b8beac3a90 --- /dev/null +++ b/strings/hamming_distance.py @@ -0,0 +1,41 @@ +def hamming_distance(string1: str, string2: str) -> int: + """Calculate the Hamming distance between two equal length strings + In information theory, the Hamming distance between two strings of equal + length is the number of positions at which the corresponding symbols are + different. https://en.wikipedia.org/wiki/Hamming_distance + + Args: + string1 (str): Sequence 1 + string2 (str): Sequence 2 + + Returns: + int: Hamming distance + + >>> hamming_distance("python", "python") + 0 + >>> hamming_distance("karolin", "kathrin") + 3 + >>> hamming_distance("00000", "11111") + 5 + """ + assert len(string1) == len(string2) + + count = 0 + + for i in range(len(string1)): + if string1[i] != string2[i]: + count += 1 + + return count + + +if __name__ == "__main__": + + def test_hamming_distance(): + assert hamming_distance("", "") == 0 + assert hamming_distance("python", "python") == 0 + assert hamming_distance("karolin", "kathrin") == 3 + assert hamming_distance("kathrin", "kerstin") == 4 + assert hamming_distance("00000", "11111") == 5 + + test_hamming_distance() From 196dc9373bbc87045f2a469260377ba913a5f6d2 Mon Sep 17 00:00:00 2001 From: Sedat Aybars Nazlica Date: Mon, 13 Jun 2022 22:10:25 +0900 Subject: [PATCH 2/4] Fix doctest --- strings/hamming_distance.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/strings/hamming_distance.py b/strings/hamming_distance.py index 03b8beac3a90..05878d5b4459 100644 --- a/strings/hamming_distance.py +++ b/strings/hamming_distance.py @@ -31,11 +31,6 @@ def hamming_distance(string1: str, string2: str) -> int: if __name__ == "__main__": - def test_hamming_distance(): - assert hamming_distance("", "") == 0 - assert hamming_distance("python", "python") == 0 - assert hamming_distance("karolin", "kathrin") == 3 - assert hamming_distance("kathrin", "kerstin") == 4 - assert hamming_distance("00000", "11111") == 5 - - test_hamming_distance() + import doctest + + doctest.testmod() From 1771ae45cdec52e4ef0a815dca4f24cf69034f85 Mon Sep 17 00:00:00 2001 From: Sedat Aybars Nazlica Date: Tue, 14 Jun 2022 21:27:50 +0900 Subject: [PATCH 3/4] Refactor --- strings/hamming_distance.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/strings/hamming_distance.py b/strings/hamming_distance.py index 05878d5b4459..3d5f359452ed 100644 --- a/strings/hamming_distance.py +++ b/strings/hamming_distance.py @@ -22,8 +22,8 @@ def hamming_distance(string1: str, string2: str) -> int: count = 0 - for i in range(len(string1)): - if string1[i] != string2[i]: + for char1, char2 in zip(string1, string2): + if char1 != char2: count += 1 return count From 668f07df43898aa1580b62b1df1ade12483e8408 Mon Sep 17 00:00:00 2001 From: Sedat Aybars Nazlica Date: Mon, 4 Jul 2022 13:17:42 +0900 Subject: [PATCH 4/4] Raise ValueError when string lengths are different --- strings/hamming_distance.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/strings/hamming_distance.py b/strings/hamming_distance.py index 3d5f359452ed..b8feaef06190 100644 --- a/strings/hamming_distance.py +++ b/strings/hamming_distance.py @@ -17,8 +17,11 @@ def hamming_distance(string1: str, string2: str) -> int: 3 >>> hamming_distance("00000", "11111") 5 + >>> hamming_distance("karolin", "kath") + ValueError: String lengths must match! """ - assert len(string1) == len(string2) + if len(string1) != len(string2): + raise ValueError("String lengths must match!") count = 0