From ac61026d961ae5b8f0c3fbfc8f4aa424054a9963 Mon Sep 17 00:00:00 2001 From: Sarthak Singh <23.sarthak.official@gmail.com> Date: Sun, 5 Apr 2026 23:14:00 +0530 Subject: [PATCH 1/8] nuygvuy --- matrix.py | 0 test_matrix.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 matrix.py create mode 100644 test_matrix.py diff --git a/matrix.py b/matrix.py new file mode 100644 index 0000000..e69de29 diff --git a/test_matrix.py b/test_matrix.py new file mode 100644 index 0000000..e69de29 From 282d6ada220ec37cadfee4f31abc4470ca96dbae Mon Sep 17 00:00:00 2001 From: Sarthak Singh <23.sarthak.official@gmail.com> Date: Mon, 6 Apr 2026 12:13:26 +0530 Subject: [PATCH 2/8] Added matrix addition with rows and cols --- matrix.py | 31 +++++++++++++++++++++++++++++++ test_matrix.py | 4 ++++ 2 files changed, 35 insertions(+) diff --git a/matrix.py b/matrix.py index e69de29..e5d63c4 100644 --- a/matrix.py +++ b/matrix.py @@ -0,0 +1,31 @@ +def parse_matrix(mat_str): + import ast + return ast.literal_eval(mat_str) + +def add_matrix(a, b): pass + +def matrix_add(self, A, B): + A = self.parse_matrix(A) + B = self.parse_matrix(B) + + if not A or not B: + raise ValueError("Empty matrix") + + rows = len(A) + cols = len(A[0]) + + if rows != len(B) or cols != len(B[0]): + raise ValueError("Matrix dimensions must match") + + result = [] + for i in range(rows): + row = [] + for j in range(cols): + row.append(A[i][j] + B[i][j]) + result.append(row) + + return str(result) + +def subtract_matrix(a, b): pass +def multiply_matrix(a, b): pass +def transpose_matrix(a): pass diff --git a/test_matrix.py b/test_matrix.py index e69de29..e3e3cc1 100644 --- a/test_matrix.py +++ b/test_matrix.py @@ -0,0 +1,4 @@ +def test_add(): + from matrix import Matrix + m = Matrix() + assert m.matrix_add('[[1,2],[3,4]]', '[[5,6],[7,8]]') == '[[6, 8], [10, 12]]' \ No newline at end of file From bc2f1f3f31e614d1434340a63bafd8d986029d78 Mon Sep 17 00:00:00 2001 From: Sarthak Singh <23.sarthak.official@gmail.com> Date: Mon, 6 Apr 2026 12:35:30 +0530 Subject: [PATCH 3/8] Added matrix multiplication --- matrix.py | 30 ++++++++++++++++++++++++++++-- test_matrix.py | 7 ++++++- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/matrix.py b/matrix.py index e5d63c4..88db64c 100644 --- a/matrix.py +++ b/matrix.py @@ -2,8 +2,6 @@ def parse_matrix(mat_str): import ast return ast.literal_eval(mat_str) -def add_matrix(a, b): pass - def matrix_add(self, A, B): A = self.parse_matrix(A) B = self.parse_matrix(B) @@ -28,4 +26,32 @@ def matrix_add(self, A, B): def subtract_matrix(a, b): pass def multiply_matrix(a, b): pass + +def matrix_multiply(self, A, B): + A = self.parse_matrix(A) + B = self.parse_matrix(B) + + if not A or not B: + raise ValueError("Empty matrix") + + rows_A = len(A) + cols_A = len(A[0]) + rows_B = len(B) + cols_B = len(B[0]) + + if cols_A != rows_B: + raise ValueError("Invalid dimensions for multiplication") + + result = [] + for i in range(rows_A): + row = [] + for j in range(cols_B): + val = 0 + for k in range(cols_A): + val += A[i][k] * B[k][j] + row.append(val) + result.append(row) + + return str(result) + def transpose_matrix(a): pass diff --git a/test_matrix.py b/test_matrix.py index e3e3cc1..68390f1 100644 --- a/test_matrix.py +++ b/test_matrix.py @@ -1,4 +1,9 @@ def test_add(): from matrix import Matrix m = Matrix() - assert m.matrix_add('[[1,2],[3,4]]', '[[5,6],[7,8]]') == '[[6, 8], [10, 12]]' \ No newline at end of file + assert m.matrix_add('[[1,2],[3,4]]', '[[5,6],[7,8]]') == '[[6, 8], [10, 12]]' + +def test_multiply(): + from matrix import Matrix + m = Matrix() + assert m.matrix_multiply('[[1,2],[3,4]]', '[[5,6],[7,8]]') == '[[19, 22], [43, 50]]' \ No newline at end of file From 0289632ce32360c1449eb4fac03fa188309598c4 Mon Sep 17 00:00:00 2001 From: Sarthak Singh <23.sarthak.official@gmail.com> Date: Mon, 6 Apr 2026 12:40:31 +0530 Subject: [PATCH 4/8] Added matrix transpose --- matrix.py | 19 +++++++++++++++++-- test_matrix.py | 7 ++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/matrix.py b/matrix.py index 88db64c..ee0af2d 100644 --- a/matrix.py +++ b/matrix.py @@ -25,7 +25,6 @@ def matrix_add(self, A, B): return str(result) def subtract_matrix(a, b): pass -def multiply_matrix(a, b): pass def matrix_multiply(self, A, B): A = self.parse_matrix(A) @@ -54,4 +53,20 @@ def matrix_multiply(self, A, B): return str(result) -def transpose_matrix(a): pass +def matrix_transpose(self, A): + A = self.parse_matrix(A) + + if not A: + raise ValueError("Empty matrix") + + rows = len(A) + cols = len(A[0]) + + result = [] + for j in range(cols): + row = [] + for i in range(rows): + row.append(A[i][j]) + result.append(row) + + return str(result) \ No newline at end of file diff --git a/test_matrix.py b/test_matrix.py index 68390f1..93f684b 100644 --- a/test_matrix.py +++ b/test_matrix.py @@ -6,4 +6,9 @@ def test_add(): def test_multiply(): from matrix import Matrix m = Matrix() - assert m.matrix_multiply('[[1,2],[3,4]]', '[[5,6],[7,8]]') == '[[19, 22], [43, 50]]' \ No newline at end of file + assert m.matrix_multiply('[[1,2],[3,4]]', '[[5,6],[7,8]]') == '[[19, 22], [43, 50]]' + +def test_transpose(): + from matrix import Matrix + m = Matrix() + assert m.matrix_transpose('[[1,2],[3,4]]') == '[[1, 3], [2, 4]]' \ No newline at end of file From 96bd5e957a6ce8fd61f7a37f0001a670f4136019 Mon Sep 17 00:00:00 2001 From: Sarthak Singh <23.sarthak.official@gmail.com> Date: Mon, 6 Apr 2026 12:49:42 +0530 Subject: [PATCH 5/8] Added matrix subtraction --- __pycache__/calculator.cpython-313.pyc | Bin 0 -> 1220 bytes __pycache__/fraction.cpython-313.pyc | Bin 0 -> 2287 bytes __pycache__/matrix.cpython-313.pyc | Bin 0 -> 3359 bytes ...st_calculator.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 2904 bytes ...test_fraction.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 2530 bytes .../test_matrix.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 5102 bytes matrix.py | 22 +++++++++++++++++- test_matrix.py | 7 +++++- 8 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 __pycache__/calculator.cpython-313.pyc create mode 100644 __pycache__/fraction.cpython-313.pyc create mode 100644 __pycache__/matrix.cpython-313.pyc create mode 100644 __pycache__/test_calculator.cpython-313-pytest-9.0.2.pyc create mode 100644 __pycache__/test_fraction.cpython-313-pytest-9.0.2.pyc create mode 100644 __pycache__/test_matrix.cpython-313-pytest-9.0.2.pyc diff --git a/__pycache__/calculator.cpython-313.pyc b/__pycache__/calculator.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dae6a2fd1d4700f7959d5ee080bdeaef5528e21c GIT binary patch literal 1220 zcmah|O-~b16uobzg`ppO216Ru(GZd*ibRD)W847Bs+$Rh#3nD(nFkI|JN3OcL|Cyh z8aHmb^at>7h{nWBT$t#FouLc1-aDN_Nl18$(|g~?J?EY~?Ul;~!1eU&w_wu%_(REH z<+7kRhd~$S;66A|0f(*NO8ksD&mXGoD$(q!rX*46f-lBYBN8BR;)AJ{{AAO%*J}E6{3VX_TWYE?a1b?ma$@q&O*2}bo^uwuFS!yHxTP)7oZcA{U6gWqYIHb75 z`McN+vy%zVcLJ$&7_>z@;#}Ur!g8EohTs+fxghT%B(t0=?drheuGTVW##$(Rlzy@F z-KF{^*_Q(Kr0yYnfZxT^(fV1A?3)ylxlRo&XR|(D<~-49+o;2ac&E_+h}oFBB7{={$Uoi%M0Ww|k4K zLYlqqh$|gton>YW{=hC2GeuUoZ)EL^I;$P>BjcTBwD`zr z%GP;fIKBU*(r9BAb8!jI_Bq)Pkq%`iKC~Sl+7hl14$o43|J+l_T^4s5))$v5W8>8-JE7Pey}>+}`g&YowFHy)R7ZH-quQ z!mLXL`Q{jSg(F^gj4k=*+u#+Ccwq&2d%!EX-Z!D zk>{~Tk4XzrrL;UBIOYbkg^UXcGC&p^52~N&A!x#*c^aoRXpT$?Z;>2L2If`pYmG#IWv8`$vH0 zMY+sj9q4beO3TQs0&|*==JK;nMDIe?je&t010l|r8-w3DN3OA*BlD1EAgl-DV;JA_ zFLd!(oPYrSEhu1%Pi&f@&)cE%zUo=M))?#uNGP_>*WTTYcW&Hya(y=(-;Azl|7o?h zuiskx>DERRWj( zc-cqV1`Y_tokV&oeb=gy=}KsNUqH{F9LxSi$JG@1KGkte622pI$pAb_nx!urn&t#G zZMm>i%HuesX&;yLe0`=>({d)`cHXq$8ev-CHe(W}o0)e@w!t-x z;eR~qN9C3idz7KVi{w#IUy^;XPfC@iUlREIb|oTB*5Wa0E-5%o-t}|$_TAOTV4c9_ f+ODs#v#<(@$0MNN(3Jj2`hOS4>Ey2jlnebAc*y;f literal 0 HcmV?d00001 diff --git a/__pycache__/matrix.cpython-313.pyc b/__pycache__/matrix.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb86110f84ed3892d0f9c145ba935157b4b03f57 GIT binary patch literal 3359 zcmeHK%}*Og6rcUDy|&jMd<4gQBu+yrh#(bBOH&#}F@ZEq3srG9qJq@g+MCqLvNkgd zlpZRiN)?ETm`XuDg3=4e{u7mYGqOa`mIG3&O1ULCr=I#|Kg*F zDOpbw9b+Dh2n!;SF#4|zOiDz-Wb*ZkM8=at3c0W63zG$$zo%sM$<%QAnyhAKR9VmC zNmv2rzPM1BH^hRBiITP^Fx&v5`yeeK7SPXpcqbTs9BkVPww2zk1Ut)oXB9Lk<3559 zCg`~OBe*_95*l+~12u;xG0p+u3hG<1H49c^x-2&&!|D?2jIu$5CTg)$wKWxH!ecwQ zBXRE86iZENF?h+Xt;HUgLnzw_F?p9S`=T$kkzd>i=d7zRuOZDdLGQ$DQccr@Zd^x5 z^Mc;z(({fd=+A&&kbGl)$NS)WyoK&w5~v)1^`PGiV`qf~8aazl5G9c0skesYb6MW7 zEGOU`R+BuAwi9jgqrZ#8Qw4oKVIzZH`j_n^CT z;Fhe;D8m@%vB9Z|W_Yly-Bk>)Tqr17*5ClTn|^~Qih9Rjk_Izq@Hjt53_g=riQ&Zx znNf9v$r&6>8_YdIuOs0!Ot01mSldd=*(~mW33?&bpFk|29YK67#J7Za=}bjvUq~Jv z{}vS2lDpxPrBjt~S6S%#H5gu;UhZEQ+NGUh!;-%I_QKGfFZeAf_ASqT{Z*;?`=<4e z)~7c&r#GCSeuBDdSnQqy_8&?TW{ECUY9pwTd}TfvHKZ^8awuc@Pp7&sF>LnTA%q*IR0EjVq|f4`JFP~ zg6XOM&$E9`p20KWK#}_Sfa(pc4}ib=kJ8%l?wzWhozF?i#N{@xYH_ z5%z#h!anz&1~o%2>t^gbc?_(r>bZiN%g8#gxCy}S5N@V^a5jYL^AAi6tej37Udqe# z+Z+$t<3Sv!maSBnaBQbO9E3BN`-DQ;VQll;qHPDvcKmrvAND@@kS8Gi26u;|#fIfu zl!KvD>|1SK{=^;}ncee+D!!P>-d8K(WLZeo*t>t_wu`-I*E)c`8=Drd?Ve~Y^{?G7 zGCR?xQo|7*-->p9#{rYKoZYjzo~(QbMBaG%X#n{n2izV(;kM_Ehq;|rZcg(;hyG&K z3&+jcT7~o%Ya-T_Q&7fIygJy@ILHa!g?V?*Tmd|LK<{?T!~<%~T7|FYBh~T|EUz9xd@UOR@th0s7L)}SlpzBVK1qd%SBg>#uN1jN0O8=& zf@sv{TOeDF6!K6~p9h-{sPQ)-j$#z*iI-Os$FCE%#nZ3%4cU(MMF3!k(6{3$$1u!3%QENog=QwU-(!k66RY+|nV9*q`~jN- BBLe^c literal 0 HcmV?d00001 diff --git a/__pycache__/test_calculator.cpython-313-pytest-9.0.2.pyc b/__pycache__/test_calculator.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c83e67e350d3ebdd216e2f17faadf200cdbde60d GIT binary patch literal 2904 zcmd5;-%le|6u#4$wnN(iRv=O+&~|lofUvL|SS73L%JKkfn$TIyCfj5(l!1(vw%nPj z?9(P1qb7z;3|@s_{s8}pTCwCtqlr&_+knQz2lbqpPFo7BK9Rl2d~@$P=l=N4 zJ#)?+Nm777`|Z*9#Mfr^-AFY9`RPX4eZ^hKe9# zytced+o0#Th#~&E)>|*MYFJEQ7vtq!5`G8^9Mx;RxvLEoZw#x zkCehA#hb7Bz44?uB7Don2gb5~!W%)`8;+9oo#qQihl%;DsE|uxxfm-hl*5(5nvr2cXWz1IfOW3fFa0I4fBV+%+|FDjGFpm^78mwB<;c~& zg?;hbGlKpbSZ0fyUIp&eYrtf!MtDdRZ3URr(vtob0SudKgZ)v% zu)~TcN`_zu43RhZA+o~B5GWYa6i*@xEaW&esTrnjvcS7qrl8MKnxl3?J>9ik&8}VA zQ19zB$KucMZq242wlv29Aj3)*D$-y{8hmtrUm89Lb#BgmK354vN}It=9UW??1xkp z>tapQp{gqeHLZ-1)w4NOrI_+5eh#z`VFx3ZPTfC&Ug2yVO!F%r@Yqnr{PqN)83i8$0xI-U)bdj>fq}imzvr4fB>(^b literal 0 HcmV?d00001 diff --git a/__pycache__/test_fraction.cpython-313-pytest-9.0.2.pyc b/__pycache__/test_fraction.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b94765d1f93ef15b0a9ea523db89a9fa083203e GIT binary patch literal 2530 zcmd5;TW=dh6rR14d;vDeYU#x^tS zqWG!eS|kupK|uo1NAe3m;#ZhZ9F0Ic@YJ`cE<)moGqYYNO_T5j9m(I$nK?6azBxzV zxSL4C5VVBiR}qoKSDsg>oI>*|38nm*FbTtqd^Iw! z5iNy=&;&A-VPvYMaPfGs<<7SNr}0K&rMMY7e*+;4yuf$JAK#4=sL(T0Xjxj8jPQMK zFBlR#{u;5$o>Q;QT5h@NT3(%$cQ2KCM)wkQ)=){rPh?XfiYX5xqVgC?$W#HtW(Y81 zh5U_Z)>mxSQ;7IfCo zA}aP-a9_W{DCfVY6@zlxHEv3U-g;9m^wvO%k)bTKA~X3yW;$PJDQEJ94TZ%m3RmFG zz1y^0qQNFC%CCy&+$K@5{mUY8KBb9EuqqWcegNyhftP>xB*1O7rRg1QsI3jH4}6>a zD%nY9+sW*AZ*C^f{4jV=dzl;ouSc@{AK%6c;x;Dp1#%1`d5m*HP@>HxkLR8}dl>P+ zi&G+l9R62wQ~Bxibbh9#Oy;K!Be&9YJ*VNW9!@Us;;Qpxkjo2lXY=RwCl?o)t2nou zip?et%bV|W;z=PklbQ0fHn~5sUP(GD4cDpuOV()5YxrPtT%?5htV8D@^|{&Co7$&f+2rt>dm zpq34l>Aq|gEr;5a#on;oraebUod^vhqDJ?s*Py5er*_M7ol0NIS@y8X*y}w8LDC!m z=vv~bPGYQ`82h?)FOlBTk9~3F(<>c)yseMljsC2s|5DJAOec~4C6WG{@>sqcc}e*( z_DVEjNFvGwLuVSsHEYGjn8h$&saKjV@9P+IJ?_mM#klGa>bXwMuGKLn{6Qg4b9jb> zNbM-^r8qnXzy>jWXX@bC2!ISUg| zT!@|n*j6M-`W>MU(FaF=L#H09BT{DlMrSnF9?d;OU~FGNs(z=nsU){l{gZ3&U;F6w LZ3U^rV(WhZdmHrZ literal 0 HcmV?d00001 diff --git a/__pycache__/test_matrix.cpython-313-pytest-9.0.2.pyc b/__pycache__/test_matrix.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1441c5f9d742db61eb671c446cc3d08bf8b341d1 GIT binary patch literal 5102 zcmeHLOK%%h6ux7RpOZ&lg0>`dh*Z&$jOAyVv~fk#L_)17YR0Y%ju}nkX$d%<(H)02 zL6y2-0b;=lDL)~R_yH{V5pk?2FcM+`8+NE!(G}<1J1@6DO*ic#qnUHhIrrRi?p)7& z^Iac~j;0A5OCR@FjR+yXq2V21v*U0Yn(v58RN)4p0&64Jqjp3l*F_qWi5fXeXk3kg zOsFErq#6U6x+f^{KQP736_&^qDQKf`9k!tY`eLd^RY-1ydCgf!yb;H9Le1??13BH!?bOq&ReBZ0N|i7pbPQ@ps^^I!QIHO0{H8U{5M$n%*c&=E+gj)&E}5qBvPp;!sbWkFIXEhik<$#Rpg3{TETOH z;<|E*on2$~G`-bIKfHi(CB@FL0n>`Dq#w!^K0KdSY)4qzi91niBZs1ZqJ&}^#f&3b z8~OZ`aox5J+GQ#7MHqzcq9QqQUW&%xPMvg6*Ga!?ZFCL0tLfA^uC3_pwnhz$u9$0< zP7P-Sy0ts&tL^S;$9Cdv6C!Nqv}S)|uD4q(RJ+$U@91r>TP3oM~?wS-TYsLest#|Y;^z5YBj3~ZWj)b-N4dlZ{F>I8>#zj6qcT6taHOsqr z$$VkJD%n_1_7CUswM)x2SU7vRP_%WrykOX$bxmv8qUNW@N_SaZ)UN66mG!pXHR&>2 zF200WYr{$M2llYDgbCu!u{xv%GT#amnBAhyqe_-bxz zyf4jywp+QyWly?wAiC!s_@!CjDm>3j8Q362ePKIw$Mj^Z?mGbqlY0ER&51d2%% zZ-RIVndsZ#b4EGhxKpGV@ZnIb5G?qSFk-{i`^SVyFBLwbP)9gvXs^s$VuZkxX9=Yt5S>E{V6P?joi0|QWlzae9R zmtL3!ngw`ZeJ0ZpffH71F~$JzdMvB;`vA+rs!tuj0AsZ{Fu-_yF~k59uOI_VgxJt4 z%>dP8HpZA-LQSdZTEgXZ$^XIYk{+M)+Gly4WdNs>IHwDMWAhktI=P65QOL+Z>pZ-; zjd%fci&HjGhN5g;s&{P5w2c5TLVRsju^CJ#F^c;HI*I~!0CXG#61LgR0jdW4jvj}u z0U$Z%0*PO1SR_$W0jr|tu&j*YEf8UfG()G*!ziB1lXCPtxNO{v`Rs^e&=|v@U@8R& zK@haR2k{IDP4=Y8U2$Ox@MmFHn%pw`QWn+10+&5$;XriHJq*eECRg^w1;igWq!(Dw z0SS3eA1nB(p9I`c$R8Y5p!&0*bF}q@pOBEFttTNbXY0vf3aJevIfzvy#3*Dp16cK9 z+{RwN1MlrhH-M^t+hY#RZM>AjBGU7?jh_$y=fRKIe{q{Ca+@l0n`*#qs=M=5bj(+K zQuRP|&piwQZWDMw-xsThEv~N@SkS?^4fga!D8qw5MQ-DI{e0ktYJQ%u0%aM@C}}6@ zZJrtVbIxddyPf5GR@ee(sd1mKc46!6yPSmU{caXKn|$mF7M2zpImIsOL00+iqY literal 0 HcmV?d00001 diff --git a/matrix.py b/matrix.py index ee0af2d..ddaab89 100644 --- a/matrix.py +++ b/matrix.py @@ -24,7 +24,27 @@ def matrix_add(self, A, B): return str(result) -def subtract_matrix(a, b): pass +def matrix_subtract(self, A, B): + A = self.parse_matrix(A) + B = self.parse_matrix(B) + + if not A or not B: + raise ValueError("Empty matrix") + + rows = len(A) + cols = len(A[0]) + + if rows != len(B) or cols != len(B[0]): + raise ValueError("Matrix dimensions must match") + + result = [] + for i in range(rows): + row = [] + for j in range(cols): + row.append(A[i][j] - B[i][j]) + result.append(row) + + return str(result) def matrix_multiply(self, A, B): A = self.parse_matrix(A) diff --git a/test_matrix.py b/test_matrix.py index 93f684b..eae2a26 100644 --- a/test_matrix.py +++ b/test_matrix.py @@ -11,4 +11,9 @@ def test_multiply(): def test_transpose(): from matrix import Matrix m = Matrix() - assert m.matrix_transpose('[[1,2],[3,4]]') == '[[1, 3], [2, 4]]' \ No newline at end of file + assert m.matrix_transpose('[[1,2],[3,4]]') == '[[1, 3], [2, 4]]' + +def test_subtract(): + from matrix import Matrix + m = Matrix() + assert m.matrix_subtract('[[5,6],[7,8]]', '[[1,2],[3,4]]') == '[[4, 4], [4, 4]]' \ No newline at end of file From 379cf96892c56a3917f153eae5e7fb2a0f1d0991 Mon Sep 17 00:00:00 2001 From: Sarthak Singh <23.sarthak.official@gmail.com> Date: Mon, 6 Apr 2026 12:52:07 +0530 Subject: [PATCH 6/8] Removed __pycache__ and added gitignore --- .gitignore | 2 ++ .vscode/settings.json | 4 ++++ __pycache__/calculator.cpython-313.pyc | Bin 1220 -> 0 bytes __pycache__/fraction.cpython-312.pyc | Bin 2300 -> 0 bytes __pycache__/fraction.cpython-313.pyc | Bin 2287 -> 0 bytes __pycache__/matrix.cpython-313.pyc | Bin 3359 -> 0 bytes .../test_calculator.cpython-313-pytest-9.0.2.pyc | Bin 2904 -> 0 bytes __pycache__/test_fraction.cpython-312.pyc | Bin 2391 -> 0 bytes .../test_fraction.cpython-313-pytest-9.0.2.pyc | Bin 2530 -> 0 bytes .../test_matrix.cpython-313-pytest-9.0.2.pyc | Bin 5102 -> 0 bytes 10 files changed, 6 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/settings.json delete mode 100644 __pycache__/calculator.cpython-313.pyc delete mode 100644 __pycache__/fraction.cpython-312.pyc delete mode 100644 __pycache__/fraction.cpython-313.pyc delete mode 100644 __pycache__/matrix.cpython-313.pyc delete mode 100644 __pycache__/test_calculator.cpython-313-pytest-9.0.2.pyc delete mode 100644 __pycache__/test_fraction.cpython-312.pyc delete mode 100644 __pycache__/test_fraction.cpython-313-pytest-9.0.2.pyc delete mode 100644 __pycache__/test_matrix.cpython-313-pytest-9.0.2.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7bfcd7a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ +*.pyc \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4b5a294 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "python-envs.defaultEnvManager": "ms-python.python:conda", + "python-envs.defaultPackageManager": "ms-python.python:conda" +} \ No newline at end of file diff --git a/__pycache__/calculator.cpython-313.pyc b/__pycache__/calculator.cpython-313.pyc deleted file mode 100644 index dae6a2fd1d4700f7959d5ee080bdeaef5528e21c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1220 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 diff --git a/__pycache__/matrix.cpython-313.pyc b/__pycache__/matrix.cpython-313.pyc deleted file mode 100644 index cb86110f84ed3892d0f9c145ba935157b4b03f57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3359 zcmeHK%}*Og6rcUDy|&jMd<4gQBu+yrh#(bBOH&#}F@ZEq3srG9qJq@g+MCqLvNkgd zlpZRiN)?ETm`XuDg3=4e{u7mYGqOa`mIG3&O1ULCr=I#|Kg*F zDOpbw9b+Dh2n!;SF#4|zOiDz-Wb*ZkM8=at3c0W63zG$$zo%sM$<%QAnyhAKR9VmC zNmv2rzPM1BH^hRBiITP^Fx&v5`yeeK7SPXpcqbTs9BkVPww2zk1Ut)oXB9Lk<3559 zCg`~OBe*_95*l+~12u;xG0p+u3hG<1H49c^x-2&&!|D?2jIu$5CTg)$wKWxH!ecwQ zBXRE86iZENF?h+Xt;HUgLnzw_F?p9S`=T$kkzd>i=d7zRuOZDdLGQ$DQccr@Zd^x5 z^Mc;z(({fd=+A&&kbGl)$NS)WyoK&w5~v)1^`PGiV`qf~8aazl5G9c0skesYb6MW7 zEGOU`R+BuAwi9jgqrZ#8Qw4oKVIzZH`j_n^CT z;Fhe;D8m@%vB9Z|W_Yly-Bk>)Tqr17*5ClTn|^~Qih9Rjk_Izq@Hjt53_g=riQ&Zx znNf9v$r&6>8_YdIuOs0!Ot01mSldd=*(~mW33?&bpFk|29YK67#J7Za=}bjvUq~Jv z{}vS2lDpxPrBjt~S6S%#H5gu;UhZEQ+NGUh!;-%I_QKGfFZeAf_ASqT{Z*;?`=<4e z)~7c&r#GCSeuBDdSnQqy_8&?TW{ECUY9pwTd}TfvHKZ^8awuc@Pp7&sF>LnTA%q*IR0EjVq|f4`JFP~ zg6XOM&$E9`p20KWK#}_Sfa(pc4}ib=kJ8%l?wzWhozF?i#N{@xYH_ z5%z#h!anz&1~o%2>t^gbc?_(r>bZiN%g8#gxCy}S5N@V^a5jYL^AAi6tej37Udqe# z+Z+$t<3Sv!maSBnaBQbO9E3BN`-DQ;VQll;qHPDvcKmrvAND@@kS8Gi26u;|#fIfu zl!KvD>|1SK{=^;}ncee+D!!P>-d8K(WLZeo*t>t_wu`-I*E)c`8=Drd?Ve~Y^{?G7 zGCR?xQo|7*-->p9#{rYKoZYjzo~(QbMBaG%X#n{n2izV(;kM_Ehq;|rZcg(;hyG&K z3&+jcT7~o%Ya-T_Q&7fIygJy@ILHa!g?V?*Tmd|LK<{?T!~<%~T7|FYBh~T|EUz9xd@UOR@th0s7L)}SlpzBVK1qd%SBg>#uN1jN0O8=& zf@sv{TOeDF6!K6~p9h-{sPQ)-j$#z*iI-Os$FCE%#nZ3%4cU(MMF3!k(6{3$$1u!3%QENog=QwU-(!k66RY+|nV9*q`~jN- BBLe^c diff --git a/__pycache__/test_calculator.cpython-313-pytest-9.0.2.pyc b/__pycache__/test_calculator.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index c83e67e350d3ebdd216e2f17faadf200cdbde60d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2904 zcmd5;-%le|6u#4$wnN(iRv=O+&~|lofUvL|SS73L%JKkfn$TIyCfj5(l!1(vw%nPj z?9(P1qb7z;3|@s_{s8}pTCwCtqlr&_+knQz2lbqpPFo7BK9Rl2d~@$P=l=N4 zJ#)?+Nm777`|Z*9#Mfr^-AFY9`RPX4eZ^hKe9# zytced+o0#Th#~&E)>|*MYFJEQ7vtq!5`G8^9Mx;RxvLEoZw#x zkCehA#hb7Bz44?uB7Don2gb5~!W%)`8;+9oo#qQihl%;DsE|uxxfm-hl*5(5nvr2cXWz1IfOW3fFa0I4fBV+%+|FDjGFpm^78mwB<;c~& zg?;hbGlKpbSZ0fyUIp&eYrtf!MtDdRZ3URr(vtob0SudKgZ)v% zu)~TcN`_zu43RhZA+o~B5GWYa6i*@xEaW&esTrnjvcS7qrl8MKnxl3?J>9ik&8}VA zQ19zB$KucMZq242wlv29Aj3)*D$-y{8hmtrUm89Lb#BgmK354vN}It=9UW??1xkp z>tapQp{gqeHLZ-1)w4NOrI_+5eh#z`VFx3ZPTfC&Ug2yVO!F%r@Yqnr{PqN)83i8$0xI-U)bdj>fq}imzvr4fB>(^b diff --git a/__pycache__/test_fraction.cpython-312.pyc b/__pycache__/test_fraction.cpython-312.pyc deleted file mode 100644 index 4128782b4835b638854b341fb57bd81d9cc71294..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2391 zcmd5;&2Jl35Pxq!;&oy}6QxyLrAa6Vx^alfhZ{aBK9mONp{WEE5zErDcwgF0*B`uH zCwSFEkb)=&;6{ps1QHjbNL)eUPvB$%a^Zlt|X5ZJ|Gd$O@#ZMa=W#lq(*C0@A(JUi#iPkUgc)Nv&*G<(N4);-Rq`P&0i_8i`-si`HRfG;gu`-^WOC_mlgAFdD&YtIU8f8Yj%k-ZkMj*P1l{x zzqw!>1SRhQ0%N%qtjS6(P+jI-t@y)7Lz@(*m^ByEu}=ONd~#>-+%4tPcoWv7(1rpF zECvBR2a`>5ldN=}!X6IT#Sk4DD^VeJ>|1oZWp7E_EgMKY(d9)yHk-+&XEIq|p37vn ztt6;G_;|* zHgtRN>(rO2Mrxv-n)q&MCpGuu$=|e>IELpzM&oG_jj2qQKLRhg4|7sLa;xuon0x<; zZonfg;b;K8Jy3AdnVIpK%&ad@Wv07!ARb5#XN9Ja;s>K9M=g zUbQXepY4{nQ0EjT>|p>lo1PA{Hgz72dKDpFLjMfvQ-^71SjNg-C`yQSNg?%>;wqFdt zApfMkqQn;U-as>ql38Si5%d~Hv20ZxoF@zec{n`beF&!?#UKh%o4d;vDeYU#x^tS zqWG!eS|kupK|uo1NAe3m;#ZhZ9F0Ic@YJ`cE<)moGqYYNO_T5j9m(I$nK?6azBxzV zxSL4C5VVBiR}qoKSDsg>oI>*|38nm*FbTtqd^Iw! z5iNy=&;&A-VPvYMaPfGs<<7SNr}0K&rMMY7e*+;4yuf$JAK#4=sL(T0Xjxj8jPQMK zFBlR#{u;5$o>Q;QT5h@NT3(%$cQ2KCM)wkQ)=){rPh?XfiYX5xqVgC?$W#HtW(Y81 zh5U_Z)>mxSQ;7IfCo zA}aP-a9_W{DCfVY6@zlxHEv3U-g;9m^wvO%k)bTKA~X3yW;$PJDQEJ94TZ%m3RmFG zz1y^0qQNFC%CCy&+$K@5{mUY8KBb9EuqqWcegNyhftP>xB*1O7rRg1QsI3jH4}6>a zD%nY9+sW*AZ*C^f{4jV=dzl;ouSc@{AK%6c;x;Dp1#%1`d5m*HP@>HxkLR8}dl>P+ zi&G+l9R62wQ~Bxibbh9#Oy;K!Be&9YJ*VNW9!@Us;;Qpxkjo2lXY=RwCl?o)t2nou zip?et%bV|W;z=PklbQ0fHn~5sUP(GD4cDpuOV()5YxrPtT%?5htV8D@^|{&Co7$&f+2rt>dm zpq34l>Aq|gEr;5a#on;oraebUod^vhqDJ?s*Py5er*_M7ol0NIS@y8X*y}w8LDC!m z=vv~bPGYQ`82h?)FOlBTk9~3F(<>c)yseMljsC2s|5DJAOec~4C6WG{@>sqcc}e*( z_DVEjNFvGwLuVSsHEYGjn8h$&saKjV@9P+IJ?_mM#klGa>bXwMuGKLn{6Qg4b9jb> zNbM-^r8qnXzy>jWXX@bC2!ISUg| zT!@|n*j6M-`W>MU(FaF=L#H09BT{DlMrSnF9?d;OU~FGNs(z=nsU){l{gZ3&U;F6w LZ3U^rV(WhZdmHrZ diff --git a/__pycache__/test_matrix.cpython-313-pytest-9.0.2.pyc b/__pycache__/test_matrix.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index 1441c5f9d742db61eb671c446cc3d08bf8b341d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5102 zcmeHLOK%%h6ux7RpOZ&lg0>`dh*Z&$jOAyVv~fk#L_)17YR0Y%ju}nkX$d%<(H)02 zL6y2-0b;=lDL)~R_yH{V5pk?2FcM+`8+NE!(G}<1J1@6DO*ic#qnUHhIrrRi?p)7& z^Iac~j;0A5OCR@FjR+yXq2V21v*U0Yn(v58RN)4p0&64Jqjp3l*F_qWi5fXeXk3kg zOsFErq#6U6x+f^{KQP736_&^qDQKf`9k!tY`eLd^RY-1ydCgf!yb;H9Le1??13BH!?bOq&ReBZ0N|i7pbPQ@ps^^I!QIHO0{H8U{5M$n%*c&=E+gj)&E}5qBvPp;!sbWkFIXEhik<$#Rpg3{TETOH z;<|E*on2$~G`-bIKfHi(CB@FL0n>`Dq#w!^K0KdSY)4qzi91niBZs1ZqJ&}^#f&3b z8~OZ`aox5J+GQ#7MHqzcq9QqQUW&%xPMvg6*Ga!?ZFCL0tLfA^uC3_pwnhz$u9$0< zP7P-Sy0ts&tL^S;$9Cdv6C!Nqv}S)|uD4q(RJ+$U@91r>TP3oM~?wS-TYsLest#|Y;^z5YBj3~ZWj)b-N4dlZ{F>I8>#zj6qcT6taHOsqr z$$VkJD%n_1_7CUswM)x2SU7vRP_%WrykOX$bxmv8qUNW@N_SaZ)UN66mG!pXHR&>2 zF200WYr{$M2llYDgbCu!u{xv%GT#amnBAhyqe_-bxz zyf4jywp+QyWly?wAiC!s_@!CjDm>3j8Q362ePKIw$Mj^Z?mGbqlY0ER&51d2%% zZ-RIVndsZ#b4EGhxKpGV@ZnIb5G?qSFk-{i`^SVyFBLwbP)9gvXs^s$VuZkxX9=Yt5S>E{V6P?joi0|QWlzae9R zmtL3!ngw`ZeJ0ZpffH71F~$JzdMvB;`vA+rs!tuj0AsZ{Fu-_yF~k59uOI_VgxJt4 z%>dP8HpZA-LQSdZTEgXZ$^XIYk{+M)+Gly4WdNs>IHwDMWAhktI=P65QOL+Z>pZ-; zjd%fci&HjGhN5g;s&{P5w2c5TLVRsju^CJ#F^c;HI*I~!0CXG#61LgR0jdW4jvj}u z0U$Z%0*PO1SR_$W0jr|tu&j*YEf8UfG()G*!ziB1lXCPtxNO{v`Rs^e&=|v@U@8R& zK@haR2k{IDP4=Y8U2$Ox@MmFHn%pw`QWn+10+&5$;XriHJq*eECRg^w1;igWq!(Dw z0SS3eA1nB(p9I`c$R8Y5p!&0*bF}q@pOBEFttTNbXY0vf3aJevIfzvy#3*Dp16cK9 z+{RwN1MlrhH-M^t+hY#RZM>AjBGU7?jh_$y=fRKIe{q{Ca+@l0n`*#qs=M=5bj(+K zQuRP|&piwQZWDMw-xsThEv~N@SkS?^4fga!D8qw5MQ-DI{e0ktYJQ%u0%aM@C}}6@ zZJrtVbIxddyPf5GR@ee(sd1mKc46!6yPSmU{caXKn|$mF7M2zpImIsOL00+iqY From 09de019fad4f4a6ce411c83dd9d51645927ed0f8 Mon Sep 17 00:00:00 2001 From: Sarthak Singh <23.sarthak.official@gmail.com> Date: Mon, 6 Apr 2026 12:56:33 +0530 Subject: [PATCH 7/8] Improved parse_matrix with validation --- matrix.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/matrix.py b/matrix.py index ddaab89..4d563f6 100644 --- a/matrix.py +++ b/matrix.py @@ -1,6 +1,21 @@ -def parse_matrix(mat_str): +def parse_matrix(self, mat_str): import ast - return ast.literal_eval(mat_str) + + try: + mat = ast.literal_eval(mat_str) + + if not isinstance(mat, list) or not mat: + raise ValueError("Invalid matrix") + + row_len = len(mat[0]) + for row in mat: + if not isinstance(row, list) or len(row) != row_len: + raise ValueError("Irregular matrix") + + return mat + + except: + raise ValueError("Invalid matrix format") def matrix_add(self, A, B): A = self.parse_matrix(A) From 84a3b1bd612869fa24a8db7132fdc9085112605f Mon Sep 17 00:00:00 2001 From: Sarthak Singh <23.sarthak.official@gmail.com> Date: Mon, 6 Apr 2026 13:04:56 +0530 Subject: [PATCH 8/8] Finalized matrix module with add, subtract, multiply, transpose, and robust parsing with tests --- matrix.py | 164 +++++++++++++++++++++++++------------------------ test_matrix.py | 68 +++++++++++++++++++- 2 files changed, 152 insertions(+), 80 deletions(-) diff --git a/matrix.py b/matrix.py index 4d563f6..e3458d0 100644 --- a/matrix.py +++ b/matrix.py @@ -1,107 +1,113 @@ -def parse_matrix(self, mat_str): - import ast +import ast - try: - mat = ast.literal_eval(mat_str) +class Matrix: - if not isinstance(mat, list) or not mat: - raise ValueError("Invalid matrix") + def parse_matrix(self, mat_str): + try: + mat = ast.literal_eval(mat_str) - row_len = len(mat[0]) - for row in mat: - if not isinstance(row, list) or len(row) != row_len: - raise ValueError("Irregular matrix") + if not isinstance(mat, list) or not mat: + raise ValueError("Invalid matrix") - return mat + row_len = len(mat[0]) + for row in mat: + if not isinstance(row, list) or len(row) != row_len: + raise ValueError("Irregular matrix") - except: - raise ValueError("Invalid matrix format") + return mat -def matrix_add(self, A, B): - A = self.parse_matrix(A) - B = self.parse_matrix(B) + except: + raise ValueError("Invalid matrix format") - if not A or not B: - raise ValueError("Empty matrix") - rows = len(A) - cols = len(A[0]) + def matrix_add(self, A, B): + A = self.parse_matrix(A) + B = self.parse_matrix(B) - if rows != len(B) or cols != len(B[0]): - raise ValueError("Matrix dimensions must match") + if not A or not B: + raise ValueError("Empty matrix") - result = [] - for i in range(rows): - row = [] - for j in range(cols): - row.append(A[i][j] + B[i][j]) - result.append(row) + rows = len(A) + cols = len(A[0]) - return str(result) + if rows != len(B) or cols != len(B[0]): + raise ValueError("Matrix dimensions must match") -def matrix_subtract(self, A, B): - A = self.parse_matrix(A) - B = self.parse_matrix(B) + result = [] + for i in range(rows): + row = [] + for j in range(cols): + row.append(A[i][j] + B[i][j]) + result.append(row) - if not A or not B: - raise ValueError("Empty matrix") + return str(result) - rows = len(A) - cols = len(A[0]) - if rows != len(B) or cols != len(B[0]): - raise ValueError("Matrix dimensions must match") + def matrix_subtract(self, A, B): + A = self.parse_matrix(A) + B = self.parse_matrix(B) - result = [] - for i in range(rows): - row = [] - for j in range(cols): - row.append(A[i][j] - B[i][j]) - result.append(row) + if not A or not B: + raise ValueError("Empty matrix") - return str(result) + rows = len(A) + cols = len(A[0]) -def matrix_multiply(self, A, B): - A = self.parse_matrix(A) - B = self.parse_matrix(B) + if rows != len(B) or cols != len(B[0]): + raise ValueError("Matrix dimensions must match") - if not A or not B: - raise ValueError("Empty matrix") + result = [] + for i in range(rows): + row = [] + for j in range(cols): + row.append(A[i][j] - B[i][j]) + result.append(row) - rows_A = len(A) - cols_A = len(A[0]) - rows_B = len(B) - cols_B = len(B[0]) + return str(result) - if cols_A != rows_B: - raise ValueError("Invalid dimensions for multiplication") - result = [] - for i in range(rows_A): - row = [] - for j in range(cols_B): - val = 0 - for k in range(cols_A): - val += A[i][k] * B[k][j] - row.append(val) - result.append(row) + def matrix_multiply(self, A, B): + A = self.parse_matrix(A) + B = self.parse_matrix(B) - return str(result) + if not A or not B: + raise ValueError("Empty matrix") -def matrix_transpose(self, A): - A = self.parse_matrix(A) + rows_A = len(A) + cols_A = len(A[0]) + rows_B = len(B) + cols_B = len(B[0]) - if not A: - raise ValueError("Empty matrix") + if cols_A != rows_B: + raise ValueError("Invalid dimensions for multiplication") - rows = len(A) - cols = len(A[0]) + result = [] + for i in range(rows_A): + row = [] + for j in range(cols_B): + val = 0 + for k in range(cols_A): + val += A[i][k] * B[k][j] + row.append(val) + result.append(row) - result = [] - for j in range(cols): - row = [] - for i in range(rows): - row.append(A[i][j]) - result.append(row) + return str(result) + + + def matrix_transpose(self, A): + A = self.parse_matrix(A) + + if not A: + raise ValueError("Empty matrix") + + rows = len(A) + cols = len(A[0]) + + result = [] + for j in range(cols): + row = [] + for i in range(rows): + row.append(A[i][j]) + result.append(row) - return str(result) \ No newline at end of file + return str(result) \ No newline at end of file diff --git a/test_matrix.py b/test_matrix.py index eae2a26..393ac1a 100644 --- a/test_matrix.py +++ b/test_matrix.py @@ -16,4 +16,70 @@ def test_transpose(): def test_subtract(): from matrix import Matrix m = Matrix() - assert m.matrix_subtract('[[5,6],[7,8]]', '[[1,2],[3,4]]') == '[[4, 4], [4, 4]]' \ No newline at end of file + assert m.matrix_subtract('[[5,6],[7,8]]', '[[1,2],[3,4]]') == '[[4, 4], [4, 4]]' + +def test_add_dimension_mismatch(): + from matrix import Matrix + m = Matrix() + try: + m.matrix_add('[[1,2]]', '[[1,2],[3,4]]') + assert False + except ValueError: + assert True +def test_empty_matrix(): + from matrix import Matrix + m = Matrix() + try: + m.matrix_add('[]', '[]') + assert False + except ValueError: + assert True + +def test_invalid_format(): + from matrix import Matrix + m = Matrix() + try: + m.matrix_add('abc', '[[1,2]]') + assert False + except ValueError: + assert True + +def test_irregular_matrix(): + from matrix import Matrix + m = Matrix() + try: + m.matrix_add('[[1,2],[3]]', '[[1,2],[3,4]]') + assert False + except ValueError: + assert True + +def test_multiply_dimension_mismatch(): + from matrix import Matrix + m = Matrix() + try: + m.matrix_multiply('[[1,2]]', '[[1,2]]') + assert False + except ValueError: + assert True + +def test_single_element(): + from matrix import Matrix + m = Matrix() + assert m.matrix_add('[[5]]', '[[3]]') == '[[8]]' + +def test_negative_values(): + from matrix import Matrix + m = Matrix() + assert m.matrix_add('[[-1,-2],[-3,-4]]', '[[1,2],[3,4]]') == '[[0, 0], [0, 0]]' + +def test_transpose_rectangular(): + from matrix import Matrix + m = Matrix() + assert m.matrix_transpose('[[1,2,3],[4,5,6]]') == '[[1, 4], [2, 5], [3, 6]]' + +def test_large_matrix(): + from matrix import Matrix + m = Matrix() + A = '[[1,1],[1,1]]' + B = '[[1,1],[1,1]]' + assert m.matrix_add(A, B) == '[[2, 2], [2, 2]]' \ No newline at end of file