From d74023736a7ac7dee1a36c2a28753f654885e410 Mon Sep 17 00:00:00 2001 From: momstrosity Date: Wed, 21 May 2025 10:06:27 -0300 Subject: [PATCH 1/4] Start draft PR From e188971d8ed237cc339901094b812bc5ab01744a Mon Sep 17 00:00:00 2001 From: momstrosity Date: Wed, 21 May 2025 10:06:39 -0300 Subject: [PATCH 2/4] Add string reversal function with type checking and docstring --- src/string_reversal.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/string_reversal.py diff --git a/src/string_reversal.py b/src/string_reversal.py new file mode 100644 index 0000000..8767d51 --- /dev/null +++ b/src/string_reversal.py @@ -0,0 +1,19 @@ +def reverse_string(input_string: str) -> str: + """ + Reverse a given string. + + Args: + input_string (str): The string to be reversed. + + Returns: + str: The reversed string. + + Raises: + TypeError: If the input is not a string. + """ + # Check for invalid input type + if not isinstance(input_string, str): + raise TypeError("Input must be a string") + + # Return the reversed string + return input_string[::-1] \ No newline at end of file From 28586f57a681f56991cce56e6879b6bd0e9b1726 Mon Sep 17 00:00:00 2001 From: momstrosity Date: Wed, 21 May 2025 10:06:48 -0300 Subject: [PATCH 3/4] Add comprehensive tests for string reversal function --- tests/test_string_reversal.py | 38 +++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 tests/test_string_reversal.py diff --git a/tests/test_string_reversal.py b/tests/test_string_reversal.py new file mode 100644 index 0000000..dc3503f --- /dev/null +++ b/tests/test_string_reversal.py @@ -0,0 +1,38 @@ +import pytest +from src.string_reversal import reverse_string + +def test_reverse_string_basic(): + """Test basic string reversal.""" + assert reverse_string("hello") == "olleh" + assert reverse_string("python") == "nohtyp" + +def test_reverse_string_empty(): + """Test reversal of an empty string.""" + assert reverse_string("") == "" + +def test_reverse_string_single_char(): + """Test reversal of a single character string.""" + assert reverse_string("a") == "a" + +def test_reverse_string_with_spaces(): + """Test reversal of string with spaces.""" + assert reverse_string("hello world") == "dlrow olleh" + +def test_reverse_string_with_special_chars(): + """Test reversal of string with special characters.""" + assert reverse_string("a1b2c3!@#") == "#@!3c2b1a" + +def test_reverse_string_unicode(): + """Test reversal of string with unicode characters.""" + assert reverse_string("こんにちは") == "はちにんこ" + +def test_reverse_string_invalid_input(): + """Test that a TypeError is raised for non-string inputs.""" + with pytest.raises(TypeError, match="Input must be a string"): + reverse_string(123) + + with pytest.raises(TypeError, match="Input must be a string"): + reverse_string(None) + + with pytest.raises(TypeError, match="Input must be a string"): + reverse_string(["hello"]) \ No newline at end of file From 21d38c335e94a537ee4cbc69532a1f86a9105199 Mon Sep 17 00:00:00 2001 From: momstrosity Date: Wed, 21 May 2025 10:07:30 -0300 Subject: [PATCH 4/4] Implement string reversal using manual character swapping --- .../string_reversal.cpython-312.pyc | Bin 0 -> 738 bytes src/string_reversal.py | 20 +++++++++++++++--- ...ring_reversal.cpython-312-pytest-8.3.5.pyc | Bin 0 -> 6898 bytes 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 src/__pycache__/string_reversal.cpython-312.pyc create mode 100644 tests/__pycache__/test_string_reversal.cpython-312-pytest-8.3.5.pyc diff --git a/src/__pycache__/string_reversal.cpython-312.pyc b/src/__pycache__/string_reversal.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51816da7c1db6f57832d3dfea96a46bf40a92f92 GIT binary patch literal 738 zcmY*Xzi-n(6uz@fY4dAns}dxNPE55>YBC{J2niu1x^xJgSRyBWaV!$sdUq~L)uBSL zv$bpt450ogAdw0t3yFb=EmAtMz&rnl!n6F|yL;dJ?(_3~uGcG!?C00k@C#?`mtK@+ z70G;)k~8KpU>*lHusq|n^_)*k+e&Le7$>SL6$YW7t{|uc!#*)BOtYBu&YzMyV`@=5 zVag~`7eywk>RP$y@rwfcik~pgpvQb;-lXy~W?RRX6+za4BR~nl6@G98p~!{oRcQ{7WVV@B0vUu-xnUntlRDG21;5Qv zk5KA~i9ew;jK<)M+yq_650rj~NzaLqwn;@IodLM?tDx0Of{_R4yo~S#g$Vm@%k?2t zjsmHqgAhl#@3!wd68larxtkBb9qq=Gv{6i>xCf~3lvX0|k~?Krw^(iK?dZef@70|j zjT_VEy>E^7bhSNOVYTKv>-^5Sby?k>THAAivjf|}>l8DVPYkO%Un7^UJ{U({GJ=O# dr)73PlaiUqIiDHp{Pz2e8KdxV<4T9D^B?N3$kG4+ literal 0 HcmV?d00001 diff --git a/src/string_reversal.py b/src/string_reversal.py index 8767d51..3650d4f 100644 --- a/src/string_reversal.py +++ b/src/string_reversal.py @@ -1,6 +1,6 @@ def reverse_string(input_string: str) -> str: """ - Reverse a given string. + Reverse a given string using a manual character-by-character reversal approach. Args: input_string (str): The string to be reversed. @@ -15,5 +15,19 @@ def reverse_string(input_string: str) -> str: if not isinstance(input_string, str): raise TypeError("Input must be a string") - # Return the reversed string - return input_string[::-1] \ No newline at end of file + # Handle empty string case + if not input_string: + return "" + + # Convert string to list of characters and reverse manually + char_list = list(input_string) + left, right = 0, len(char_list) - 1 + + while left < right: + # Swap characters + char_list[left], char_list[right] = char_list[right], char_list[left] + left += 1 + right -= 1 + + # Convert back to string + return ''.join(char_list) \ No newline at end of file diff --git a/tests/__pycache__/test_string_reversal.cpython-312-pytest-8.3.5.pyc b/tests/__pycache__/test_string_reversal.cpython-312-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0236e3d9d2ce5c01202a52303bc4fe90a5ffaeb4 GIT binary patch literal 6898 zcmeHM&2JmW72hR?pDWpl-5QlGr7O|2NvIShJF=sob}a=hkb`~lB|-sW#a)SXmRw?H zX^D&k*hww{3^afPM28&Mn*zv zK$c2mAtZ~O@In}J0%oKXU5J7#_@1;7(+SYH9s;W9VW0zg1n8h11$sh{0XwkSvSqKpnzZfWby*Lr2iD}Zz*{Lv zS`V%T+23u{j6Ffy|bwt&!!m5JN;(;XE~d-SbCs-?zX{f zbx~u*yeiCD71phplTN5$n5N}~EYma!Tk_MuwQE~)eJYu%)Lu!m_}eZ}uc?Tp(kzAF zOKFyludCOD^lF+>G>I+Z1fdL)OGsWpa`ov6jWL7Tyn@*@L*eW#CtRu71*`0Y%T~dz zRkmWh3MYO8(dCfF))Tq$BRjO#za0Vbdw^%KjcCpNyuxUXF=KLnd3RczB zdC}amX)S7IuB?>|CzfN{l7TfiC+2uJidOlLlv>m|om;YKNwagtYQ@ybnhiNyVMoCh zM31L?najP*m0o5>Frv0sMHdA#J;lIWC6%YA)oj5k8Cg@SQZ2h&wDB!e7qb-#V!L2e zS$4_L>?$=f_zQJ|W>+lw7JMw4*D~6&QMR)TPabww6^#N4<#aU=J3mr(cl?0&1Dv+j^{L~*A)oP zr!7VrL!J%quK@<_boJG&hiqW|jb_2Dq~eKI81j z&&=789+%Q@+wZyUwl_O~>kEw{d&)EJn4KRIRKUrHWm1 zcgsmfqPPrb3<+*@6b}~^y)H#JdyAe%I0B@{-f05({?^B9r*JBguuAqW5VXFLCP~2J zA8#w8fEuTOG?mfDsg{!1C;05T0>SyTg=&IpcVUMlHpYc?hwJ&camrWq!5&G_B=qBW z@q1?@IO+ZJ7yrc3#ji3r@SBF3FKATD+XnT`K-ON|4u0Fu3yGF;*b<$9#W&b%4PXOF zu!clic^Oax{6Vs*yxd5%l;l3aXV(=7&ZjL@6I{CsJ0!UQCWLxBT+hc1S1bgA?vdn= zv4-P&4@@Mc|ErU7yngtfJ)&Hd$Brky(YanW@(m-K5rv%8$=Kv2|dh zIngN1z+k=vukR}^HpwhlN2aZ$0Bzm`(o|BLH(Sc=KEY?#6$s9!EmRX+y9+yHb_0%g zsJFxQe7t#6z+SpXW{<4{m$!fT`K3n%;2s&TPd&#vjC@fuyKVz4C8kX;Udmq{yOF5J z5;w*!=PxZz{|Fy)p`Q(n3-S0>l;h5NoK%UCfdpcK${aln#zUEiIy_6 zPw?4w1%mTw3)KYI?!pe4*_aU09j@o&O;_w!0AP>I92*PT%CWIvBvs|Eq*^ZKExqTA z#U`tGojADv@ZgN6V7e(oQE&&WX|<7AGarT8d@KQm%R@JFC$KTgg+$Oj zGI!K+FrI=}u)_ksk9Pylcf2q;WO~WQ;08~+{I|fiTVh6%rS2_T4|)fF2$mE4^U6Uf zHMySmAy0?v zSNP^{7c^Vd)Z4X+!GmaOk*QQGGDBA(;-!|Ya>hL|70Z>X4KCo!8wk`=6+@5)=!$&! z7efeQZ~4NvZ^QiDqVPWtDNT4#5N_j6m{-c2nBS5JFiLzuh@16TzvWyk-_^{bp5x8a zS*UdsUUm=2J?ZP%$-j)gKl)*MB@8ZWx?l$>8z{icgin$mP5W^k)eaX_Rrg5GA0c2@tvl1!Y