# Shkenca > Informatikë dhe Internet > Arti i programimit >  Sfida nga Pr-Tech: Dekodimi i transmetimit të Morsit

## edspace

_Sfida është hapur nga Grupi Teknologjik i Prishtinës. Po e hedhim në forum që anëtarët të mund të diskutojnë zgjidhjet dhe të mësojnë nga eksperienca e njëri-tjetrit. Tema do qëndrojë e mbyllur gjatë kohës që sfida është e hapur dhe zgjidhja juaj nuk duhet bërë publike gjatë kësaj kohe. Kur të skadojë afati i lejuar, tema do hapet dhe pastaj mund të postoni përgjigjet tuaja dhe të diskutoni me anëtarët e tjerë._

Problemi eshte i hapur
Prej: 02/07/2005    Deri: 21/07/2005  
Ju jeni të sfiduar me dekodimin e një transmetimi i cili gjendet në formë të kodit internacional të Morsit. Prezantimi vizual i këtij kodi është:

*.--- ..- / . / --.. --. .--- . -.. .... . - / ... ..-. .. -.. . -. / .--. . .-. / -.- --- -.. .. -. / . / -- --- .-. ... .. -*  

Skripta e juaj duhet të jetë në gjendje ta bëj dekodimin e suksesshëm të transmetimit, si dhe të bëj enkodimin e mesazheve alfanumerike (pra: A-Zh, 0-9 si dhe hapësira). Duke u bazuar në kriterin alfanumerik me hapësirë, skripta juaj duhet të jetë në gjendje të bëj edhe dekodime tjera.

Programi le të shkruhet për modin tekstual. Hyrjet mund të futen nga tastiera, apo edhe të lexohen nga skeda. Daljet mund të paraqiten në terminal apo edhe të shkruhen në skedë. Programi të kodohet ashtu që gjatësia e një rreshti mos të kalojë 80 karakterë. Për këtë sfidë, programi mund të shkruhet në cilëndo gjuhë programuese që e preferoni (p.sh. C, C++, Java, Visual Basic, VB .NET, C#, Perl, Scheme/Lisp, etj.). Nëse programi juaj përmban më shumë se një skedë atëherë le të arkivohet si tar.gz apo zip dhe si i tillë le të dërgohet në emailin programim ET pr-tech PIKË net

Rezultatet dhe kodet e sakta do të paraqiten (1) një javë më së largu pas skadimit të afatit të problemit.

Tabelën e kodit të Morsit e gjeni këtu

Një tabelë tjetër që përmban edhe kodet e numrave e gjeni këtu.

----------


## lor

Edspace: para se te jepet zgjidhja, kush i lajmeron ata te Pr-Tech qe shkruhet "Zgjidhja"  e jo "Zgjedhja"? :-)

----------


## edspace

Lori, 

I kam vënë re gabime të tilla, por nuk kam dashur të ndryshoj kërkesën origjinale. Pr-Tech mund ta kontaktosh në faqen e tyre pr-tech.net ose nëpërmjet emailit programim ET pr-tech PIKË net. 

Disa "gabime" lindin nga dialekti, kështu që falen. Mqns e paske lexuar me imtësi temën, ke filluar zgjidhjen apo jo? Ke kohë që merr pjesë në forum e nuk të kemi parë sa bukur shkruan.

----------


## lor

> Mqns e paske lexuar me imtësi temën, ke filluar zgjidhjen apo jo?


Nuk e kam lexuar me imtësi temën, thjesht i kalova për kuriozitet kodin që duhet dekodifikuar script-it tim: rezultoi midis të tjerave termi i gabuar (nuk ka të bëjë dialekti).

Përsa i takon stilit të shkrimit, scrip-ti (decode + encode) është shkruar në perl para nja 2 vjetësh dhe që atëhere nuk e kam kapur më me dorë.

----------


## al5f1nx

Sfida e paraqitur nga Pr-tech eshte shume interesante.
une para rrethe 1 jave e dergova zgjidhjen ne perl.

Nje saktesim te vogel desha te bej.
Linku i paraqitur ne kryeteme per tabelen e kodit morse, tregon nje alfabet te paplote sepse nuk permban vlerat morse per 0-9, Space, Fullstop, Query.

Nje tabele e plote mund te gjendet  Ketu 

Pershendetje

----------


## edspace

E vendosa edhe tabelën tënde tek tema e sfidës. 

Çfarë gjuhe përdore për sfidën? 
Po shifrimin a e kryen?

----------


## al5f1nx

per zgjidhjen e sfides une perdora Perl.
ka karakteristika shume te pershtatshme per operacione te tilla.

scripti ben shifrim dhe deshifrim te mesazheve te marra nga nje skedar i jashtem 'hyrje.txt' dhe stampon rezultatet ne ekran.

me gjithe qejf do e postoja ketu kodin por nuk e di se sa e drejte eshte perkundrejt sfides.

pershendetje

----------


## edspace

Thjesht isha kurioz për gjuhën. Prit sa të mbarojë sfida, pastaj do t'i postojmë të gjitha. 
Bëhu gati të pranosh kritika  :buzeqeshje: 

Sfida sikur përmend që të dhënat duhet të pranohen edhe nga tastiera.

----------


## al5f1nx

Kritikat do ti pranoj me kenaqesi.
Shkembimi i opinioneve eshte edhe nje nga qellimet kryesore te ketyre sfidave apo jo?

Sa per hyrjet nga tasjera:


_Hyrjet mund të futen nga tastiera, apo edhe të lexohen nga skeda. Daljet mund të paraqiten në terminal apo edhe të shkruhen në skedë._

Une punova vetem nje nga variantet duke u nisur nga liria e opsioneve te kerkuara ne probleme.

Mgjt, ne moment qe zgjidhjet mund te behen publike do ta modifikoj scriptin me kenaqesi  qe te funksionoje edhe ne menyren e kerkuar nga ti   :buzeqeshje:

----------


## edspace

Nuk eshte se e kerkova une, por ashtu e kuptova kerkesen e sfides. 




> Hyrjet mund të futen nga tastiera, *apo* edhe të lexohen nga skeda. Daljet mund të paraqiten në terminal apo edhe të shkruhen në skedë.


Po ta lexosh si nje udhezim per perdorimin e programit, atehere duket sikur programi duhet te ofroje te dy opsionet dhe perdoruesi zgjedh tastieren *apo* skedarin, sipas nevojes. 

Megjithate e kuptoj edhe interpretimin tend dhe besoj se pr-tech ate ka dashur te kerkoje. 

Une u nisa me shume nga programe te tjera te ngjashme qe perdorin te dyja menyrat. Psh: Programet e unix nqs nuk kane pipe (|) i marrin te dhenat nga tastiera. Nese ke punuar me LISP eshte e njejta gje, komandat mund te futen nga tastiera, ose si nje skedar.

----------


## IlirDeda

Edi, me duket se ka nevoje per nje sqarim ketu.
Ata programe Unix per te cilet e ke fjalen ti i marrin te dhenat nga stdin.
Zakonisht stdin eshte tastiera por sistemi operativ (Unix por edhe MS-DOS) mund ti beje redirection.

Ka dy lloj redirection:
<  Kjo perdoret kur input eshte nje skedar.
|  (ose pipe) Kjo perdoret kur input eshte output i nje programi tjeter.


Sic mund te behet redirection i stdin ashtu mund te behet edhe redirection i stdout.
Perseri ka dy lloj redirection:
> Kur output eshte nje file
| (pipe, njelloj si me lart) Kur output eshte input i nje programi tjeter.

Shembulli me i zakonshem i redirection ne MS-DOS besoj se eshte komanda:
dir > dirlist.txt

Kjo eshte edhe arsyeja qe mesazhet e gabimeve zakonisht shkruhen ne stderr, sepse stderr zakonisht nuk i behet redirection. Nese mesazhi i gabimit do shkonte ne stdout dhe stdout behet redirection ne nje skedar, mesazhi shkon ne skedar dhe ne console nuk shikohet asgje.

----------


## edspace

Ilir,

E kam të qartë që < > dhe | menaxhohen nga sistemi operativ, por i dhashë si shembull sepse mund të mendohen si argumenta të programit. 

Programi *cat* është një shembull i mirë i programeve që pranojnë të dhëna nga skedarët ose nga tastiera. 

nga skedarët: cat forumi.txt shqiptar.txt > forumishqiptar.txt  
nga tastiera: cat > skedar.txt   

Komanda e dytë pret të dhënat nga STDIN.

----------


## qoska

:ngerdheshje:  Edhe une e mora njehere mundimin dhe e shkruajta nje nga keto sfida panvaresisht se se kam derguar, sepse e shkruajta sa per t'ja treguar nje personi qe donte ta shikonte si behej ne C.

Jam i hapur per kritika panvaresisht se nuk eshte e perfunduar tamam.

P.S.>Pertova ti hiqja ato #ifdef DEBUG te me falni :P



```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> /*per STDIN_FILENO*/
#include <ctype.h>

unsigned char shkronja[39] = {
 'A', 'B', 'C', 'D', 'E', 'F',
 'G', 'H', 'I', 'J', 'K', 'L',
 'M', 'N', 'O', 'P', 'Q', 'R',
 'S', 'T', 'U', 'V', 'W', 'X',
 'Y', 'Z', '0', '1', '2', '3', 
 '4','5', '6', '7', '8','9', '.',
 ',', '?'
};

char *mors[39] = {
".-", "-...", "-.-.", "-..", ".",
"..-.","--.","....", ".." , ".---",
"-.-", ".-..", "--", "-.", "---",
".--.", "--.-", ".-.", "...", "-",
"..-", "...-", ".--", "-..-", "-.--",
"--..", "-----", ".----","..---", "...--",
"....-", ".....", "-....", "--...", "---..",
"----.", ".-.-.-", "--..--", "..--.." 
};


#define NUMRA_PIKESIME 13
#define SHKRONJA 26
#define GJAT_RRESHTI 80
#define MAX_GJAT_MORS 6 /*gjatesia max per enkodimin e nje shkronje ne mors*/


int morsshkronje(char *str) {

	int y;
	for(y = 0; y < SHKRONJA+NUMRA_PIKESIME; y++)
#ifdef DEBUG 
	printf("morsshkronj: pas for(y<SHKRONJA+NUMRA_PIKESIME) str=%s : shkronja[y]=%s\n",str, mors[y]);
#endif
		if (!strcmp(str,mors[y]) ) 
			return shkronja[y];	
		
	return -1;
} /*fund mors-shkronj() */

char *shkronjemors(int germe ) {


	int y;	
	char *str;
	if( (germe  >= '0' && germe <= '9') || germe == '.' || germe == ',' || germe == '?') {
			/*eshte numer ose shenje pikesimi */
		for(y = 0; y < NUMRA_PIKESIME; y++)
			if ( germe == shkronja[SHKRONJA+y] ) {
				str = (char *)malloc(sizeof(char)*MAX_GJAT_MORS);
				if (str == NULL)
					return NULL;
				(void)strncpy(str,mors[SHKRONJA+y], MAX_GJAT_MORS);	
#ifdef DEBUG
				printf("shkronjemors: str = \"%s\"\n",str);
#endif
			}
			
	} else {
		for(y = 0; y < SHKRONJA; y++) {
#ifdef DEBUG
		printf("shkronjemors: ne germe=%c : shkronja[y]=%c\n",
			germe, shkronja[y]);				
#endif
			if (germe == shkronja[y] ) {
#ifdef DEBUG
      			printf("shkronjemors: ne germe == shkronja[y]\n");				
#endif
				str = (char*)malloc(sizeof(char)*6);
				if (str == NULL)
					return NULL;
				(void)strncpy(str, mors[y], MAX_GJAT_MORS);
#ifdef DEBUG
				printf("shkronjemors: str = \"%s\"\n",str);
#endif
			}
		}
	}
	return str;

} /*fund shkronje-mors() */


int main(int argc, char *argv[]) {

/*	int gjatrreshti = 0; 
	int gjatmors = 0;
*/
	char *input;
	int germa;
	char *kodimors;
	int cilen = 0;
	

	if (argc > 2) {
		printf("argumenti i vetem eshte -m\n");
		return -1;
	}

	if (argc == 2) {
	if ( !strcmp(argv[1], "-m") )
		cilen = 1;
	}
	
	input = (char*)malloc(sizeof(char)*GJAT_RRESHTI);

    if (cilen) {
#ifdef DEBUG
	printf("main: cilen = 1\n");
#endif
	while (1) {
		scanf("%s",input); 
			if ( strlen(input) >= 80) {
				printf("nje rresht nuk mund te kete me shume se 80 karaktere\n");
				return -1;
			}

#ifdef DEBUG 
		printf("main: input = %s\n",input);
#endif
		kodimors = strtok((char*)input," ");
		while (kodimors != NULL) {
#ifdef DEBUG
		printf("main: pas While(kodimors); kodimors=\"%s\"\n",kodimors);
#endif		
			if ( (germa = morsshkronje(kodimors)) != -1 ) 
				printf("%c",germa);	
			else 
				printf("gabim ne hyrje input=%s\n", (char*)input);
			kodimors = strtok(NULL, " ");
		} 
	}
	
      } else {
#ifdef DEBUG
	printf("main: jem tek shkronja mors\n");
#endif
	while ( (germa = fgetc(stdin)) != 0 && germa != '.') {
#ifdef DEBUG
		printf("main: jem tek shkronja mors+while\n");
#endif
		if (germa == ' ' || germa == '/' || germa == '\\' || germa == '\n' || germa == '\t')
		{}else {
		if (germa >= 'a' && germa <= 'z')
			germa = toupper(germa);
#ifdef DEBUG
		printf("%c\n",germa);
#endif
		if ( (kodimors = shkronjemors(germa) ) != NULL)
			printf("%s ", kodimors);
		else {
			printf("main: Karakter qe s'ben pjese ne kodin mors: (%c)\n",germa);
			return -1;
		}
		}
	} /*end while*/	
      }
	return 0;	
} /* fund main() */
```

----------


## edspace

Më poshtë po hedh zgjidhjen time të sfidës në C++. 
Skedarët i gjeni në skedarin e bashkëngjitur. 

Programin nuk është thjesht një shifrues/deshifrues i Morsit, por lejon përkthimin edhe në gjuhë të tjera, për aq kohë sa përdoruesi i jep programit një fjalor. Fjalori përmban dy gjuhë në një skedar të vetëm. Çdo gjuhë ka kolonën e saj dhe janë ndarë me [tab] nga njëra tjetra. Përkthmini është i dayanshëm, (alfabeti latin=>mors, mors => alfabeti latin) dhe përdoruesi zgjedh sipas dëshirës duke përdorur opsionin [shifro/deshifro]. 

I mirëpres pyetjet, komentet, kritikat për kodin. 


*Përpilimi dhe përdorimi i programit:*


```
----------------------------------------------------
Programi
----------------------------------------------------
Programi është shkruajtur në ANSI C++. 
U testua me MS Visual C++.NET dhe gcc/g++ 3.4.2

Përpilimi: g++ perkthe.cpp -o perkthe


----------------------------------------------------
Perdorimi
----------------------------------------------------
Programi kërkon argumenta për fjalorin e përkthimit, 
funksionin (shifro ose deshifro), si dhe të dhënat
për të përkthyer. Nqs të dhënat nuk jepen, programi
i kërkon ato nga përdoruesi me anë të tastierës. 

Fjalori përmban dy kollona të ndara me tab. Çdo 
rresht përmban dy fjalë që përkthejnë njëra tjetrën. 
Rreshtat bosh nuk merren parasysh, ndërsa rreshtat me
më pak ose më shumë se dy fjalë nuk pranohen dhe 
ndalojnë ekzekutimin e programit. Për aq kohë sa 
rreshti ndahet me tab, programi nuk bën dallim midis
fjalëve, shkronjave, apo shprehjeve.

Si shembull mund të shikohet fjalori morsi.txt dhe
shq_ang.txt. I pari bën përkthimin e shkronjave
ndërsa i dyti bën përkthimin e shkronajve, fjalëve
dhe shpehjeve. 

Fjalët e të dhenave duhet të jenë të ndara me një
vend bosh (space). Shprehjet që pëmbajnë vende bosh
duhet të mbyllen brënda "thonjzave" me qëllim që të 
të trajtohet si një fjalë e vetme në fjalor. 

----------------------------------------------------
Ditari
----------------------------------------------------

E:\>perkthe morsi.txt shifro
P R / T E C H
.--. .-. / - . -.-. ....
F O R U M I / S H Q I P T A R
..-. --- .-. ..- -- .. / ... .... --.- .. .--. - .- .-.
G J E R G J / K A S T R I O T I
--. .--- . .-. --. .--- / -.- .- ... - .-. .. --- - ..
T I R A N A
- .. .-. .- -. .-
P R I S H T I N A
.--. .-. .. ... .... - .. -. .-
T E T O V A
- . - --- ...- .-
U L Q I N I
..- .-.. --.- .. -. ..
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
.- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --..
0 1 2 3 4 5 6 7 8 9
----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----.
J U / E / Z G J I D H E T / S F I D E N / P E R / K O D I N / E / M O R S I T
.--- ..- / . / --.. --. .--- .. -.. .... . - / ... ..-. .. -.. . -. / .--. . .-. / -.- --- -.. .. -. / . / -- --- .-. ... .. -
KJO NUK DO PERKTHEHET SEPSE SHKRONJAT NUK JANE NDARE ME VENDE BOSH
KJO NUK DO PERKTHEHET SEPSE SHKRONJAT NUK JANE NDARE ME VENDE BOSH
n D E r S A KJO DO p E R K T H E H E T P j E s E r I s H t
n -.. . r ... .- / KJO / DO / p . .-. -.- - .... . .... . - / .--. j . s . r .. s .... t
P E R / T E / M B Y L L Y R / P R O G R A M I N / S H T Y P I M / C T R L / D H E / Z / N E / W I N D O W S / O S E / C T R L / D H E / D / N E / U N I X
.--. . .-. / - . / -- -... -.-- .-.. .-.. -.-- .-. / .--. .-. --- --. .-. .- -- .. -. / ... .... - -.-- .--. .. -- / -.-. - .-. .-.. / -.. .... . / --.. / -. . / .-- .. -. -.. --- .-- ... / --- ... . / -.-. - .-. .-.. / -.. .... . / -.. / -. . / ..- -. .. -..-
^Z

E:\>perkthe morsi.txt deshifro
.--. .-. / - . -.-. ....
P R / T E C H
..-. --- .-. ..- -- .. / ... .... --.- .. .--. - .- .-.
F O R U M I / S H Q I P T A R
--. .--- . .-. --. .--- / -.- .- ... - .-. .. --- - ..
G J E R G J / K A S T R I O T I
- .. .-. .- -. .-
T I R A N A
.--. .-. .. ... .... - .. -. .-
P R I S H T I N A
- . - --- ...- .-
T E T O V A
..- .-.. --.- .. -. ..
U L Q I N I
.- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --..
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----.
0 1 2 3 4 5 6 7 8 9
.--- ..- / . / --.. --. .--- .. -.. .... . - / ... ..-. .. -.. . -. / .--. . .-. / -.- --- -.. .. -. / . / -- --- .-. ... .. -
J U / E / Z G J I D H E T / S F I D E N / P E R / K O D I N / E / M O R S I T
KJO NUK DO PERKTHEHET SEPSE SHKRONJAT NUK JANE NDARE ME VENDE BOSH
KJO NUK DO PERKTHEHET SEPSE SHKRONJAT NUK JANE NDARE ME VENDE BOSH
n -.. . r ... .- / KJO / DO / p . .-. -.- - .... . .... . - / .--. j . s . r .. s .... t
n D E r S A / KJO / DO / p E R K T H E H E T / P j E s E r I s H t
.--. . .-. / - . / -- -... -.-- .-.. .-.. -.-- .-. / .--. .-. --- --. .-. .- -- .. -. / ... .... - -.-- .--. .. -- / -.-. - .-. .-.. / -.. .... . / --.. / -. . / .-- .. -. -.. --- .-- ... / --- ... . / -.-. - .-. .-.. / -.. .... . / -.. / -. . / ..- -. .. -..-
P E R / T E / M B Y L L Y R / P R O G R A M I N / S H T Y P I M / C T R L / D H E / Z / N E / W I N D O W S / O S E / C T R L / D H E / D / N E / U N I X
^Z


E:\>perkthe shq_ang.txt shifro
une
I
ti
you
une ti ai
I you he
une ti ai ajo ne ju ata ato
I you he she we you they they
po kjo pse nuk punon
po kjo pse nuk punon
sepse ti nuk e ke futur ne fjalor
sepse you nuk e ke futur we fjalor
une jam
I jam
une jam Edi
I jam Edi
"une jam" Edi
"I am" Edi
"ti je"?
"you are" ?
ti je une jam ata jane
you je I jam they jane
"ti je" "une jam" "ata jane"
"you are" "I am" ata jane
"Kjo eshte nje fjali"
"This is a sentence"
"Punon per mrekulli"
"It works like a charm"
^Z

E:\>echo F O R U M I / S H Q I P T A R > dalja.txt

E:\>more dalja.txt
F O R U M I / S H Q I P T A R

E:\>perkthe morsi.txt shifro dalja.txt
..-. --- .-. ..- -- .. / ... .... --.- .. .--. - .- .-.

E:\>perkthe morsi.txt shifro dalja.txt > daljamors.txt

E:\>more daljamors.txt
..-. --- .-. ..- -- .. / ... .... --.- .. .--. - .- .-.

E:\>perkthe morsi.txt deshifro daljamors.txt
F O R U M I / S H Q I P T A R
```


Kodi:

*perkthe.cpp*



```

//***************************************************************************
// Autori:        
//        Eduard Papa (edspace ET comcast PIKE net)
// Funksioni:    
//        Program per shifrim dhe deshifrim te shkronjave, fjaleve
//        ose shprehjeve. Mund te perdoret edhe si nje perkthyes. 
//        Programi kerkon fjalorin dhe tekstin per te perkthyer.
//        Ben perkthimin e fjaleve qe gjenden ne fjalor dhe i printon ne STDOUT.
// Argumentat:    
//        fjalor            - skedar me fjalorin per shifrimi/deshifrim/perkthim
//        shifro/deshifro    - zgjedh funksionin e fjalorit                    
//        teksti            - (fakultativ) skedari per te perkthyer. 
//                           Nese nuk jepet, programi kerkon te dhenat nga STDIN
//                           Per te nderprere perkthimin e fjaleve, duhet te 
//                           dergohet EOF me butoniat ctrl+z ne Windows, 
//                           ose ctrl+d ne Unix/Linux
//
//    psh: perkthe mors.txt shifro mesazhi.txt  // ben shifrimin ne kodin mors
//         perkthe mors.txt deshifro mesazhimors.txt  // deshifron kodin mors
//         perkthe mors.txt deshifro   // kerkon te dhenat nga tastiera
//
//***************************************************************************

#include <iostream>
#include <string>
#include <fstream>

#include "Fjalor.h"
#include "Perkthyes.h"

using namespace std;

int main(int argc, char * argv[])
{
    try {  
        if (argc < 3 || argc > 4) {
            throw string("Numer i gabuar argumentash!\nPerdorimi: " 
                + string(argv[0]) + " fjalori shifro/deshifro [teksti]");
        }
        
        ifstream skedar(argv[1], ifstream::in);
        if (!skedar) {
            throw string("Nuk mund te hapej fjalori " + string(argv[1]));
        }
        
        // hapim skedarin e fjalorit
        istream teDhenatFjalori(skedar.rdbuf());

        // te dhenat nga STDIN
        istream * teDhenatTeksti = new istream(cin.rdbuf());

        bool shifro = true;    
        if (string(argv[2]) == "deshifro") { shifro = false; }

        ifstream skedar2; 
        if (argc > 3) {        // nese te dhenat jepen ne skedar
            skedar2.open(argv[3], ifstream::in);
            if (!skedar2) {
                throw string("Nuk mund te hapej skedari " 
                        + string(argv[3]));
            }
            delete teDhenatTeksti;
            teDhenatTeksti = new istream(skedar2.rdbuf());
        }

        Fjalor fjalor(teDhenatFjalori, shifro);               // krijojme fjalorin
        // cout << fjalor;                                   // printon fjalorin
        Perkthyes::perkthe(*teDhenatTeksti, cout, fjalor); // bejme perkthimin
        
        skedar.close();            // mbyllim skedaret e hapur
        skedar2.close();        
        return EXIT_SUCCESS;    // dalim me sukses

    } catch (string gabim) {    // kapim dhe printojme gabimet
        cerr << "GABIM: " + gabim << endl;    
        return EXIT_FAILURE;    // dalim me gabime
    }
} 



```

----------


## edspace

*Perkthyes.h*



```

//***************************************************************************
// Perkthyes.h
// Perkthyesi perdor nje fjalor per te perkthyer nje seri shkronjash, 
// fjalesh, ose shprehjesh. Fjalet qe nuk gjenden ne fjalor, ngelen te 
// paperkthyera. 
//***************************************************************************

#ifndef _ep_perkthyes_
#define _ep_perkthyes_

#include <string> 
#include <iostream>
#include <vector>

#include "Fjalor.h"

class Perkthyes
{
    public:
        static void perkthe(istream & t, ostream & o, const Fjalor & f);
};


//***************************************************************************
// Perdor fjalorin per te bere perkthimin e te dhenave. 
// Fjalet qe nuk gjenden ne fjalor, kthehen te paperkthyera
//***************************************************************************

void Perkthyes::perkthe(istream & teDhenat, 
                        ostream & dalje,    
                        const Fjalor & fjalor)  
{
    string fjala;                   
    string rreshti;     
    vector<string> fjalet;          // vektor me fjalet e paperkthyera
    vector<string>::const_iterator it;  
    
    while (!teDhenat.eof()) {       // perkthejme rreshtat nje e nga nje
        getline(teDhenat, rreshti);             
        fjalet = Fjalor::copeto(rreshti, " ");  // bejme ndarjen e fjaleve
        rreshti.clear();

        // perkthejme fjalet me radhe
        for (it = fjalet.begin(); it != fjalet.end(); it++) { 
            fjala = fjalor.gjejFjalen(*it);
            if (fjala.empty()) {                // nqs nuk gjendet ne fjalor
                rreshti = rreshti + *it + " ";
            } else if (fjala.find_first_of(" \t") != string::npos) { 
                rreshti = rreshti + "\"" + fjala + "\" " ;  // "disa fjale"
            } else {
                rreshti = rreshti + fjala + " " ;           // fjale
            }
        }
        if (!rreshti.empty()) {
            dalje << rreshti << endl;
        }
    }
}

#endif 



```

*Fjalor.h* nuk e pranon forumi. Të gjithë skdarët janë bashkëngjitur më poshtë.

----------


## cunimartum

Faktikisht nuk arrita ta kuptoj qellimin e kesaj "sfide"

Ku qendron sfida tek nderrimi i dy stringjeve me njeri tjetrin
Minimumi qe mund te behej do ishte te vendosej nje limit mbi kohen qe Algoritmi do hante ne funksion te gjatesise se stringut ne hyrje dhe gjatesise se fjalorit duke i quajtur respektivisht m dhe n.
Edhe pse gjatesia e fjalorit ne kete rast konkret eshte madhesi konstante te pakten do kishte njefare interesi. ( Megjithate kjo s'do te thote gje sepse nese do te donim "m" ne kete rast mund te merrte funksion rrites nese psh. do te hidhnim me mors alfabetin kinez etj. )

Te tre zgjidhjet e tjera qe pashe bejne brute search, dy perdorin funksione te gatshme (te cilat jane implementuar per rastin e pergjithshem pa ditur veti te problemit perkates) , ndersa zgjidhja ne Perl e implementon vete  (kjo natyrisht eshte normale pasi sfida nuk kishte asnje specifikim mbi kohen )

Per sa i perket gjuhes per ta shkruar personalisht per te simuluar dhe testuar Algoritma ose Sisteme mendoj qe Python eshte me i miri, arsyeja eshte shume e thjeshte, pasi ka indentim strikt dhe sintaks shume te qarte e te paster qe e ben kodin te duket pothuaj si pseudo-code, ka gjithashtu sistem shume te thjeshte dhe efikas per te shkruar module te shpejta ne C ose C++ kur te nevojiten veti te tyre. Faktikisht pervec kesaj s'para me ka hyre ne pune, dhe personalisht Python s'me duket me ndonje perfitim me shume se PHP ose Perl.

----------


## edspace

Për herë të parë lexova kod në python në zgjidhjen që i kishe bërë sfidës. Nuk di as si ekzekutohet. Nejse...përsa i përket algoritmit të përdorur, më pëlqeu metoda që kishe përdorur më kodin dyjor (binary). Komplikohet pak struktura por deshifrimi bëhet në kohë lineare. Ndërsa algoritmi i shifrimit është njësoj me atë që kisha përdorur unë. O(nlog[n])

Unë përdora <map> të STL që i bën kërkimet në kohë log(n), njësoj si "dictionary" që ke përdorur ti në python. Këtë e përdora si për shifrim, ashtu dhe deshifrim. Në fakt është i njëjti funksion që bën përkthimin. I vetmi ndryshim midis shifrimit dhe deshifrimit është mënyra si ndërtohet fjalori (map). Gjatë shifrimit përdoren karakterët "AZ09/" si çelës dhe kodet e morsit si vlerat ndëra për deshifrimin e anasjellta. Mbase ke parë ciklet "for" me iterator dhe ke kujtuar se po kërkoj çdo fjalë në fjalor, por ato cikle janë vetëm për të përkthyer fjalët një e nga një. Pra n fjalë dhe kërkimi i çdo fjale bëhet në log(n). Koha e plotë për shifrim dhe deshifrim është n*log(n).

Në lidhje me sfidën, unë e bëra pak më interesante duke e ndarë fjalorin plotësisht nga kodi. Pra, mund të përdoret jo vetëm për morsin, por për çdo fjalor. Emri i fjalorit përcaktohet në listën e argumentave si skedar.

----------


## cunimartum

Po ke te drejte "brute search" ne kete rast do te merrte O(n*m) 

Per shifrimin po pertoja, se s'ishte dhe shume interesante por shifrimi del akoma me i shpejte po te duash, del O(n) thjeshte fare. I vendos te gjitha karakteret alfanumerike ne nje Array sipas UniCode psh. dhe indexon ne Array sipas vleres ne UniCode, secili element pastaj "maps" vetem ne nje copez stringu ne mors pra O(1) per indexim ne Array + O(1) per "map" = O(2) prap kohe konstante * O(n)   per secilin karakter = O(2n) = O(n)
Duhet te jete vetem 2-3 rreshta me shume

----------


## qoska

Epo une nuk besoj qe nje sfide kaq te thjeshte ti futen diskutim se cfare algoritmi perdoret ne te sepse eshte thjesht nje humbje kohe.
Per nje problem kaq te vogel brute-force eshte zgjidhja ideale pa e rritur kompleksitetin e algoritmit.

Persa i perket llojit te sfidave une jam munduar ti coj atyre te pr-tech.net nje liber me ushtrime te nje universiteti spanjoll, libri eshte Springer Verlanger.... dicka se spo e kujtoj tani, i cili te jep mundesi ti kontrollosh sfidat e tua direkte online nepermjet nje roboti dhe ka dhe nje klasifikim sipas shteteve, normalisht shteti zgjidhet gjate regjistrimit  :ngerdheshje: .

Sfidat ne kete liber mund te gjehen dhe online KETU, mund te beni regjistrim dhe nga fundi i faqes keni problemet te ndara ne volume.

Shpresoj per ata qe kane kohe dhe qejf te merren me keto problema dhe te ngrene sadopak flamurin shqiptar ne kete faqe le te kontribuojne.

Gjithsesi nqs ketu ne forum doni qe te zgjedhim cdo jave nje nga keto problema mund te organizohemi dhe rezultatet jane te thjeshta per te dale nga testimi automatik i kodit.

TUNG!

----------


## al5f1nx

Edhe pasi ka kaluar ca kohe, sepse me ne fund gjeta momentin per te shkuar me pushime, gjidhjen po e postoj sic i pata premtuar fillimisht edspace.
eshte pergjithesisht e thjeshte sepse sfida ne te vertete nuk paraqiste veshtiresi te vecanta. Mgjt ishte argetuese

skedari: *Alfabet.pl*


```
@kod = ('.-','-...','-.-.','-..','.','..-.','--.','....','..','.---','-.-','.-..','--','-.' ,'---','.--.','--.-','.-.','...','-','..-','...-','.--','-..-','-.--','--..','-----','.----','..---','...--','....-','.....',	'-....','--...','---..','----.','.-.-.-','--..--','..--..',);

@shkronja=('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9','Fullstop','Comma','Query');
```


skedari: *sfida_morse.pl*


```
#!/usr/bin/perl -w

#04/07/2005
#Sfida : Dekodimi i transmetimit të Morsit


require ("./alfabet.pl");#skedari ku jane vendosur 2 vargje me alfabetin morse dhe text
#hyrje.txt - skedari me mesazhin per t'u koduar apo dekoduar


$alpha_kod=@kod;



sub kodim { #subrutina qe ben kodimin e mesazhit

open(HYRJA, "hyrje.txt") || die "Nuk mund te hap skedarin e kerkuar: $!";
@input=<HYRJA>;
close(HYRJA);  #Hap lexoj dhe mbyll skedarin ne hyrje
$bruto=join("",@input);#Krijon nje skalar stringe duke marre parasysh qe ne input elementet jane rreshtat e skedarit


@fjalet=split(" ",$bruto); #Marr fjalet vec e vec

$numer_fjale=@fjalet;


for($i=0;$i<$numer_fjale;$i++){
	@shkronjat=split(//,$fjalet[$i]);#Cdo fjale ndahet ne shkronja te vecanta
	$n_shkronja=@shkronjat;	
	for($j=0;$j<$n_shkronja;$j++){
			
			for($k=0;$k<$alpha_kod;$k++){
				if($shkronjat[$j] eq $shkronja[$k]){#gjendet simboli perkates morse per shkronjen e kerkuar
					@text=(@text, $kod[$k]);
					@text=(@text, " ");

					}



				}



		
			}
		@text=(@text, "/");#vendoset simboli ndares per fjalet
		@text=(@text, " ");
	
		}
print @text;#outputi

}






sub dekodim{#subrutina qe ben dekodimin e mesazhit

open(HYRJA, "hyrje.txt") || die "Nuk mund te hap skedarin e kerkuar: $!";
@input=<HYRJA>;
close(HYRJA);  #Hap lexoj dhe mbyll skedarin ne hyrje
$bruto=join("",@input);#Krijon nje skalar stringe duke marre parasysh qe ne input elementet jane rreshtat e skedarit

@fjalet=split(" / ",$bruto);#Marr fjalet e koduara vec e vec

$numer_fjale=@fjalet;

$g="0";
for($i=0;$i<$numer_fjale;$i++){
	@shkronjat=split(" ",$fjalet[$i]);#Cdo fjale e koduar ndahet ne simbole te vecanta
	$n_shkronja=@shkronjat;	
	for($j=0;$j<$n_shkronja;$j++){
			for($k=0;$k<$alpha_kod;$k++){
				if($kod[$k] eq $shkronjat[$j]){#gjendet shkronja perkatese morse per simbolin e kerkuar
					@text=(@text, $shkronja[$k]);

					}



				}



		
			}
		@text=(@text, " ");#vendoset hapesira ndarese per fjalet
	
		}
print @text;#outputi


}



sub perdorim{#subrutina qe shfaq perdorimin e sakte te skriptit

print "\nPerdorim: sfida_morse.pl <metoda>\n\t-k - kodim\n\t-d - dekodim";


}




if(@ARGV !=1){
	&perdorim;
	}
elsif(@ARGV == 1){

	$metoda=$ARGV[0];

	if($metoda eq "-k"){
		&kodim;
		}
	elsif($metoda eq "-d"){
		&dekodim;


		}
	else{
		&perdorim;
	}


}
```

Gjithashtu perfshihet edhe nje skedar Hyrje.txt

----------

