24 ianuarie 2015

Exemple, exercitii in SML

tuple:    (1, 2, 3);
record: {unu=1, doi=2, trei=3};
list:       [1, 2, 3];

list concat:     [1,2] @ [2,3];
list append:    1::2::3::nil;
string concat: "ab" ^ "bc";

;; value declaration
val a = 2; val (a, b, c) = (1, 2, 3);
;; wildcard
val (a, _, c) = (1,2,3);

;; functie fara nume
(fn x => x+1);
;; functie cu nume
f: val f = (fn x => x+1); f 2;
;; aceeasi functie
fun g (x) = x + 1;

map f [1,2,3];

;; functie cu cazuri speciale
fun f 1 = 1 | f (x) = x + 1;

;; infix
fun minus (a,b) = a - b;
infix minus;
6 minus 2;

;;functii recursive
fun fact (x) = if x=0 then 1 else n*fact(n-1);
;; SAU
val rec fact = (fn x => if x=0 then 1 else fact(n-1));

;; functii mutual recursive
fun odd (x) = ..... and even (x) = ..... ;

;; andalso, orelse - operatii logice doar pe booleeni

;; functie locala
local ... in ... end;

-----------------------------------------------

1) un numar e putere a lui 2

fun pow2 1 = true
| pow2 x = (x mod 2 = 0) andalso pow2 (x div 2);

pow2 8;
pow2 10;


2) inserarea unui nr. la o lista sortata a.i. lista ramane sortata

fun insert (x, []) = x::nil
| insert (x, y::ys) =
if x < y then x::y::ys else y::insert(x,ys);

insert (3, []);
insert (1, [2,3,4]);
insert (5, [4,7,9]);


3) sortare prin insertie (folosind functia de mai sus)

fun insertionSort [] = nil
| insertionSort (m::myList) = insert (m, insertionSort myList);

insertionSort [5,2,7,4,1,0,8,9];


4) toate submultimile unei multimi

local
    fun add x ys = x :: ys
in
    fun subsets1 []      = [[]]
      | subsets1 (x::xr) = subsets1 xr @ map (add x) (subsets1 xr)
end;

subsets1 [1,2,3];


5) o structura de date pt. coordonate in 2D si aflarea distantei dintre 2 puncte

(* coords = datatype name
Cords = constructor *)
datatype coords = Cords of real * real;

val p1 = Cords (1.2, 3.4);

fun sq (x:real) = x * x;

fun distance (Cords(x1, y1):coords, Cords(x2, y2):coords) =
Math.sqrt (sq (x2-x1) + sq (y2-y1));

distance (Cords (1.0, 2.0), Cords (1.1, 2.1));

(* alta s.d. pt o persoana *)
datatype person = Pers of string * string * int;
val x = Pers ("anna", "ehcat", 25);


6) Variabile-referinta
val i = ref 10; 
inc(i);
dec(i);
i := 20;


7) alt exercitiu cu structuri de date

datatype item
  = Vgn of string * real
  | Vgt of string * real
  | Omn of string * real;

fun isVegan (Vgn _) = true
| isVegan _ = false;

fun findVegan [] = []
| findVegan (m::mylist) = if isVegan m then m::findVegan(mylist) else findVegan mylist;

(*
findVegan [Vgn ("apple", 2.7), Vgt ("milk", 1.2), Omn ("beef", 5.5), Vgn ("coconut", 3.3)];
*)

(* FIND THE CHEAPEST OMNIV. FOOD *)

fun findCheapO ([], product) = product
| findCheapO ((Omn (name, price))::rest, Omn(name2, price2)) =
if price < price2 then findCheapO (rest, Omn(name, price))
else findCheapO (rest, Omn(name2, price2))
| findCheapO (m::other, cheapest) =
findCheapO(other, cheapest);

fun findCheapestOmni mylist = findCheapO (mylist, Omn("dummy", 999.9));

val superStore = [Vgn ("apple", 2.7), Vgt ("milk", 1.2), Omn ("beef", 5.5), Vgn ("coconut", 3.3), Omn("fish", 3.2), Omn("eggs", 7.8)];

(*
findCheapestOmni superStore;
*)

(* FIND THE PRICE OF AN ORDER *)

fun getPrice (Vgn (name, price)) = price
| getPrice (Vgt (name, price)) = price
| getPrice (Omn (name, price)) = price;

fun getName (Vgn (name, price)) = name
| getName (Vgt (name, price)) = name
| getName (Omn (name, price)) = name;

datatype order = Ord of string * int;

fun lookup (myorder, []) = ~1.0
| lookup (Ord(name, quant), m::mylist) =
if name = getName (m) then getPrice(m)
else lookup(Ord(name, quant), mylist);

(*
lookup(Ord("beef", 2), superStore);
*)


(* input: an order & a menu
output: total cost of the order *)

fun cost (order, []) = 0.0
| cost (Ord(name, quant), mylist) =
let val price = lookup (Ord(name, quant), mylist)
in price * real(quant)
end;

(*
cost(Ord("beef", 2), superStore);
*)

(* input: a list of orders & a menu
output: the total cost of all the orders
*)

fun totalCost ([], menu, cost1) = cost1
| totalCost (orderList, [], cost1) = cost1
| totalCost (ord::orderList, menu, cost1) =
totalCost (orderList, menu, cost(ord, menu) + cost1);

totalCost ([Ord("beef", 2), Ord("fish", 3)], superStore, 0.0);

------------------------------

8) al n-lea element dintr-o lista

fun nth ([], n) = ~99999
| nth (mylist, 0) = ~99999
| nth (m::mylist, 1) = m
| nth (m::mylist, n) = nth (mylist, n-1);

nth ([5,8,3,1,0], 4);


9) elementul de la jumatatea listei

fun middle ([]) = ~99999
| middle (mylist) = nth (mylist, length (mylist) div 2 + 1);

middle ([1,2,3,4,5,6]);


10) produsul cartezian al doua multimi

fun cartesian (nil, blist) = nil
| cartesian (alist, nil) = nil
| cartesian (a::alist, b::blist) =
(a,b) :: cartesian (a::nil, blist) @ cartesian(alist, b::blist);

cartesian (["a","b","c"],[1,2]);

10 ianuarie 2015

Pe ce se duce taxa de studii intr-un semestru... (studiu de caz) - intr-o universitate din Louisiana, grad school

INSURANCE $ 479.00
INTL SVC 20.00
NONRES FEE 6200.00
REG.FIXED 45.00
GSO FEE 15.00
TUITION
2504.80
STU UNION
23.00
STU TECH 50.00
FIXED FEE 31.60
ENERGY FEE 55.00
STU HLTH
20.00
PARK/TRANS
50.00
RECREATION 20.00
STU UNION
55.00
ART MUSEUM
5.00
ACAD EXCEL 100.00
AUX IMPROV 15.00
BAND ASSOC
5.00
CHEERLEADR
4.00
OPER. FEE 51.00
LYCEUM 0.61
STU UNION
20.00
STU HLTH
5.00
S G A 7.50
ARTS FEE
7.00
AUX OPER 100.00
GRAD FEE
300.00
GRAD ENHAN 10.00
MAP
75.00
BLDG USE N 40.00
GENERAL FE 103.49

TOTAL:$ 10417.00

Observatii:
* Tuition fee (taxa de scolarizare propriu-zisa) este $2504, cam un sfert din costul total. Trei sferturi merg pentru altele...
* nu e vorba ca ai acces gratuit la gym ("facilitati"), ci toata lumea plateste gym-ul in mod obligatoriu, e optiunea ta daca ai chef sa mergi sau nu (RECREATION 20)
* platesti majoretele si banda care intoneaza imnul universitatii la meciurile sportive ale universitatii indiferent daca esti fan sau nu (CHEERLEADR $4 , BAND ASSOC $5)
* pentru o noua cladire inaugurata in campus (in cazul de fata STU UNION), contribuie toti studentii - in cazul de fata cu $ 23+55+20 sau mai pe scurt, $98.
* pt faptul ca esti graduate student, mai platesti o taxa de $300 (ca sa compenseze aparentele avantaje, cum ar fi oferte mai bune la campus housing sau meal plans). In plus, grad school din cadrul universitatii are propriul ei staff care vegheaza la grad students matters, iar ei trebuie platiti
* daca esti student international, din start platesti $6200 (NONRES FEE) in plus, ceea ce face suma totala mai mult decat dubla fata de ce plateste un rezident
* OIA (Office for International Affairs), care vegheaza interesele studentilor internationali, este si ea platita cu $20 de catre fiecare student strain (INTL SVC)
* $50 pt parcari si transport (PARK/TRANS) - se platesc parcarile staff-ului si ale unor studenti, in jurul cladirilor facultatii. Transportul cu shuttle se plateste si el, in cazul de fata acesta tine in principal cat pana la gym si inapoi in campus (2 km distanta). In majoritatea caminelor, parcarea este taxata separat. Mai sunt cateva cladiri speciale doar pt parcare, acelea de asemenea se platesc separat si sunt foarte scumpe.
* student health ($ 20+5 = $ 25) este o taxa pentru Student wellness center, si este independenta de asigurarea medicala obligatorie (INSURANCE $479)
* se plateste ART MUSEUM si ART FEE - de aceea intrarea la muzeul de langa universitate e gratuita, nu pt ca am fi noi studenti si deci speciali
* o serie de taxe cu nume care mai de care sa para diferite sunt: REG FIXED, FIXED FEE, OPER. FEE, LYCEUM, AUX OPER, MAP, GENERAL FEE. 
* plus altele pe care nu le-am enumerat, precum organizatiile de studenti GSO (graduate student organization) si SGA (student guvernment assoc), care sponsorizeaza studenti din cand in cand (cu sume mult sub ce au contribuit ca taxa de scolarizare, ce-i drept), ca sa se dea senzatia ca studentul este sprijinit.

Bineinteles ca totul este profitabil cand esti graduate assistent si ai bursa, insa nu vreau sa ma gandesc la ceilalti, prin ce costuri trec. Iar tinand cont ca in Louisiana este mai "ieftin", atunci imaginati-va cat de scump este in alte state. Nu degeaba tinerii americani muncesc de la 18 ani, cu munca pe primul loc si facultatea pe al doilea. Nu degeaba, ei nu mai sunt interesati de mastere sau doctorate. Toate micile avantaje pe care noi le percepem ca dovezi de superioritate ale invatamantului american, si care se rezuma la mai multa finantare, sunt de fapt platite la greu, obligatoriu, de studentii convinsi ca ei trebuie sa fie proud (Ragin' Cajuns in cazul de fata).

PS:
Pentru cei care nu sunt siguri,
* tuition = scolarizare
* gym = sala de sport, complex sportiv
* graduate student = masterand sau doctorand
* campus housing, dorms = cazare in campus
* meal plans = program culinar
* shuttle = autobuz de dimensiuni mai mici, maxi taxi