From 4814d4cb079a0bb778a6e771639ba25c589983af Mon Sep 17 00:00:00 2001 From: Daniel Ryzhuk Date: Sun, 17 Jan 2021 18:11:04 +0000 Subject: [PATCH] Update 'sk1/README.md' --- sk1/README.md | 90 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 36 deletions(-) diff --git a/sk1/README.md b/sk1/README.md index 539c9dd..c5c49d6 100644 --- a/sk1/README.md +++ b/sk1/README.md @@ -1,55 +1,73 @@ -# Zadanie +## Zadanie -Naprogramuj nástroj na kompresiu a dekompresiu. Na kompresiu použite jeden alebo viac kompresných algoritmov: 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: +Virtuálny stroj programovacieho jazyka TUKAFUK sa skladá z dvoch pások. Na jednej páske je napísaný program. Po programovej páske beží programová hlava PH a číta inštrukcie zľava doprava. Stroj má k dispozícii aj dátovú pásku s osobitnou hlavou DH. + +Príklad počiatočného stavu virtuálneho stroja TUKAFUK: + +``` + PH + | + v + +-----+-----+-----+-----+ +Program | TUK | INK | DEK | FUK | + +-----+-----+-----+-----+ + + DH + | + v + +---+---+---+---+ +Data | 0 | 0 | 0 | 0 | + +---+---+---+---+ +``` + +Skladá sa z nasledujúcich symbolov: + +``` +TUK začiatok programu +INK inkrementuj údaj na mieste kde ukazuje DH +DEK dekrementuj údaj na mieste kde ukazuje DH +BREK posuň hlavu DH do prava o jedno miesto +GLEK posuň hlavu DH do ľava o jedno miesto +PUK vypíš 1 byte z miesta kde ukazuje hlava DH +KUK načítaj 1 byte na miesto je ukazuje hlava DH +[ ak je hlava DH nula, posuň PH na zodpovedajúcu značku ]. Inak pokračj ďalej. +] ak hlava nie je nula, pokračuj s PH na zodpovedajúvej značke [. Inak pokračuj ďalej. +FUK koniec programu +iný znak: odeľuje príkazy alebo slúži ako komentár. +``` + +Vytvorte interpret jazyka TUKAFUK. Program by mal implementovať funkciu: ```C -/** - * 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); +void run_tukafuk(const char* code); ``` -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(). +Funkcia preloží vstupný program (zistí adresy skokov) a spustí ho. Preklad programu znamená identifikáciu inštrukcií a zistenie adries pre skok programovej hlavy PH. Pri implementácii zistenia adries PH v programe pre inštrukcie [ a ]. Funkcie getchar() a putchar() použite pre implementáciu inštrukcií PUK a KUK . Pre implementáciu dátovej pásky použite pole znakov, pre implementáciu programovej pásky použite pole spracovaných inštrukcií. -Na otestovanie kompresora a dekompresora použite súbory z Cantebury corpus. +Vytvorte program v jazyku TUKAFUK na výpis celého Vášho mena. -# Stručný opis funkčnosti +## Stručný opis funkčnosti -Musíme vytvoriť program, ktorý dokáže komprimovať a dekomprimovať súbory bez straty akýchkoľvek údajov +Musíme navrhnúť jednoduchý programovací jazyk podobný brainfucku. Načíta zdrojový súbor s príkazmi a potom vykoná rôzne operácie s poľom údajov na základe príkazov, ktoré prečítal -# Stručný opis riešenia +## Stručný opis riešenia -Program používa na kompresiu súborov algoritmus stratovej kompresie dát LZ78. Kombinácie písmen kombinácie a index tejto kombinácie dynamicky uloží do stromu a potom zapíše iba index do súboru. +Program číta vstupy slovo po slove (oddelené medzerou) a ak je načítaná slová jednou z funkcií, potom sa zapíše do špeciálneho poľa, ktoré tieto funkcie ukladá. Potom sa operácia zavolá na pole s funkciami, ktoré potom spustí samotnú akciu funkcie. -# Podmienky za ktorých funguje +## Podmienky za ktorých funguje -Program dokáže skutočne komprimovať súbory s dobrým opakovaním podobných bajtových sekvencií. Funguje zle s malými súbormi a so súbormi s veľmi rozdielnymi bajtovými sekvenciami +Existuje neidentifikovaný dôvod, prečo program nikdy neopustí slučku hľadajúcu TUK, ak prvý riadok súboru nie je príkaz TUK alebo prázdny riadok -# Návod na použitie +## Používateľská príručka -- Skompilujte program +Zostavte pomocou: -```bash -make all +``` +make ``` -- spustiť program +Spustiť pomocou -```bash -./program c vstupný súbor vystupný súbor -./program d vstupný súbor vystupný súbor ``` - -použite c na zakódovanie súboru -použite d na dekódovanie súboru +./program source_file +```