From bc6f7e27aa4fb5b8b423ae54e8966e5f6befed7f Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Mon, 2 Mar 2026 18:15:18 +0100 Subject: [PATCH 01/40] chore: added Kata description to codewars table in README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0152bed..6375e73 100644 --- a/README.md +++ b/README.md @@ -17,4 +17,5 @@ Repository for CDS-2020 Programming and Promt Engineering II # Codewars |Title|Source (src/codewars/)|Test (test/codewars/)|URL| |-|-|-|-| -|Find the force of gravity between two objects|kata_force_of_gravity.py|test_force_of_gravity.py|[URL](https://www.codewars.com/kata/5b609ebc8f47bd595e000627/)| +|Find the force of gravity between two objects|kata_force_of_gravity.py|test_force_of_gravity.py|[5b609ebc8f47bd595e000627](https://www.codewars.com/kata/5b609ebc8f47bd595e000627/)| +|The Lamp: Revisited|kata_the_lamp.py|test_the_lamp.py|[570e6e32de4dc8a8340016dd](https://www.codewars.com/kata/570e6e32de4dc8a8340016dd)| From 515df4d452bbed2e301d09c24c0a38df96a358a7 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Mon, 2 Mar 2026 18:45:55 +0100 Subject: [PATCH 02/40] chore: README updated with KATA description feat: added kata_the_lamp.py test: added test_the_lamp.py for testing kata --- src/codewars/kata_the_lamp.py | 13 +++++++++++++ tests/codewars/test_the_lamp.py | 13 +++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 src/codewars/kata_the_lamp.py create mode 100644 tests/codewars/test_the_lamp.py diff --git a/src/codewars/kata_the_lamp.py b/src/codewars/kata_the_lamp.py new file mode 100644 index 0000000..418a8f6 --- /dev/null +++ b/src/codewars/kata_the_lamp.py @@ -0,0 +1,13 @@ +class Lamp: + + def __init__(self, color: str): + self.color = color + self.on = False + + def toggle_switch(self): + self.on = not self.on + + def state(self): + if self.on: + return "The lamp is on." + return "The lamp is off." diff --git a/tests/codewars/test_the_lamp.py b/tests/codewars/test_the_lamp.py new file mode 100644 index 0000000..811cec0 --- /dev/null +++ b/tests/codewars/test_the_lamp.py @@ -0,0 +1,13 @@ +from src.codewars.kata_the_lamp import Lamp + + +def test_lamp(): + my_lamp = Lamp("Blue") + + assert my_lamp.color == "Blue" + assert not my_lamp.on + assert my_lamp.state() == "The lamp is off." + my_lamp.toggle_switch() + assert my_lamp.state() == "The lamp is on." + my_lamp.toggle_switch() + assert my_lamp.state() == "The lamp is off." From da15c756d4f1678ed0db8c347c2ed904b06c2713 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 4 Mar 2026 17:48:45 +0100 Subject: [PATCH 03/40] feat: codewars kata object oriented piracy. test: test codewars test object oriented piracy. chore: README updated for kata --- README.md | 1 + src/codewars/kata_object_oriented_piracy.py | 7 +++++++ tests/codewars/test_object_oriented_piracy.py | 15 +++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 src/codewars/kata_object_oriented_piracy.py create mode 100644 tests/codewars/test_object_oriented_piracy.py diff --git a/README.md b/README.md index 6375e73..bc59d0d 100644 --- a/README.md +++ b/README.md @@ -19,3 +19,4 @@ Repository for CDS-2020 Programming and Promt Engineering II |-|-|-|-| |Find the force of gravity between two objects|kata_force_of_gravity.py|test_force_of_gravity.py|[5b609ebc8f47bd595e000627](https://www.codewars.com/kata/5b609ebc8f47bd595e000627/)| |The Lamp: Revisited|kata_the_lamp.py|test_the_lamp.py|[570e6e32de4dc8a8340016dd](https://www.codewars.com/kata/570e6e32de4dc8a8340016dd)| +|OOP: Object Oriented Piracy|kata_object_oriented_piracy.py|test_object_oriented_piracy.py|[54fe05c4762e2e3047000add](https://www.codewars.com/kata/54fe05c4762e2e3047000add)| diff --git a/src/codewars/kata_object_oriented_piracy.py b/src/codewars/kata_object_oriented_piracy.py new file mode 100644 index 0000000..4300254 --- /dev/null +++ b/src/codewars/kata_object_oriented_piracy.py @@ -0,0 +1,7 @@ +class Ship: + def __init__(self, draft, crew): + self.draft = draft + self.crew = crew + + def is_worth_it(self): + return self.draft - self.crew * 1.5 > 20 diff --git a/tests/codewars/test_object_oriented_piracy.py b/tests/codewars/test_object_oriented_piracy.py new file mode 100644 index 0000000..61f4872 --- /dev/null +++ b/tests/codewars/test_object_oriented_piracy.py @@ -0,0 +1,15 @@ +from src.codewars.kata_object_oriented_piracy import Ship + + +def test_piracy(): + empty_ship = Ship(0, 0) + assert not empty_ship.is_worth_it() + + boat = Ship(15, 20) + assert not boat.is_worth_it() + + worthy_ship = Ship(100, 20) + assert worthy_ship.is_worth_it() + + big_boat = Ship(35, 20) + assert not big_boat.is_worth_it() From c6b4d8f3d92648fbb6705b5622dab953109441e9 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 4 Mar 2026 17:51:10 +0100 Subject: [PATCH 04/40] =?UTF-8?q?chore:=20README=20updated=20codewars=20ka?= =?UTF-8?q?ta=20Vigen=C3=A8re=20Cipher=20Helper?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bc59d0d..dc0049b 100644 --- a/README.md +++ b/README.md @@ -20,3 +20,4 @@ Repository for CDS-2020 Programming and Promt Engineering II |Find the force of gravity between two objects|kata_force_of_gravity.py|test_force_of_gravity.py|[5b609ebc8f47bd595e000627](https://www.codewars.com/kata/5b609ebc8f47bd595e000627/)| |The Lamp: Revisited|kata_the_lamp.py|test_the_lamp.py|[570e6e32de4dc8a8340016dd](https://www.codewars.com/kata/570e6e32de4dc8a8340016dd)| |OOP: Object Oriented Piracy|kata_object_oriented_piracy.py|test_object_oriented_piracy.py|[54fe05c4762e2e3047000add](https://www.codewars.com/kata/54fe05c4762e2e3047000add)| +|Vigenère Cipher Helper|kata_cipher_helper.py|test_cipher_helper.py|[52d1bd3694d26f8d6e0000d3](https://www.codewars.com/kata/52d1bd3694d26f8d6e0000d3)| From ee9265d00c1ebe7fd37ddf0f0c8ab91c925f8ab2 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 4 Mar 2026 18:07:27 +0100 Subject: [PATCH 05/40] feat: kata vigenere cipher test: test for kata vigenere cipher --- src/codewars/kata_cipher_helper.py | 9 +++++++++ tests/codewars/test_cipher_helper.py | 5 +++++ 2 files changed, 14 insertions(+) create mode 100644 src/codewars/kata_cipher_helper.py create mode 100644 tests/codewars/test_cipher_helper.py diff --git a/src/codewars/kata_cipher_helper.py b/src/codewars/kata_cipher_helper.py new file mode 100644 index 0000000..dbea3f1 --- /dev/null +++ b/src/codewars/kata_cipher_helper.py @@ -0,0 +1,9 @@ +class VigenereCipher(object): + def __init__(self, key, alphabet): + pass + + def encode(self, text): + pass + + def decode(self, text): + pass diff --git a/tests/codewars/test_cipher_helper.py b/tests/codewars/test_cipher_helper.py new file mode 100644 index 0000000..c117588 --- /dev/null +++ b/tests/codewars/test_cipher_helper.py @@ -0,0 +1,5 @@ +"""from src.codewars.kata_cipher_helper import * + + +def test_cipher_helper(): + pass""" From 76e5f47d64a2cfe23fbca85bfdc94729394c7a5c Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 4 Mar 2026 21:23:22 +0100 Subject: [PATCH 06/40] feat: encoding works but with only same length text and key and only alphabet values test: added asserts to test --- src/codewars/kata_cipher_helper.py | 13 +++++++++++-- tests/codewars/test_cipher_helper.py | 15 +++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/codewars/kata_cipher_helper.py b/src/codewars/kata_cipher_helper.py index dbea3f1..4090d1f 100644 --- a/src/codewars/kata_cipher_helper.py +++ b/src/codewars/kata_cipher_helper.py @@ -1,9 +1,18 @@ class VigenereCipher(object): def __init__(self, key, alphabet): - pass + self.key = key + self.alphabet = alphabet def encode(self, text): - pass + idx_key = [self.alphabet.index(x) for x in self.key] + idx_text = [self.alphabet.index(x) for x in text] + pos_enc = [sum(x) % len(self.alphabet) for x in zip(idx_key, idx_text)] + return "".join([self.alphabet[x] for x in pos_enc]) def decode(self, text): pass + + +test = VigenereCipher("password", "abcdefghijklmnopqrstuvwxyz") + +print(test.encode("codewars")) diff --git a/tests/codewars/test_cipher_helper.py b/tests/codewars/test_cipher_helper.py index c117588..56c965f 100644 --- a/tests/codewars/test_cipher_helper.py +++ b/tests/codewars/test_cipher_helper.py @@ -1,5 +1,16 @@ -"""from src.codewars.kata_cipher_helper import * +from src.codewars.kata_cipher_helper import VigenereCipher def test_cipher_helper(): - pass""" + abc = "abcdefghijklmnopqrstuvwxyz" + key = "password" + c = VigenereCipher(key, abc) + + assert c.encode("codewars") == "rovwsoiv" + assert c.decode("rovwsoiv") == "codewars" + + assert c.encode("waffles") == "laxxhsj" + assert c.decode("laxxhsj") == "waffles" + + assert c.encode("CODEWARS") == "CODEWARS" + assert c.decode("CODEWARS") == "CODEWARS" From 696c37396b687aff422306adb070dbd52e61d12b Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 4 Mar 2026 22:08:22 +0100 Subject: [PATCH 07/40] feat: rehaul of encode function. Now will encode regardless of text length. Will ignore values not in alphabet. Decode works on same logic, but opposite --- src/codewars/kata_cipher_helper.py | 38 ++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/codewars/kata_cipher_helper.py b/src/codewars/kata_cipher_helper.py index 4090d1f..453b679 100644 --- a/src/codewars/kata_cipher_helper.py +++ b/src/codewars/kata_cipher_helper.py @@ -4,15 +4,39 @@ class VigenereCipher(object): self.alphabet = alphabet def encode(self, text): - idx_key = [self.alphabet.index(x) for x in self.key] - idx_text = [self.alphabet.index(x) for x in text] - pos_enc = [sum(x) % len(self.alphabet) for x in zip(idx_key, idx_text)] - return "".join([self.alphabet[x] for x in pos_enc]) + encoded = [] + idx_key = 0 + + for char in text: + if char in self.alphabet: + text_pos = self.alphabet.index(char) + key_char = self.key[idx_key % len(self.key)] + key_pos = self.alphabet.index(key_char) + + pos = (text_pos + key_pos) % len(self.alphabet) + encoded.append(self.alphabet[pos]) + + idx_key += 1 + else: + encoded.append(char) + + return "".join(encoded) def decode(self, text): - pass + decoded = [] + idx_key = 0 + for char in text: + if char in self.alphabet: + text_pos = self.alphabet.index(char) + key_char = self.key[idx_key % len(self.key)] + key_pos = self.alphabet.index(key_char) -test = VigenereCipher("password", "abcdefghijklmnopqrstuvwxyz") + pos = (text_pos - key_pos) % len(self.alphabet) + decoded.append(self.alphabet[pos]) -print(test.encode("codewars")) + idx_key += 1 + else: + decoded.append(char) + + return "".join(decoded) From 252ff429d2a7d582310b317afd37eafa5fb26acb Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 4 Mar 2026 22:59:39 +0100 Subject: [PATCH 08/40] feat: key will repeat over every characters even if it isn't in alphabet --- src/codewars/kata_cipher_helper.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/codewars/kata_cipher_helper.py b/src/codewars/kata_cipher_helper.py index 453b679..3d53b5d 100644 --- a/src/codewars/kata_cipher_helper.py +++ b/src/codewars/kata_cipher_helper.py @@ -15,10 +15,9 @@ class VigenereCipher(object): pos = (text_pos + key_pos) % len(self.alphabet) encoded.append(self.alphabet[pos]) - - idx_key += 1 else: encoded.append(char) + idx_key += 1 return "".join(encoded) @@ -34,9 +33,8 @@ class VigenereCipher(object): pos = (text_pos - key_pos) % len(self.alphabet) decoded.append(self.alphabet[pos]) - - idx_key += 1 else: decoded.append(char) + idx_key += 1 return "".join(decoded) From d1889005577be004aeb4298128065ed5dd6a0615 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 4 Mar 2026 23:04:55 +0100 Subject: [PATCH 09/40] chore: renamed cipher_helper.py in vigenere_chpher_helper. Next kata will be ceasar_cipher_helper --- ...elper.py => kata_vigenere_cipher_helper.py | 0 src/codewars/kata_vigenere_cipher_helper.py | 40 +++++++++++++++++++ ...lper.py => test_vigenere_cipher_helper.py} | 0 3 files changed, 40 insertions(+) rename src/codewars/kata_cipher_helper.py => kata_vigenere_cipher_helper.py (100%) create mode 100644 src/codewars/kata_vigenere_cipher_helper.py rename tests/codewars/{test_cipher_helper.py => test_vigenere_cipher_helper.py} (100%) diff --git a/src/codewars/kata_cipher_helper.py b/kata_vigenere_cipher_helper.py similarity index 100% rename from src/codewars/kata_cipher_helper.py rename to kata_vigenere_cipher_helper.py diff --git a/src/codewars/kata_vigenere_cipher_helper.py b/src/codewars/kata_vigenere_cipher_helper.py new file mode 100644 index 0000000..3d53b5d --- /dev/null +++ b/src/codewars/kata_vigenere_cipher_helper.py @@ -0,0 +1,40 @@ +class VigenereCipher(object): + def __init__(self, key, alphabet): + self.key = key + self.alphabet = alphabet + + def encode(self, text): + encoded = [] + idx_key = 0 + + for char in text: + if char in self.alphabet: + text_pos = self.alphabet.index(char) + key_char = self.key[idx_key % len(self.key)] + key_pos = self.alphabet.index(key_char) + + pos = (text_pos + key_pos) % len(self.alphabet) + encoded.append(self.alphabet[pos]) + else: + encoded.append(char) + idx_key += 1 + + return "".join(encoded) + + def decode(self, text): + decoded = [] + idx_key = 0 + + for char in text: + if char in self.alphabet: + text_pos = self.alphabet.index(char) + key_char = self.key[idx_key % len(self.key)] + key_pos = self.alphabet.index(key_char) + + pos = (text_pos - key_pos) % len(self.alphabet) + decoded.append(self.alphabet[pos]) + else: + decoded.append(char) + idx_key += 1 + + return "".join(decoded) diff --git a/tests/codewars/test_cipher_helper.py b/tests/codewars/test_vigenere_cipher_helper.py similarity index 100% rename from tests/codewars/test_cipher_helper.py rename to tests/codewars/test_vigenere_cipher_helper.py From 03d93a0b83cd1e8c37d1cd58dac191c5e19187d8 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 4 Mar 2026 23:08:33 +0100 Subject: [PATCH 10/40] chore: added description for ceasar chiper helper codewars kata --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dc0049b..b64c67a 100644 --- a/README.md +++ b/README.md @@ -20,4 +20,5 @@ Repository for CDS-2020 Programming and Promt Engineering II |Find the force of gravity between two objects|kata_force_of_gravity.py|test_force_of_gravity.py|[5b609ebc8f47bd595e000627](https://www.codewars.com/kata/5b609ebc8f47bd595e000627/)| |The Lamp: Revisited|kata_the_lamp.py|test_the_lamp.py|[570e6e32de4dc8a8340016dd](https://www.codewars.com/kata/570e6e32de4dc8a8340016dd)| |OOP: Object Oriented Piracy|kata_object_oriented_piracy.py|test_object_oriented_piracy.py|[54fe05c4762e2e3047000add](https://www.codewars.com/kata/54fe05c4762e2e3047000add)| -|Vigenère Cipher Helper|kata_cipher_helper.py|test_cipher_helper.py|[52d1bd3694d26f8d6e0000d3](https://www.codewars.com/kata/52d1bd3694d26f8d6e0000d3)| +|Vigenère Cipher Helper|kata_vigenere_cipher_helper.py|test_vigenere_cipher_helper.py|[52d1bd3694d26f8d6e0000d3](https://www.codewars.com/kata/52d1bd3694d26f8d6e0000d3)| +|Caesar Cipher Helper|kata_ceasar_cipher_helper.py|test_ceasar_cipher_helper.py|[526d42b6526963598d0004db](https://www.codewars.com/kata/526d42b6526963598d0004db)| From 2a611bcc8324ef09c8c03f5eb6b501f19c87899d Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 4 Mar 2026 23:10:38 +0100 Subject: [PATCH 11/40] feat: new kata ceasar cipher helper --- src/codewars/kata_ceasar_cipher_helper.py | 0 tests/codewars/test_ceasar_cipher_helper.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/codewars/kata_ceasar_cipher_helper.py create mode 100644 tests/codewars/test_ceasar_cipher_helper.py diff --git a/src/codewars/kata_ceasar_cipher_helper.py b/src/codewars/kata_ceasar_cipher_helper.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/codewars/test_ceasar_cipher_helper.py b/tests/codewars/test_ceasar_cipher_helper.py new file mode 100644 index 0000000..e69de29 From d1f40c422a3383fe72e144ce6f1c1346f248b1c5 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 4 Mar 2026 23:12:15 +0100 Subject: [PATCH 12/40] chore: removed duplicate file in wrong directory --- kata_vigenere_cipher_helper.py | 40 ---------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 kata_vigenere_cipher_helper.py diff --git a/kata_vigenere_cipher_helper.py b/kata_vigenere_cipher_helper.py deleted file mode 100644 index 3d53b5d..0000000 --- a/kata_vigenere_cipher_helper.py +++ /dev/null @@ -1,40 +0,0 @@ -class VigenereCipher(object): - def __init__(self, key, alphabet): - self.key = key - self.alphabet = alphabet - - def encode(self, text): - encoded = [] - idx_key = 0 - - for char in text: - if char in self.alphabet: - text_pos = self.alphabet.index(char) - key_char = self.key[idx_key % len(self.key)] - key_pos = self.alphabet.index(key_char) - - pos = (text_pos + key_pos) % len(self.alphabet) - encoded.append(self.alphabet[pos]) - else: - encoded.append(char) - idx_key += 1 - - return "".join(encoded) - - def decode(self, text): - decoded = [] - idx_key = 0 - - for char in text: - if char in self.alphabet: - text_pos = self.alphabet.index(char) - key_char = self.key[idx_key % len(self.key)] - key_pos = self.alphabet.index(key_char) - - pos = (text_pos - key_pos) % len(self.alphabet) - decoded.append(self.alphabet[pos]) - else: - decoded.append(char) - idx_key += 1 - - return "".join(decoded) From be6d0997dcca7bc5f7623f92048f2b24b3a3067b Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 4 Mar 2026 23:55:54 +0100 Subject: [PATCH 13/40] feat: finished ceasar cipher kata and test. refractor: vigenere cipher testfile, updated import after renameing filename of kata src --- src/codewars/kata_ceasar_cipher_helper.py | 28 +++++++++++++++++++ tests/codewars/test_ceasar_cipher_helper.py | 8 ++++++ tests/codewars/test_vigenere_cipher_helper.py | 2 +- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/codewars/kata_ceasar_cipher_helper.py b/src/codewars/kata_ceasar_cipher_helper.py index e69de29..f9d6643 100644 --- a/src/codewars/kata_ceasar_cipher_helper.py +++ b/src/codewars/kata_ceasar_cipher_helper.py @@ -0,0 +1,28 @@ +class CaesarCipher(object): + def __init__(self, shift): + self.shift = shift + self.alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + def encode(self, text): + idx_alph = [ + self.alphabet.index(x) if x in self.alphabet else x for x in text.upper() + ] + idx_shift = [ + (x + self.shift) % len(self.alphabet) if isinstance(x, (int)) else x + for x in idx_alph + ] + return "".join( + [self.alphabet[x] if isinstance(x, (int)) else x for x in idx_shift] + ) + + def decode(self, text): + idx_alph = [ + self.alphabet.index(x) if x in self.alphabet else x for x in text.upper() + ] + idx_shift = [ + (x - self.shift) % len(self.alphabet) if isinstance(x, (int)) else x + for x in idx_alph + ] + return "".join( + [self.alphabet[x] if isinstance(x, (int)) else x for x in idx_shift] + ) diff --git a/tests/codewars/test_ceasar_cipher_helper.py b/tests/codewars/test_ceasar_cipher_helper.py index e69de29..70efd3b 100644 --- a/tests/codewars/test_ceasar_cipher_helper.py +++ b/tests/codewars/test_ceasar_cipher_helper.py @@ -0,0 +1,8 @@ +from src.codewars.kata_ceasar_cipher_helper import CaesarCipher + + +def test_cipher_helper(): + c = CaesarCipher(5) + + assert c.encode("Codewars") == "HTIJBFWX" + assert c.decode("HTIJBFWX") == "CODEWARS" diff --git a/tests/codewars/test_vigenere_cipher_helper.py b/tests/codewars/test_vigenere_cipher_helper.py index 56c965f..a851339 100644 --- a/tests/codewars/test_vigenere_cipher_helper.py +++ b/tests/codewars/test_vigenere_cipher_helper.py @@ -1,4 +1,4 @@ -from src.codewars.kata_cipher_helper import VigenereCipher +from src.codewars.kata_vigenere_cipher_helper import VigenereCipher def test_cipher_helper(): From 4ed2cbe3f31539339581d3e796ca03e52b13a703 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Thu, 5 Mar 2026 00:08:48 +0100 Subject: [PATCH 14/40] chore: README for katas descriptions feat: source file for katas test: test files for katas --- README.md | 4 ++++ src/codewars/kata_building_blocks.py | 0 src/codewars/kata_thinkful_quarks.py | 0 src/codewars/kata_thinkful_vectors.py | 0 src/codewars/kata_version_mamanger.py | 3 +++ tests/codewars/test_building_blocks.py | 0 tests/codewars/test_thinkful_quarks.py | 0 tests/codewars/test_thinkful_vectors.py | 0 tests/codewars/test_version_manager.py | 0 9 files changed, 7 insertions(+) create mode 100644 src/codewars/kata_building_blocks.py create mode 100644 src/codewars/kata_thinkful_quarks.py create mode 100644 src/codewars/kata_thinkful_vectors.py create mode 100644 src/codewars/kata_version_mamanger.py create mode 100644 tests/codewars/test_building_blocks.py create mode 100644 tests/codewars/test_thinkful_quarks.py create mode 100644 tests/codewars/test_thinkful_vectors.py create mode 100644 tests/codewars/test_version_manager.py diff --git a/README.md b/README.md index b64c67a..5af8d0a 100644 --- a/README.md +++ b/README.md @@ -22,3 +22,7 @@ Repository for CDS-2020 Programming and Promt Engineering II |OOP: Object Oriented Piracy|kata_object_oriented_piracy.py|test_object_oriented_piracy.py|[54fe05c4762e2e3047000add](https://www.codewars.com/kata/54fe05c4762e2e3047000add)| |Vigenère Cipher Helper|kata_vigenere_cipher_helper.py|test_vigenere_cipher_helper.py|[52d1bd3694d26f8d6e0000d3](https://www.codewars.com/kata/52d1bd3694d26f8d6e0000d3)| |Caesar Cipher Helper|kata_ceasar_cipher_helper.py|test_ceasar_cipher_helper.py|[526d42b6526963598d0004db](https://www.codewars.com/kata/526d42b6526963598d0004db)| +|Versions manager|kata_version_mamanger.py|test_version_manager.py|[5bc7bb444be9774f100000c3](https://www.codewars.com/kata/5bc7bb444be9774f100000c3)| +|Thinkful - Object Drills: Quarks|kata_thinkful_quarks.py|test_thinkful_quarks.py|[5882b052bdeafec15e0000e6](https://www.codewars.com/kata/5882b052bdeafec15e0000e6)| +|Thinkful - Object Drills: Vectors|kata_thinkful_vectors.py|test_thinkful_vectors.py|[587f1e1f39d444cee6000ad4](https://www.codewars.com/kata/587f1e1f39d444cee6000ad4)| +|Building blocks|kata.py|test.py|[55b75fcf67e558d3750000a3](https://www.codewars.com/kata/55b75fcf67e558d3750000a3)| diff --git a/src/codewars/kata_building_blocks.py b/src/codewars/kata_building_blocks.py new file mode 100644 index 0000000..e69de29 diff --git a/src/codewars/kata_thinkful_quarks.py b/src/codewars/kata_thinkful_quarks.py new file mode 100644 index 0000000..e69de29 diff --git a/src/codewars/kata_thinkful_vectors.py b/src/codewars/kata_thinkful_vectors.py new file mode 100644 index 0000000..e69de29 diff --git a/src/codewars/kata_version_mamanger.py b/src/codewars/kata_version_mamanger.py new file mode 100644 index 0000000..2beca3d --- /dev/null +++ b/src/codewars/kata_version_mamanger.py @@ -0,0 +1,3 @@ +class VersionManager: + def __init__(self, version): + pass diff --git a/tests/codewars/test_building_blocks.py b/tests/codewars/test_building_blocks.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/codewars/test_thinkful_quarks.py b/tests/codewars/test_thinkful_quarks.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/codewars/test_thinkful_vectors.py b/tests/codewars/test_thinkful_vectors.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/codewars/test_version_manager.py b/tests/codewars/test_version_manager.py new file mode 100644 index 0000000..e69de29 From 81dc543bf5e09559c4f86f35e7c85d70888c5d88 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Thu, 5 Mar 2026 00:09:31 +0100 Subject: [PATCH 15/40] chore: nothing changen just needed to save file --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5af8d0a..6b0bbac 100644 --- a/README.md +++ b/README.md @@ -25,4 +25,4 @@ Repository for CDS-2020 Programming and Promt Engineering II |Versions manager|kata_version_mamanger.py|test_version_manager.py|[5bc7bb444be9774f100000c3](https://www.codewars.com/kata/5bc7bb444be9774f100000c3)| |Thinkful - Object Drills: Quarks|kata_thinkful_quarks.py|test_thinkful_quarks.py|[5882b052bdeafec15e0000e6](https://www.codewars.com/kata/5882b052bdeafec15e0000e6)| |Thinkful - Object Drills: Vectors|kata_thinkful_vectors.py|test_thinkful_vectors.py|[587f1e1f39d444cee6000ad4](https://www.codewars.com/kata/587f1e1f39d444cee6000ad4)| -|Building blocks|kata.py|test.py|[55b75fcf67e558d3750000a3](https://www.codewars.com/kata/55b75fcf67e558d3750000a3)| +|Building blocks|kata_building_blocks.py|test_building_blocks.py|[55b75fcf67e558d3750000a3](https://www.codewars.com/kata/55b75fcf67e558d3750000a3)| From 16497f059cec44fef8caa0fb3f03a013350585fc Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Thu, 5 Mar 2026 11:17:10 +0100 Subject: [PATCH 16/40] feat: robotpy is a tutorial for polymorphism --- src/tutorial/class/robot.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/tutorial/class/robot.py diff --git a/src/tutorial/class/robot.py b/src/tutorial/class/robot.py new file mode 100644 index 0000000..a4ab031 --- /dev/null +++ b/src/tutorial/class/robot.py @@ -0,0 +1,21 @@ +class Dog: + def speak(self) -> str: + return "wuff" + + +class Cat: + def speak(self) -> str: + return "miau" + + +class Robot: + def speak(self) -> str: + return "bip bup" + + +def chorus(animals) -> list: + for a in animals: + print(a.speak()) + + +chorus([Dog(), Cat(), Robot()]) From ffc1c06a2db47204f6b0c609e1900c69a3531770 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Thu, 5 Mar 2026 11:46:32 +0100 Subject: [PATCH 17/40] feat: storage.py is a tutorial for Interface --- src/tutorial/class/storage.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/tutorial/class/storage.py diff --git a/src/tutorial/class/storage.py b/src/tutorial/class/storage.py new file mode 100644 index 0000000..a6859db --- /dev/null +++ b/src/tutorial/class/storage.py @@ -0,0 +1,27 @@ +from abc import ABC, abstractmethod + + +class Storage(ABC): + @abstractmethod + def save(self, key: str, value: str) -> None: + pass + + @abstractmethod + def load(self, key: str) -> str: + pass + + +class MemoryStorage(Storage): + def __init__(self) -> None: + self.storage = {} + + def save(self, key: str, value: str) -> None: + self.storage[key] = value + + def load(self, key): + return self.storage[key] + + +s = MemoryStorage() +s.save("randomkey", "My Value") +print(s.load("randomkey")) From b67ebcdcca24f5a1b4dc5f4071337b7df41f0610 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Thu, 5 Mar 2026 12:00:34 +0100 Subject: [PATCH 18/40] feat: mro tuorial --- src/tutorial/class/mro_tutorial.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/tutorial/class/mro_tutorial.py diff --git a/src/tutorial/class/mro_tutorial.py b/src/tutorial/class/mro_tutorial.py new file mode 100644 index 0000000..715035d --- /dev/null +++ b/src/tutorial/class/mro_tutorial.py @@ -0,0 +1,17 @@ +class A: + pass + + +class B(A): + pass + + +class C(A): + pass + + +class D(B, C): + pass + + +print(D.mro()) From e18a3f062fa0dc6eafd73507b4ce3aa5749a13d2 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Thu, 5 Mar 2026 12:26:46 +0100 Subject: [PATCH 19/40] feat: animal.py tutorial for Interface and Inheritance --- src/tutorial/class/animal.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/tutorial/class/animal.py diff --git a/src/tutorial/class/animal.py b/src/tutorial/class/animal.py new file mode 100644 index 0000000..77a7406 --- /dev/null +++ b/src/tutorial/class/animal.py @@ -0,0 +1,32 @@ +from abc import ABC, abstractmethod + + +class Animal(ABC): + @abstractmethod + def speak(slef) -> str: + return "..." + + def chorus(self, n: int) -> str: + # Wiederhole den Laut n-mal als eine Zeile" + if n <= 0: + raise ValueError("n muss positiv sein") + return " ".join(self.speak() for _ in range(n)) + + +class Dog(Animal): + def speak(self) -> str: + return "wuff" + + +class Cat(Animal): + def speak(self) -> str: + return "miau" + + +class Cow(Animal): + def speak(self) -> str: + return "muh" + + +cow = Cow() +print(cow.chorus(3)) From ec105d44bed28db3d20d6296d57e15b13076c92e Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Thu, 5 Mar 2026 23:56:33 +0100 Subject: [PATCH 20/40] feat: kata version manager __init__ configured and methods created --- src/codewars/kata_version_mamanger.py | 30 ++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/codewars/kata_version_mamanger.py b/src/codewars/kata_version_mamanger.py index 2beca3d..22d85a0 100644 --- a/src/codewars/kata_version_mamanger.py +++ b/src/codewars/kata_version_mamanger.py @@ -1,3 +1,31 @@ class VersionManager: - def __init__(self, version): + def __init__(self, version="0.0.1"): + version = version.split(".")[:3] + try: + for val in version: + assert val.isdecimal(), "Error occured while parsing version!" + except AssertionError as error: + print(error) + + self.version = ".".join(version) + self.history = [self.version] + + def major(self) -> None: pass + + def minor(self) -> None: + pass + + def path(self) -> None: + pass + + def rollback(self) -> None: + pass + + def release(self) -> str: + return f"{self.version}" + + +test = VersionManager("1.1") +print(test.version) +print(test.history) From 8f3cd117ef877a78496e0a8b9b38bfd2e0c782d8 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Fri, 6 Mar 2026 10:22:31 +0100 Subject: [PATCH 21/40] feat: version manager kata done. test: testcase for version manager kata started --- src/codewars/kata_version_mamanger.py | 60 ++++++++++++++++---------- tests/codewars/test_version_manager.py | 7 +++ 2 files changed, 45 insertions(+), 22 deletions(-) diff --git a/src/codewars/kata_version_mamanger.py b/src/codewars/kata_version_mamanger.py index 22d85a0..e32722e 100644 --- a/src/codewars/kata_version_mamanger.py +++ b/src/codewars/kata_version_mamanger.py @@ -1,31 +1,47 @@ class VersionManager: - def __init__(self, version="0.0.1"): - version = version.split(".")[:3] - try: - for val in version: - assert val.isdecimal(), "Error occured while parsing version!" - except AssertionError as error: - print(error) + def __init__(self, version=None): + if not version: + version = "0.0.1" - self.version = ".".join(version) - self.history = [self.version] + parts = version.split(".")[:3] - def major(self) -> None: - pass + if not all(p.isdecimal() for p in parts): + raise ValueError("Error occured while parsing version!") - def minor(self) -> None: - pass + nums = [int(p) for p in parts] - def path(self) -> None: - pass + while len(nums) < 3: + nums.append(0) - def rollback(self) -> None: - pass + self.major_v, self.minor_v, self.patch_v = nums + self.history = [] - def release(self) -> str: - return f"{self.version}" + def _save(self): + self.history.append((self.major_v, self.minor_v, self.patch_v)) + def major(self): + self._save() + self.major_v += 1 + self.minor_v = 0 + self.patch_v = 0 + return self -test = VersionManager("1.1") -print(test.version) -print(test.history) + def minor(self): + self._save() + self.minor_v += 1 + self.patch_v = 0 + return self + + def patch(self): + self._save() + self.patch_v += 1 + return self + + def rollback(self): + if not self.history: + raise Exception("Cannot rollback!") + self.major_v, self.minor_v, self.patch_v = self.history.pop() + return self + + def release(self): + return f"{self.major_v}.{self.minor_v}.{self.patch_v}" diff --git a/tests/codewars/test_version_manager.py b/tests/codewars/test_version_manager.py index e69de29..fb9c76b 100644 --- a/tests/codewars/test_version_manager.py +++ b/tests/codewars/test_version_manager.py @@ -0,0 +1,7 @@ +from src.codewars.kata_version_mamanger import VersionManager + + +def test_lamp(): + v = VersionManager("1.1.1") + + assert v.release() == "1.1.1" From 95d79c84a864f22bdaedaade26b3a3c4822a7853 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Fri, 6 Mar 2026 16:38:28 +0100 Subject: [PATCH 22/40] feat: added inheritace and comparisond methods --- src/tutorial/class/hund.py | 73 +++++++++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 13 deletions(-) diff --git a/src/tutorial/class/hund.py b/src/tutorial/class/hund.py index 129deb9..d47423f 100644 --- a/src/tutorial/class/hund.py +++ b/src/tutorial/class/hund.py @@ -1,41 +1,88 @@ -class Hund: +from abc import ABC, abstractmethod + + +class Hund(ABC): anzahl_hunde = 0 - def __init__(self, name: str, rasse: str, alter: int, gewicht: float): + def __init__(self, name: str, alter: int, gewicht: float, bellgeraeusch: str): self.name = name - self.rasse = rasse self.alter = alter self.gewicht = gewicht + self.bellgeraeusch = bellgeraeusch Hund.anzahl_hunde += 1 - def __repr__(self): - return f"Hund(name={self.name!r}, rasse={self.rasse}, alter={self.alter}, gewicht={self.gewicht}" + def __repr__(self) -> str: + return f"Hund(name={self.name!r}, rasse={self.__class__.__name__}, alter={self.alter}, gewicht={self.gewicht}" - def __str__(self): - return f"{self.name} ist ein {self.alter}-jähriger {self.rasse}" + def __str__(self) -> str: + return f"{self.name} ist ein {self.alter}-jähriger {self.__class__.__name__}" - def bellen(self, n=1) -> int: - print(n * "Woof! ") + @abstractmethod + def bellen(self, n: int = 1) -> None: + print(" ".join([self.bellgeraeusch] * n)) - def geburtstag(self): + def geburtstag(self) -> None: self.alter += 1 print( f"Alles Gute zum Geburtstag, {self.name}! Du bist jetzt {self.alter} Jahre alt." ) - def ist_welpe(self): + def ist_welpe(self) -> None: if self.alter < 2: print(f"{self.name} ist ein {self.alter}-jähriger Welpe") else: print(f"{self.name} ist ein {self.alter}-jähriger erwachsener Hund") + def __lt__(self, other): # less than: self < other + return self.alter < other.alter -hund1 = Hund(name="Bello", rasse="Pudel", alter=99, gewicht=357) -hund2 = Hund(name="Dewy", rasse="Labrador", alter=-6, gewicht=1) + def __le__(self, other): # less equal: self <= other + return self.alter <= other.alter + + def __gt__(self, other): # greater than: self > other + return self.alter > other.alter + + def __ge__(self, other): # greater equal: self >= other + return self.alter >= other.alter + + def __eq__(self, other): # equal: self == other + return self.alter == other.alter + + +class Pudel(Hund): + def __init__(self, name, alter, gewicht): + super().__init__(name, alter, gewicht, "wau") + + def bellen(self, n=1): + super().bellen(n) + + +class Labrador(Hund): + def __init__(self, name, alter, gewicht): + super().__init__(name, alter, gewicht, "wuff") + + def bellen(self, n=1): + super().bellen(n) + + +class Bulldog(Hund): + def __init__(self, name, alter, gewicht): + super().__init__(name, alter, gewicht, "woff") + + def bellen(self, n=1): + super().bellen(n) + + +hund1 = Labrador(name="Bello", alter=33, gewicht=27) +hund2 = Pudel(name="Dewy", alter=6, gewicht=1) +hund3 = Bulldog(name="Stone", alter=15, gewicht=1000) print(repr(hund1)) print(hund2) hund2.bellen(3) +hund1.bellen(2) hund1.geburtstag() hund2.ist_welpe() hund1.ist_welpe() +hund3.bellen(4) +print(hund3 > hund2) From 27c50870061b82a2c4b83d4f9a2c72991fb72758 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Mon, 9 Mar 2026 18:03:58 +0100 Subject: [PATCH 23/40] chore: README updated for kata content 'PaginationHelper' --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6b0bbac..c6e1fd9 100644 --- a/README.md +++ b/README.md @@ -26,3 +26,4 @@ Repository for CDS-2020 Programming and Promt Engineering II |Thinkful - Object Drills: Quarks|kata_thinkful_quarks.py|test_thinkful_quarks.py|[5882b052bdeafec15e0000e6](https://www.codewars.com/kata/5882b052bdeafec15e0000e6)| |Thinkful - Object Drills: Vectors|kata_thinkful_vectors.py|test_thinkful_vectors.py|[587f1e1f39d444cee6000ad4](https://www.codewars.com/kata/587f1e1f39d444cee6000ad4)| |Building blocks|kata_building_blocks.py|test_building_blocks.py|[55b75fcf67e558d3750000a3](https://www.codewars.com/kata/55b75fcf67e558d3750000a3)| +|PaginationHelper|kata_pagination_helper.py|test_pagination_helper.py|[515bb423de843ea99400000a](https://www.codewars.com/kata/515bb423de843ea99400000a)| From 17de0e0f9287ff80900bdebd2b1aab1dc50e9f53 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Mon, 9 Mar 2026 18:20:09 +0100 Subject: [PATCH 24/40] test: added test cases for kata 'PaginationHelper' --- tests/codewars/test_pagination_helper.py | 27 ++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 tests/codewars/test_pagination_helper.py diff --git a/tests/codewars/test_pagination_helper.py b/tests/codewars/test_pagination_helper.py new file mode 100644 index 0000000..12f3185 --- /dev/null +++ b/tests/codewars/test_pagination_helper.py @@ -0,0 +1,27 @@ +from src.codewars.kata_pagination_helper import PaginationHelper + + +def test_pagination(): + collection = ["a", "b", "c", "d", "e", "f"] + helper = PaginationHelper(collection, 4) + + assert helper.page_count() == 2 + assert helper.item_count() == 6 + assert helper.page_item_count(0) == 4 + assert helper.page_item_count(1) == 2 + assert helper.page_item_count(2) == -1 + assert helper.page_index(5) == 1 + assert helper.page_index(2) == 0 + assert helper.page_index(20) == -1 + assert helper.page_index(-10) == -1 + + empty = PaginationHelper([], 10) + + assert empty.item_count() == 0 + assert empty.page_count() == 0 + assert empty.page_index(0) == -1 + assert empty.page_index(1) == -1 + assert empty.page_index(-1) == -1 + assert empty.page_item_count(0) == -1 + assert empty.page_item_count(1) == -1 + assert empty.page_item_count(-1) == -1 From fbf13b3f3fedd8506caea68133c9766015bbc058 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Mon, 9 Mar 2026 18:36:38 +0100 Subject: [PATCH 25/40] feat: function item_count() finished, working on page_count() --- src/codewars/kata_pagination_helper.py | 34 ++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/codewars/kata_pagination_helper.py diff --git a/src/codewars/kata_pagination_helper.py b/src/codewars/kata_pagination_helper.py new file mode 100644 index 0000000..f041971 --- /dev/null +++ b/src/codewars/kata_pagination_helper.py @@ -0,0 +1,34 @@ +# TODO: complete this class + + +class PaginationHelper: + + # The constructor takes in an array of items and an integer indicating + # how many items fit within a single page + def __init__(self, collection, items_per_page): + self.collection = collection + self.items_per_page = items_per_page + + # returns the number of items within the entire collection + def item_count(self): + return len(self.collection) + + # returns the number of pages + def page_count(self): + return self.items_per_page // len(self.collection) + + # returns the number of items on the given page. page_index is zero based + # this method should return -1 for page_index values that are out of range + def page_item_count(self, page_index): + pass + + # determines what page an item at the given index is on. Zero based indexes. + # this method should return -1 for item_index values that are out of range + def page_index(self, item_index): + pass + + +collection = ["a", "b", "c", "d", "e", "f"] +helper = PaginationHelper(collection, 4) + +print(helper.page_count()) From 7e43f0d42d4a0a6008dbcb9ed85a58275c4bf1d7 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Mon, 9 Mar 2026 20:14:59 +0100 Subject: [PATCH 26/40] feat: function page_count and page_item_count finished --- src/codewars/kata_pagination_helper.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/codewars/kata_pagination_helper.py b/src/codewars/kata_pagination_helper.py index f041971..7a6c3fc 100644 --- a/src/codewars/kata_pagination_helper.py +++ b/src/codewars/kata_pagination_helper.py @@ -15,12 +15,22 @@ class PaginationHelper: # returns the number of pages def page_count(self): - return self.items_per_page // len(self.collection) + return int(len(self.collection) / self.items_per_page) + ( + len(self.collection) % self.items_per_page > 0 + ) # returns the number of items on the given page. page_index is zero based # this method should return -1 for page_index values that are out of range def page_item_count(self, page_index): - pass + if page_index < 0 or self.page_count() - 1 < page_index: + return -1 + + if page_index == 0: + return len(self.collection[: self.items_per_page]) + + return self.collection[ + self.items_per_page * page_index : self.items_per_page * page_index * 2 + ] # determines what page an item at the given index is on. Zero based indexes. # this method should return -1 for item_index values that are out of range @@ -28,7 +38,8 @@ class PaginationHelper: pass -collection = ["a", "b", "c", "d", "e", "f"] +collection = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] helper = PaginationHelper(collection, 4) print(helper.page_count()) +print(helper.page_item_count(2)) From fa8b2b21f951f852e37f8ac5dbd190a41c01e682 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Mon, 9 Mar 2026 20:20:52 +0100 Subject: [PATCH 27/40] fix: forgot to return len() of list in function page_item_count. Insted list itself was returned --- src/codewars/kata_pagination_helper.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/codewars/kata_pagination_helper.py b/src/codewars/kata_pagination_helper.py index 7a6c3fc..3be65a3 100644 --- a/src/codewars/kata_pagination_helper.py +++ b/src/codewars/kata_pagination_helper.py @@ -28,9 +28,11 @@ class PaginationHelper: if page_index == 0: return len(self.collection[: self.items_per_page]) - return self.collection[ - self.items_per_page * page_index : self.items_per_page * page_index * 2 - ] + return len( + self.collection[ + self.items_per_page * page_index : self.items_per_page * page_index * 2 + ] + ) # determines what page an item at the given index is on. Zero based indexes. # this method should return -1 for item_index values that are out of range @@ -38,8 +40,8 @@ class PaginationHelper: pass -collection = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] +collection = ["a", "b", "c", "d", "e", "f"] helper = PaginationHelper(collection, 4) print(helper.page_count()) -print(helper.page_item_count(2)) +print(helper.page_item_count(1)) From 00a42ea0fd8ede1c9fd572551e7f165ac7d1bff6 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Mon, 9 Mar 2026 21:19:09 +0100 Subject: [PATCH 28/40] fix: fixed function page_item_count. from calculating: constant * muliplicator * 2. to: constant * multiplicator + constant. first calculation returned wrong amount of items to return --- src/codewars/kata_pagination_helper.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/codewars/kata_pagination_helper.py b/src/codewars/kata_pagination_helper.py index 3be65a3..454c50f 100644 --- a/src/codewars/kata_pagination_helper.py +++ b/src/codewars/kata_pagination_helper.py @@ -30,18 +30,20 @@ class PaginationHelper: return len( self.collection[ - self.items_per_page * page_index : self.items_per_page * page_index * 2 + self.items_per_page * page_index : self.items_per_page * page_index + + self.items_per_page ] ) # determines what page an item at the given index is on. Zero based indexes. # this method should return -1 for item_index values that are out of range def page_index(self, item_index): - pass + try: + self.collection[item_index] + if item_index < 0: + raise IndexError + except IndexError: + return -1 -collection = ["a", "b", "c", "d", "e", "f"] -helper = PaginationHelper(collection, 4) - -print(helper.page_count()) -print(helper.page_item_count(1)) + return item_index // self.items_per_page From e521f037a4353dc0fc1b05cd6b5251840fa7f6d8 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Mon, 9 Mar 2026 21:20:36 +0100 Subject: [PATCH 29/40] refractor: removed unnecessary comment --- src/codewars/kata_pagination_helper.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/codewars/kata_pagination_helper.py b/src/codewars/kata_pagination_helper.py index 454c50f..98eb598 100644 --- a/src/codewars/kata_pagination_helper.py +++ b/src/codewars/kata_pagination_helper.py @@ -1,6 +1,3 @@ -# TODO: complete this class - - class PaginationHelper: # The constructor takes in an array of items and an integer indicating From 90ba3e1e6064de5788870e1e8ee817533187bba3 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Tue, 10 Mar 2026 15:24:00 +0100 Subject: [PATCH 30/40] chore: README updated for kata 'Who has the most money' --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c6e1fd9..fb4940a 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Repository for CDS-2020 Programming and Promt Engineering II # Codewars |Title|Source (src/codewars/)|Test (test/codewars/)|URL| |-|-|-|-| -|Find the force of gravity between two objects|kata_force_of_gravity.py|test_force_of_gravity.py|[5b609ebc8f47bd595e000627](https://www.codewars.com/kata/5b609ebc8f47bd595e000627/)| +|Find the force of gravity between two objects|kata_force_of_gravity.py|test_force_of_gravity.py|[5b609ebc8f47bd595e000627](https://www.codewars.com/kata/5b609ebc8f47bd595e000627)| |The Lamp: Revisited|kata_the_lamp.py|test_the_lamp.py|[570e6e32de4dc8a8340016dd](https://www.codewars.com/kata/570e6e32de4dc8a8340016dd)| |OOP: Object Oriented Piracy|kata_object_oriented_piracy.py|test_object_oriented_piracy.py|[54fe05c4762e2e3047000add](https://www.codewars.com/kata/54fe05c4762e2e3047000add)| |Vigenère Cipher Helper|kata_vigenere_cipher_helper.py|test_vigenere_cipher_helper.py|[52d1bd3694d26f8d6e0000d3](https://www.codewars.com/kata/52d1bd3694d26f8d6e0000d3)| @@ -27,3 +27,4 @@ Repository for CDS-2020 Programming and Promt Engineering II |Thinkful - Object Drills: Vectors|kata_thinkful_vectors.py|test_thinkful_vectors.py|[587f1e1f39d444cee6000ad4](https://www.codewars.com/kata/587f1e1f39d444cee6000ad4)| |Building blocks|kata_building_blocks.py|test_building_blocks.py|[55b75fcf67e558d3750000a3](https://www.codewars.com/kata/55b75fcf67e558d3750000a3)| |PaginationHelper|kata_pagination_helper.py|test_pagination_helper.py|[515bb423de843ea99400000a](https://www.codewars.com/kata/515bb423de843ea99400000a)| +|Who has the most money?|kata_who_the_money.py|test_who_the_money.py|[528d36d7cc451cd7e4000339](https://www.codewars.com/kata/528d36d7cc451cd7e4000339)| From a681ae4f2be90b623ae2efd3b10cb3e9b8a63f6e Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Tue, 10 Mar 2026 15:24:22 +0100 Subject: [PATCH 31/40] chore: README updated for kata 'Who has the most money' --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fb4940a..5b89577 100644 --- a/README.md +++ b/README.md @@ -27,4 +27,4 @@ Repository for CDS-2020 Programming and Promt Engineering II |Thinkful - Object Drills: Vectors|kata_thinkful_vectors.py|test_thinkful_vectors.py|[587f1e1f39d444cee6000ad4](https://www.codewars.com/kata/587f1e1f39d444cee6000ad4)| |Building blocks|kata_building_blocks.py|test_building_blocks.py|[55b75fcf67e558d3750000a3](https://www.codewars.com/kata/55b75fcf67e558d3750000a3)| |PaginationHelper|kata_pagination_helper.py|test_pagination_helper.py|[515bb423de843ea99400000a](https://www.codewars.com/kata/515bb423de843ea99400000a)| -|Who has the most money?|kata_who_the_money.py|test_who_the_money.py|[528d36d7cc451cd7e4000339](https://www.codewars.com/kata/528d36d7cc451cd7e4000339)| +|Who has the most money?|kata_who_the_most_money.py|test_who_the_most_money.py|[528d36d7cc451cd7e4000339](https://www.codewars.com/kata/528d36d7cc451cd7e4000339)| From c00cbd030b5d2980bda9d8681a0a4a9ba0819f04 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Tue, 10 Mar 2026 16:36:56 +0100 Subject: [PATCH 32/40] feat: kata 'Who has the most money' compleated. --- src/codewars/kata_who_the_most_money.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/codewars/kata_who_the_most_money.py diff --git a/src/codewars/kata_who_the_most_money.py b/src/codewars/kata_who_the_most_money.py new file mode 100644 index 0000000..a521421 --- /dev/null +++ b/src/codewars/kata_who_the_most_money.py @@ -0,0 +1,15 @@ +class Student: + def __init__(self, name, fives, tens, twenties): + self.name = name + self.fives = fives + self.tens = tens + self.twenties = twenties + + +def most_money(students): + student_names = [x.name for x in students] + student_money = [x.fives * 5 + x.tens * 10 + x.twenties * 20 for x in students] + + if len(set(student_money)) == 1 and len(student_money) > 1: + return "all" + return max(list(zip(student_names, student_money)), key=lambda x: x[1])[0] From d010de0fe5cac0c77fec89f5bb447a78d52c6db4 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Tue, 10 Mar 2026 16:38:11 +0100 Subject: [PATCH 33/40] test: test cases for kata 'Who has the most money' --- tests/codewars/test_who_the_most_money.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tests/codewars/test_who_the_most_money.py diff --git a/tests/codewars/test_who_the_most_money.py b/tests/codewars/test_who_the_most_money.py new file mode 100644 index 0000000..f7aeeff --- /dev/null +++ b/tests/codewars/test_who_the_most_money.py @@ -0,0 +1,15 @@ +from src.codewars.kata_who_the_most_money import Student, most_money + + +def test_most_money(): + phil = Student("Phil", 2, 2, 1) + cam = Student("Cameron", 2, 2, 0) + geoff = Student("Geoff", 0, 3, 0) + + assert most_money([cam, geoff, phil]) == "Phil" + + phil = Student("Phil", 2, 2, 2) + cam = Student("Cameron", 2, 2, 2) + geoff = Student("Geoff", 2, 2, 2) + + assert most_money([cam, geoff, phil]) == "all" From bc00bcf5f354c300dd2e6aa3b6cee5d3a317026e Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 11 Mar 2026 17:19:06 +0100 Subject: [PATCH 34/40] chore: added context for kata 'Next bigger number with the same digits' --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5b89577..47056a2 100644 --- a/README.md +++ b/README.md @@ -28,3 +28,4 @@ Repository for CDS-2020 Programming and Promt Engineering II |Building blocks|kata_building_blocks.py|test_building_blocks.py|[55b75fcf67e558d3750000a3](https://www.codewars.com/kata/55b75fcf67e558d3750000a3)| |PaginationHelper|kata_pagination_helper.py|test_pagination_helper.py|[515bb423de843ea99400000a](https://www.codewars.com/kata/515bb423de843ea99400000a)| |Who has the most money?|kata_who_the_most_money.py|test_who_the_most_money.py|[528d36d7cc451cd7e4000339](https://www.codewars.com/kata/528d36d7cc451cd7e4000339)| +|Next bigger number with the same digits|kata_next_bigger_number_same_digits.py|test_next_bigger_number_same_digits.py|[55983863da40caa2c900004e](https://www.codewars.com/kata/55983863da40caa2c900004e)| From 01a6ff1ead8961604c4d1ea13dce4a0ae84a0ba3 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 11 Mar 2026 17:45:04 +0100 Subject: [PATCH 35/40] feat: kata next biggest number. Works but struggles with big numbers. test: test cases for kata 'Next bigger number with the same digits' --- .../kata_next_bigger_number_same_digits.py | 16 ++++++++++++++++ .../test_next_bigger_number_same_digits.py | 11 +++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/codewars/kata_next_bigger_number_same_digits.py create mode 100644 tests/codewars/test_next_bigger_number_same_digits.py diff --git a/src/codewars/kata_next_bigger_number_same_digits.py b/src/codewars/kata_next_bigger_number_same_digits.py new file mode 100644 index 0000000..2a43b40 --- /dev/null +++ b/src/codewars/kata_next_bigger_number_same_digits.py @@ -0,0 +1,16 @@ +def next_bigger(n): + digits = list(str(n)) + digits.sort(reverse=True) + number = int("".join(digits)) + if number == n: + return -1 + + for i in range(n + 1, number + 1): + higher_number = list(str(i)) + higher_number.sort(reverse=True) + + if higher_number == digits: + return i + + +print(next_bigger(84876644310)) diff --git a/tests/codewars/test_next_bigger_number_same_digits.py b/tests/codewars/test_next_bigger_number_same_digits.py new file mode 100644 index 0000000..d743d70 --- /dev/null +++ b/tests/codewars/test_next_bigger_number_same_digits.py @@ -0,0 +1,11 @@ +from src.codewars.kata_next_bigger_number_same_digits import next_bigger + + +def test_next_bigger(): + assert next_bigger(12) == 21 + assert next_bigger(21) == -1 + assert next_bigger(513) == 531 + assert next_bigger(2017) == 2071 + assert next_bigger(414) == 441 + assert next_bigger(144) == 414 + # assert next_bigger(84876644310) == From 5797eb8ef96673b9b4a00ba18e635ab67a12a1ac Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 11 Mar 2026 21:44:56 +0100 Subject: [PATCH 36/40] test: added a large number test case for kata 'Next bigger number with the same digits' --- tests/codewars/test_next_bigger_number_same_digits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/codewars/test_next_bigger_number_same_digits.py b/tests/codewars/test_next_bigger_number_same_digits.py index d743d70..9b5583d 100644 --- a/tests/codewars/test_next_bigger_number_same_digits.py +++ b/tests/codewars/test_next_bigger_number_same_digits.py @@ -8,4 +8,4 @@ def test_next_bigger(): assert next_bigger(2017) == 2071 assert next_bigger(414) == 441 assert next_bigger(144) == 414 - # assert next_bigger(84876644310) == + assert next_bigger(84876644310) == 86013446784 From c16bdad9b94320e2b062bfa948d273193c463dcf Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 11 Mar 2026 22:02:34 +0100 Subject: [PATCH 37/40] feat: function now finds pivot of number. Returns -1 if there is no pivot --- .../kata_next_bigger_number_same_digits.py | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/codewars/kata_next_bigger_number_same_digits.py b/src/codewars/kata_next_bigger_number_same_digits.py index 2a43b40..e1e1533 100644 --- a/src/codewars/kata_next_bigger_number_same_digits.py +++ b/src/codewars/kata_next_bigger_number_same_digits.py @@ -1,16 +1,16 @@ def next_bigger(n): - digits = list(str(n)) - digits.sort(reverse=True) - number = int("".join(digits)) - if number == n: + digits = [int(x) for x in list(str(n))] + + pivot = -1 + for i in range(1, len(digits)): + if digits[-1] > digits[-2 * i]: + pivot = -2 * i + break + if pivot == -1: return -1 - for i in range(n + 1, number + 1): - higher_number = list(str(i)) - higher_number.sort(reverse=True) - - if higher_number == digits: - return i + print(pivot) + return digits -print(next_bigger(84876644310)) +print(next_bigger(534976)) From fbe9f4bf02d2f29664e72d7b5d9371262e9a23a7 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 11 Mar 2026 22:22:40 +0100 Subject: [PATCH 38/40] function will now swamp pivot with lowest number right of pivot --- src/codewars/kata_next_bigger_number_same_digits.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/codewars/kata_next_bigger_number_same_digits.py b/src/codewars/kata_next_bigger_number_same_digits.py index e1e1533..4ed4307 100644 --- a/src/codewars/kata_next_bigger_number_same_digits.py +++ b/src/codewars/kata_next_bigger_number_same_digits.py @@ -9,7 +9,13 @@ def next_bigger(n): if pivot == -1: return -1 - print(pivot) + right = digits[pivot + 1 :] + swamp = right.index(min(right)) + print(digits) + digits[pivot], digits[len(digits) - len(right) + swamp] = ( + right[swamp], + digits[pivot], + ) return digits From 9df3b783fb033fc776150c55c6ddbf84fdc28748 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 11 Mar 2026 23:41:59 +0100 Subject: [PATCH 39/40] feat: kata finished. Now correctly finds next bigger number. test: added test cases --- .../kata_next_bigger_number_same_digits.py | 28 +++++++++++++------ .../test_next_bigger_number_same_digits.py | 6 +++- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/codewars/kata_next_bigger_number_same_digits.py b/src/codewars/kata_next_bigger_number_same_digits.py index 4ed4307..57e8802 100644 --- a/src/codewars/kata_next_bigger_number_same_digits.py +++ b/src/codewars/kata_next_bigger_number_same_digits.py @@ -1,22 +1,34 @@ def next_bigger(n): + # get number as digits in list digits = [int(x) for x in list(str(n))] + # find index of pivot. return -1 if there is no pivot, meaning number is alreadig biggest pivot = -1 for i in range(1, len(digits)): - if digits[-1] > digits[-2 * i]: - pivot = -2 * i + if digits[-i] > digits[-i - 1]: + pivot = -i - 1 break + if pivot == -1: return -1 + # find the smallest digit to the right that is bigger than the pivot right = digits[pivot + 1 :] - swamp = right.index(min(right)) - print(digits) - digits[pivot], digits[len(digits) - len(right) + swamp] = ( - right[swamp], + swap = right.index(min([x for x in right if x > digits[pivot]])) + + # swap pivot with found digit + digits[pivot], digits[len(digits) - len(right) + swap] = ( + right[swap], digits[pivot], ) - return digits + + # sort right side of new swapped pivot and replace it at the end + right = digits[pivot + 1 :] + right.sort() + digits[pivot + 1 :] = right + + # return number + return int("".join([str(x) for x in digits])) -print(next_bigger(534976)) +print(next_bigger(5113455566888)) diff --git a/tests/codewars/test_next_bigger_number_same_digits.py b/tests/codewars/test_next_bigger_number_same_digits.py index 9b5583d..a1793a5 100644 --- a/tests/codewars/test_next_bigger_number_same_digits.py +++ b/tests/codewars/test_next_bigger_number_same_digits.py @@ -8,4 +8,8 @@ def test_next_bigger(): assert next_bigger(2017) == 2071 assert next_bigger(414) == 441 assert next_bigger(144) == 414 - assert next_bigger(84876644310) == 86013446784 + assert next_bigger(1234567890) == 1234567908 + assert next_bigger(59884848459853) == 59884848483559 + assert next_bigger(7600201336) == 7600201363 + assert next_bigger(5113455566888) == 5113455568688 + assert next_bigger(4769560370633) == 4769560373036 From ce9a4029b70cd4715a555804b9083c0c5bea62b5 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Wed, 11 Mar 2026 23:57:28 +0100 Subject: [PATCH 40/40] refractor: removed print statement, that was ment for development --- src/codewars/kata_next_bigger_number_same_digits.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/codewars/kata_next_bigger_number_same_digits.py b/src/codewars/kata_next_bigger_number_same_digits.py index 57e8802..59469d3 100644 --- a/src/codewars/kata_next_bigger_number_same_digits.py +++ b/src/codewars/kata_next_bigger_number_same_digits.py @@ -29,6 +29,3 @@ def next_bigger(n): # return number return int("".join([str(x) for x in digits])) - - -print(next_bigger(5113455566888))