Algoritmi, coduri diverse
Scris: 16 Sep 2013, 01:38
Inspirat de Mehran Sahami, lectorul care tine un curs de Java la Stanford University, care vorbea la un moment dat de un algoritm de creare palindromuri fraze, m-am gandit sa caut si eu un fisier text cu toate cuvintele limbii romane pentru a ma juca apoi cu ele.
Stiu ca s-ar fi putut lua din baza de date a Maestro Dex, dar eu ma gandeam sa am o lista cu cuvintele in forma de baza, nominativul singular pentru substantive, nominativul masculin singular pentru adjective, infinitivul scurt pentru verbe etc.
Se pare ca pe site-ul DexOnline.ro exista un fisier numit Scrabble-Loc.txt care contine 72933 cuvinte, acolo fiind si informatii legate de accent si altele.
Am periat fisierul ajungand sa am in cele din urma ceea ce vroiam, doar cuvintele, cate unul pe un rand.
Fisierul TXT poate fi luat de aici, are 732 KB, cel care contine si informatiile suplimentare avea 2,34 MB.
Cuvintele continute sunt scrise cu litere mici si au diacriticele romanei traditionale, ş si ţ cu sedila.
Pe baza acelei liste se pot face tot felul de analize si statistici, lucruri de care eram interesat intr-o vreme, ma refer la statistici in ceea ce priveste vocabularul.
Revenind la palindromuri, am fost curios cate cuvinte de acest fel sunt in limba romana, avand in vedere doar formele de baza ale cuvintelor existente.
Am scris un mic codulet care a detectat 92 palindromuri, luand in calcul si interjectiile "AA", "OOO", "UU", care intr-adevar sunt mai putin relevante.
De aici poate fi luata lista palindromurilor din limba romana.
Stiam ca cel mai lung palindrom al limbii romane este "aerisirea", doar ca el nu se regaseste in lista din fisierul de mai sus fiindca este un substantiv articulat.
Cel mai lung in cazul de fata este "rotitor", 7 litere.
Codul care le-a detectat, pun doar algoritmul de determinare isPalindrome, presupunand ca deja avem un array rezultat in splituirea continutului fisierului text cu cele 72933 cuvinte, este mai jos:
Stiu ca s-ar fi putut lua din baza de date a Maestro Dex, dar eu ma gandeam sa am o lista cu cuvintele in forma de baza, nominativul singular pentru substantive, nominativul masculin singular pentru adjective, infinitivul scurt pentru verbe etc.
Se pare ca pe site-ul DexOnline.ro exista un fisier numit Scrabble-Loc.txt care contine 72933 cuvinte, acolo fiind si informatii legate de accent si altele.
Am periat fisierul ajungand sa am in cele din urma ceea ce vroiam, doar cuvintele, cate unul pe un rand.
Fisierul TXT poate fi luat de aici, are 732 KB, cel care contine si informatiile suplimentare avea 2,34 MB.
Cuvintele continute sunt scrise cu litere mici si au diacriticele romanei traditionale, ş si ţ cu sedila.
Pe baza acelei liste se pot face tot felul de analize si statistici, lucruri de care eram interesat intr-o vreme, ma refer la statistici in ceea ce priveste vocabularul.
Revenind la palindromuri, am fost curios cate cuvinte de acest fel sunt in limba romana, avand in vedere doar formele de baza ale cuvintelor existente.
Am scris un mic codulet care a detectat 92 palindromuri, luand in calcul si interjectiile "AA", "OOO", "UU", care intr-adevar sunt mai putin relevante.
De aici poate fi luata lista palindromurilor din limba romana.
Stiam ca cel mai lung palindrom al limbii romane este "aerisirea", doar ca el nu se regaseste in lista din fisierul de mai sus fiindca este un substantiv articulat.
Cel mai lung in cazul de fata este "rotitor", 7 litere.
Codul care le-a detectat, pun doar algoritmul de determinare isPalindrome, presupunand ca deja avem un array rezultat in splituirea continutului fisierului text cu cele 72933 cuvinte, este mai jos:
Cod: Selectaţi tot
// aTemp este un array cu cele 72933 cuvinte.
temp=""; // va contine string-ul cu rezultate, palindromurile pe cate un rand.
// Mergem cu un for prin toate valorile array-ului:
uint aTempLength=aTemp.length(); // determinam lungimea array-ului.
for(int i=0; i<aTempLength; i++) {
bool isPalindrome=true; // Il facem false cand e cazul, adica cel mai des.
string sTemp=aTemp[i]; // cuvantul actual in variabila sTemp.
/*
Acum mergem si verificam daca prima litera este la fel cu ultima, a doua cu penultima.
Pentru eficientizare, cum nu se potriveste o pereche se face un break.
*/
uint sTempLength=sTemp.length(); // lungimea cuvantului actual.
for(int j=0; j<sTempLength/2; j++) {
if(sTemp[j]!=sTemp[sTempLength-(j+1)]) {
isPalindrome=false;
break;
}
}
// Adaugam palindromul la temp daca e cazul::
if(isPalindrome) {
temp+=aTemp[i]+"\r\n";
}
} // sfarsit for care a mers prin toate cuvintele limbii romane..
// In final temp contine ceea ce trebuie scris intr-un fisier pentru a avea lista completa cu rezultate, fiecare pe un rand.