From 3421a172336f8c7fc48b8a5408eb78d0b30b0af5 Mon Sep 17 00:00:00 2001 From: Peter Petrek Date: Wed, 19 Jan 2022 18:33:33 +0100 Subject: [PATCH] readme --- sk2a/Makefile | 4 ++-- sk2a/README.md | 39 +++++++++++++++++++++++++++++++++++++++ sk2a/compressor.o | Bin 0 -> 6540 bytes sk2a/input.txt | 1 + sk2a/main.o | Bin 0 -> 4716 bytes sk2a/output.txt | 2 ++ sk2a/program | Bin 0 -> 11975 bytes 7 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 sk2a/compressor.o create mode 100644 sk2a/input.txt create mode 100644 sk2a/main.o create mode 100644 sk2a/output.txt create mode 100755 sk2a/program diff --git a/sk2a/Makefile b/sk2a/Makefile index dd4b40f..daf1383 100644 --- a/sk2a/Makefile +++ b/sk2a/Makefile @@ -1,5 +1,5 @@ CC = gcc -CFLAGS = -g -Wall -Werror +CFLAGS = -g -Wall -Werror -std=c99 all: program @@ -13,4 +13,4 @@ main.o: main.c $(CC) $(CFLAGS) -c main.c -o main.o clean: - rm -rf program *.o *.exe *.exe.stackdump \ No newline at end of file + rm -rf program *.o *.exe *.exe.stackdump diff --git a/sk2a/README.md b/sk2a/README.md index e69de29..f8b7dba 100644 --- a/sk2a/README.md +++ b/sk2a/README.md @@ -0,0 +1,39 @@ +Zadanie + + A. Kompressor + + Naprogramuj nástroj na kompresiu a dekompresiu. Na kompresiu použite aspoň dva kompresné algoritmy, napr. : Huffmanovo kódovanie, LZ77, LZ78, Run Length kódovanie alebo iný. + + Meno vstupného a výstupného súboru načítajte ako argument príkazového riadka. V zadaní by mali byť implementované tieto dve funkcie: + + /** + * Skomprimuje súbor in a zapíše do súboru out. + * @arg in smerník na otvorený vstupný súbor (na čítanie) + * @arg out smerník na otvorený výstupný súbor (na zápis) + * @return počet bajtov skomprimovaného súboru + */ + int compress(FILE* in, FILE* out); + /** + * Dekomprimuje súbor in a zapíše do súboru out. + * @arg in smerník na otvorený vstupný súbor (na čítanie) + * @arg out smerník na otvorený výstupný súbor (na zápis) + * @return počet bajtov dekomprimovaného súboru + */ + void decompress(FILE* in, FILE* out); + + Kompresor a dekompresor by mal byť schopný pracovať s ľubovoľným binárnym súborom do 10 MB. Súbor by mal byť po skomprimovaní menší minimálne o 10 percent a po dekomprimovaní by mal byť zhodný s pôvodným súborom. Pri práci s binárnymi súbormi môžete využiť funkcie fopen(), fread() a fwrite(). + + Na otestovanie kompresora a dekompresora použite súbory z Cantebury corpus + +Riešenie + + Implementácia mojho riešenia zahŕňa algoritmus Run Length Encoding pracujúci na úrovni jednotlivých bajtov. Pri enkódovani sa hľadajú počty po sebe idúcich rovnakých bajtov a zapisuje sa počet namiesto samotných bajtov. Príklad: + + in.txt: out.txt + AAAAAABB A6B2 + + V najlepšom prípade kompresia dokáže enkódovať bajty v pomere 1:127,5, v najhoršom prípade ide "negatívnu" kompresiu s pomerom 2:1. + + Moje riešenie ukladá počet bajtov do jedného bajtu, t.j. maximálne 255. V prípade, že by vstupný súbor obsahoval príkladovo 500 rovnakých znakov A po sebe, uložili by sa ako A255 A245. + + Pri dekódovaní sa v cykle čítajú 2 bajty, prvým je bajt ktorý sa opakuje a druhý je počet opakovaní. Tie sa následne vygenerujú v logickej pamäti programu a následne uložia pomocou jedného volania. \ No newline at end of file diff --git a/sk2a/compressor.o b/sk2a/compressor.o new file mode 100644 index 0000000000000000000000000000000000000000..7742946690e59fced0095a3ad1213f69f1cad5e5 GIT binary patch literal 6540 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 r)cR*MzMyeJmeFba+;%}eWsPSfvU(xt)!~jwE literal 0 HcmV?d00001 diff --git a/sk2a/input.txt b/sk2a/input.txt new file mode 100644 index 0000000..1857ba6 --- /dev/null +++ b/sk2a/input.txt @@ -0,0 +1 @@ +aaaaaaAAAAAA diff --git a/sk2a/main.o b/sk2a/main.o new file mode 100644 index 0000000000000000000000000000000000000000..9d3883adb53776ab1689a216b549af9bcb5c9106 GIT binary patch literal 4716 zcma)9ZEPGz8J^kOJMYHlvy%%UD2}+03o)vF=fsXYQVP?gNQqS@#4pyxmT?6`Vw1>=lNVoIy7||o zzl<(@*0H1FrK#-F4f~Q96d1WHswwK65hg=KOsHQ79Z~FLt_q5EM$~su4%3g+{C1X!@n_ zY*=VVp^}Xmb4I_KZ}^&?wf}HWgc4nGMl@4GSd1ZT`4Oz0{5>8&(TliIqcsV;^_x*V zQ+Cf5Xj9U8mCWjCk=Z>rl```WrA(Iqww-RYLXmRP-=NazvEgE6Dev|0v~n0Xwe&C* zcKWB(*wj4KR+^qW0cks9UnP~92idy?2YZxN>v;u_N7H}nLgUow`quq;THA%=!885# zvSPOLMcUqpnd9t-d-~m&Wu0ky{wrn!&MA7{irGf@E!u>P>1KD4Myctb3ntQ*rUmyD z!`hk_-L0f)O^4iVbk1lx>^?~9$REMU+CJ)TqVqa=P0?|;PMVc*GL!BI>42sO-1o5W z26-M}Z9nARAl)PnDtgqNrt^E{jH1WfF{ZFtKCL1jclmOp2j%mMo^Vf)?vP(n&NJ?1 zI+x@(6}``WjI^xjDfbHLsHP9NS4nqi`U&?*(%o{0>RWU7a2n%!&hzdmS|{X-YTTw+ z7ts88&k)qv^fJrfT%yaj;))38CC==LxFELkJlWN_9*)S^=g=Wza}V@#YcQSc*C0^K z-JrC8G}@h_Pdx+#m-s=&?zp za{GGs_fF@r(~F|F_aN-p=vu^im+praF$nbP$;(u(x0jtHsMEI+VG>8Kt7&>VPrA;; zM{T5>&a+2$o0!g*5wfo&@65)-@61l;Ij2LJuO80QDVJUeYavem_!>F@>crEgRW%eE zr%A{+9iIXvJH$K`mWUi8%TFJuRU5<;tA)0rT3I4$U&PN6%XmupcCHUk$?*8eaujsS z&Bknbu39ZO#wRC6nvGU;c4V#2HzJlv<+1THPBNLPXRKoW`t|F}SFT)fA}4y; zx&LM7;B_Z&S;(O>eNSaJs#pA0O;jqMio9AS6qRILO8{+5= zMbJ3!!;`=Xp-b$pKMShcnQkNWE1j?_D)pu}7bqnMoAm-;#NQH8S@gOKem6FDeT>hk zFpOxnTXO~V;D}x|Y_waV(ri~3ViUEMYSgV%+s$YZrcOH$UU%-as00{B4R>sMW=ce@ zpfT6-YlZ5(*QG}l6JJ%VjfZk+dF^tEsN0jH=i+(wb7W`7MQ0{cfW4p!x zcs4$XE#`T`siVHci=R>-p zctyGQ(d7A$3i%mFZpqsA1-t@$RrzC6r|4Zd=V9w`Uph4)pM{So1?Ltq9bnjvao$K> zzgY@d=u*uKJyDts0#WL=V?txipN-}!*qv>-DA}8x?fRz;!_?7X#nJ0}tvR1DR#bTT zedCQ`MG1GJMISq=)M|%*3A<(_2vOF!k3V0jcfCbFPUru6z8_vZdvIv0#(S;#nowa5 zuq}|)6@f~$r~8HI09jY|ryp;z{9uyvh-5oKl4vI09njJLfBEr(#t`vw8pr!IxM?Qd z0Vt9~Jpxh4>wGrWxDEp)fLSeF(xaOfxpF ziIHiWf?t7xZpP+;C+9b_K?qDy&5xfXGrzNtO&^HDM?79KOf$9+ie$V85RY|dzFGWC zyoVsO59`ggzekAAnWBT!#@|;o8o#Fyd@FRO8NbJ%plsSp$w@$IY~Rm8@DOAXe$g^StRy4InE!-g_3xpmSDS6z0>lJjNR(r!A!Tb?@fT+sMsjgM>muErl|d`jc98h@?v4;o+B$b1>M7x}7uH1cl_ z`Cg63G@jI0(->&{f=2!yW4~pMKh*ehjW1|?MdNE4|EbYM4cULQ#+@1`G)`%}Ph(Xh z|DCbld5w=~d{pBT8gFWRorvF?8vjnjhL?Cv8K+<4R*iRP{IJH88rA;5gZrQH_-~0= I09wF*1Le8Gr2qf` literal 0 HcmV?d00001 diff --git a/sk2a/output.txt b/sk2a/output.txt new file mode 100644 index 0000000..05e97d4 --- /dev/null +++ b/sk2a/output.txt @@ -0,0 +1,2 @@ +aA + \ No newline at end of file diff --git a/sk2a/program b/sk2a/program new file mode 100755 index 0000000000000000000000000000000000000000..0998724c0253dcc321a9a9700689fddfd8b519c4 GIT binary patch literal 11975 zcmeHNe{@vUoxg8p65fz76G%YRv>hO5s4z(&0*YEf7$6vah{4wS<1v|;WJV@4apnyW zD=j!hp&=eieMZ_b^2Kll6Ne((3*cXQwOzHfxu7Z`>ibaDx|APQ{qn9V3>2Nb1Q1cWK- z#bhy2l%t8X<_+LMmI4qeLz@TLO&W0XM$nO~ftg98Zf2P%i~Mk<5X_VpRf;a#9svz` zJ_HsavtQC(C>{s@`CCQ`X|!E8D>UCF{UIktsMS4vshNtpmLb=M%%H>96>ZRfza#0L}J zZ~fYx4}NFLx7NP#vrf`{$QYXNB9BDY3B!?zJWSfxqflobCh`bm3`_cleUnBx>DPcX zL$*DA<9mD1JS@#CLSs<>S_xJoQjMhFUP6zQ;D!>c?PqfUxs4SkQC~s>l*Cg?@X`{@ z^`{g0FGEg#%VW~dqq#^dtGg$iva)tKV_TNMltnmIGlkW*46V^b%F1P9QPGv|jip3y z&dx$4oXy6--W5(HMQ5N#|-Zrn*njUN#sx`tk7yjJxmosz$(LV+-*AO$)=tKfj=oa^(F54w`iLH_< z#EwTjW;rJPag-yV;7OKH`(u_^D9^BjL!M=cMerO;ES48oLT(RBES!BTvEW`|iADDs zODv>=EU_4G&Yv)kPC^G8_pZKFi2nS!LZPr}k6m{3>#!uh&%AA~W04Srs~>?>Ve%k; z*;trN>*A~)I|Q-9WLg;~?btzyX>FXtJGMt+S{)xx{EWo3J{}+*l$fK4*As7(n4^g| z5^s>0ql(Wa?vmv^j) zFUR_dAKKzEZ@MM^%4Uyw^f54;-Zm`t*VgSVZg}n;sGIgSe)4C_*Sb#aeGZxhoOfpB zmLvHS;}3Z1NGu$Db?>$T`wHr2ztZU0lFTVc;@DWMR2OwAF8BpF}y9Fx}#^$7YdSL%GoQEYx)WicP!c7g9I@NEg5&aXc$atoYJ7NTv_9{;AzbfN0^4LoC* zraCC9+<|pRg|k3r$Gya!y7efIwnG%kPeG}){WNXA(Az|KVN2*_e*H<|f6$^!LMQuI zR&MF2;~=TkOq5i+~z#_cVV_eANqIgfiwrnV}8Bq$<<*J^Lsq~BEJVKP+S+W=a#fY?I6q_r1?LDD%783{ZUmv z#QJvBYkr@5C%>=uwmYpm_8uQqyxna(g5P?9eBN+%bXokSFNI=O3 z?R9n_owKPYsL7NM1fnsGhe<|1#a^UJWW-w7d%1fK|52F8&Hr5}M5z#t9RRroL)DP^ts5raOp9WqQz%!a?Kl6<~s5+)JXYNXubwEO(>?{ zA<2@y0qxgX(mgZ4*2uYt`&{ky9SGR#KPA>l>EtGl zc@UYHU6POI;<|5oOrC2y@Py(lBKUrAIZE!vJOe%gOn(tGZ^ill%=tq4EtEV5zjYtZ zOeoI+^L+gfGSAG^KNgvZYxQCL$D}>0kU4jwkuO2sm-m>gzkrhGP8!H}8z^j5TE z%G0#@B+3*ps(*CidyN+A!kE_}-;ewd@)O9rkoP1168SgCA0d~+U*jB~QFdW#>$QRU z`LWJKI2C9P&I(SScJ&lhDW%O0Hcx9J4Hdaw)LhVmn4kMS=8uXdhyHa5FWjlV~zrtu7zT$38TOUOLZ*d<}JcPC+`p$0SCdkKc zR5i}HLBjdohsb=1(JtWvZ<5U8jTfZmh2H-pbFJ~3gp0iQlRDYhDw*58uMq}~?@8F< z{dd9!2Y$u-AB2q#yxsdQVUq(_d5;oKHzrHjsP{ga(d^h9_dZJMOyhOgZ&HlhP4Zuj z2&1{OY>;j+_mk!O$|J($>r2@WltVnGpXdqY4^xzT`XEs5;Tovm(%^6^zl#c6xf*2a zf9cjM#VF(NK{LG49C3*Wy;R@vEhk8duz)-==q0ntcB zv;B8a&OyEYND)f<-=h|3him&?{_9C|&}va-+(c@4{Kfy`amcz(#7`a$3!bLxkg z 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