21 februarie 2013

Email grabbing with regex

String EMAIL_REGEX = "(?:[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[A-Za-z0-9-]*[A-Za-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";

String content = "myname@provide.com tananana etc@example.com";
Pattern pattern = Pattern.compile(EMAIL_REGEX);
Matcher m = pattern.matcher(content);

while (m.find()) {
String email = m.group(0).trim();
System.out.println(email);
}

08 februarie 2013

Eight Puzzle

Eight Puzzle este una din problemele tipice pentru A* .
Pornind de la o stare initiala (stg) vrem sa ajungem la starea finala (dreapta), in cat mai putini pasi. O cautare in spatiul tuturor starilor nu mai este posibila din cauza numarului mare de stari (9! > 300,000)

Pentru a alege cat mai bine urmatoarea stare, A* combina costul de a ajunge in acea stare cu o euristica ce estimeaza costul de acolo pana in starea finala.
In cazul de fata, euristicile presupuse au fost:
- numarul de blocuri nelalocul lor (starea initiala vs. finala)
- suma distantelor Manhattan ale fiecarei valori din celulele initiale raportate la pozitiile in care se afla in celulele finale (mai multe despre asta aici)

In fine, implementarea mea se afla aici, pentru cazul considerat, am obtinut acelasi numar de pasi, insa cea de-a doua euristica a fost mult mai rapida.

UPDATE:
Pseudocodul de mai sus furnizat de AI-planning este putin defectuos... am refacut implementarea si ea se afla aici. In prima versiune, o stare nu era considerata decat o singura data, dupa care trecea in "allNodes". In noua versiune, o stare poate fi considerata si a doua oara, daca promite o distanta mai mica pana la solutie fata de cat promitea anterior (adica am descoperit solutia printr-o alta cale).

27 ianuarie 2013

Problema canibalilor si a misionarilor

Mi-am dezmortit putin cunostintele de C, facand problema "canibalilor si a misionarilor" , propusa de AI-planning. (chiar nu am vrut sa recurg la C, dar asta este cea mai buna varianta pentru un calculator pe care rulez tot timpul Ubuntu live)

Problema suna cam asa: "Un rau are 2 maluri. Pe malul din stanga se afla 3 misionari si 3 canibali, care vor sa ajunga pe malul din dreapta. Ei au la dispozitie o barca, cu capacitate maxima de 2 persoane. Cum pot trece ei astfel incat misionarii sa nu fie mancati de canibali? Daca pe unul din maluri exista misionari si ei sunt mai putini la numar decat canibalii, atunci vor fi mancati."

Am aflat ca aceasta problema este clasica in AI-planning , si are si o varianta mai extinsa a unor cupluri geloase. Momentan, m-am limitat la o implementare simpla in C, in care accentul cade pe modul cum se reprezinta starile si actiunile. Ce inseamna success si failure. Cum alegem sa facem cautarea - in depth, in breadth? Eu am ales varianta in adancime (recursivitate). Iar implementarea se poate vedea aici (cu 4 solutii gasite, care au aceeasi "lungime").

26 decembrie 2012

Soft educational: OrarApp

Aplicatia particularizeaza orarul general pentru o scoala, generand orare pentru fiecare clasa si fiecare profesor.

Pasii de folosire:

1. Se scrie orarul scolii intr-un fisier Excel, in 5 spreadsheet-uri corespunzatoare fiecarei zile a saptamanii.
Este important sa se respecte formatul , pentru aceasta se poate descarca si completa un sablon pe care il gasiti mai jos [1].
* in fiecare celula, formatul trebuie sa fie exact: MATERIE - NumeProfesor. Daca la o anumita ora, o clasa poate avea 2 sau mai multe materii (care se fac prin rotatie din 2 in 2 saptamani de exemplu), se pune o bara / care indica cealalta optiune, in acelasi format. Exemplu:
DESEN - Popescu / MUZICA - Ionescu
* in partea stanga (coloana A) se afla lista tuturor claselor, care se poate modifica dupa plac - se pot adauga sau sterge numele claselor, incepand de la A3 in jos;
* deasupra, pe linia 2, se afla intervalele de timp in care se desfasoara orele, acestea de asemenea pot fi schimbate, cu conditia sa existe aceeasi lista de ore, in aceeasi ordine, in fiecare din cele 5 spreadsheet-uri;
* numele spreadsheet-urilor (luni, marti, ...) nu se pot modifica - daca nu exista orar pentru o zi, nu se va sterge spreadsheet-ul ci se va lasa gol.


2. Se deschide Orare.jar , si se selecteaza Excel-ul in care se afla orarul realizat conform specificatiilor de mai sus.


3. Va aparea un formular cu listele gasite, de clase si profesori. Apasand "genereaza" in dreptul unei clase sau profesor selectat are ca efect crearea unui nou Excel cu numele acestuia si cu orarul aferent . "Genereaza tot" salveaza orarele particulare ale tuturor claselor si tuturor profesorilor.




4. Si acum orarele sunt gata de printat si impartit claselor / profesorilor .

Important!
- aveti nevoie de un JDK (java development kit) pentru a putea executa programul - se instaleaza, in functie de sistemul de operare, de aici [2]
- aplicatia se deschide cu "Java platform SE binary" (click pe fisierul jar -> Properties -> Opens with.. -> Java platform SE binary)

Descarcare aplicatie:  link

[1] https://www.dropbox.com/s/u8rm1lx6p9d64bt/Orare-Template.xls
[2] http://www.oracle.com/technetwork/java/javase/downloads/java-se-jdk-7-download-432154.html

Pentru sugestii & intrebari, nu ezitati sa lasati un comentariu sau email la adresa afisata in chenarul din partea dreapta a blogului!