Created
April 3, 2011 21:37
-
-
Save nietaki/900850 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
*/ | |
function Oferta(slowo, pozycja){ | |
this.slowo = slowo; | |
this.pozycja = pozycja; | |
} | |
function mnoznik(procent){ | |
return 1+ procent/100; | |
} | |
function Klient(imie, budzet){ | |
var imie = imie; | |
var budzet = budzet; | |
var oferty = new Array();//jako lista | |
var zakupy = new Array();//jako słownik | |
var doplatyPozycje = new Array();//jako słownik | |
var doplatySlowa = new Array();//jako słownik | |
this.doplata = function(co, key, ile){ | |
co[key] = mnoznik(ile); | |
} | |
this.doplataZaPozycje = function(poz, ile){ | |
this.doplata(doplatyPozycje, poz, ile); | |
} | |
this.doplataZaSlowo = function(slowo, ile){ | |
this.doplata(doplatySlowa, slowo, ile); | |
} | |
this.imie = function(){ | |
return imie; | |
} | |
this.kup = function(slowo, poz){ | |
if(poz == undefined){ | |
var pozy = [3, 2, 1]; | |
var tmp; | |
for (tmp in pozy){ | |
this.kup(slowo, pozy[tmp]); | |
} | |
return; | |
} | |
//poz zostalo podane | |
oferty.push(new Oferta(slowo, poz)); | |
} | |
this.wycen = function(slowo, pozycja){ | |
var cena = slowo.cena(); | |
//sprawdzanie pozycji | |
if(doplatyPozycje[pozycja] != undefined){ | |
cena = cena * doplatyPozycje[pozycja]; | |
} | |
//sprawdzanie dopasowania slowa | |
var multi = 1; //mnoznik przy sprawdzaniu regeksów | |
for(var k in doplatySlowa){ | |
//console.log('regex:' + k +' slowo: '+ slowo.nazwa()); | |
var re = new RegExp(k); | |
var curMulti = doplatySlowa[k]; | |
if(re.test(slowo.nazwa())){// && curMulti > multi){ | |
//jezeli wykupywane slowo podpada pod nasze doplaty a doplata jest wieksza niz dotychczasowa | |
multi = curMulti; | |
} | |
} | |
cena = cena * multi; | |
cena = Math.round(cena*100)/100; | |
return cena; | |
} | |
this.zakupuj = function(system){ | |
for (var i in oferty){ | |
var tmp = oferty[i]; | |
//tmp jest typu Oferta, ma slowo i pozycje | |
if(zakupy[tmp.slowo] != undefined){ | |
//klient juz to kupil; | |
continue; | |
} | |
//TODO | |
//console.log('wyceniam kolejny item'); | |
var wycena = this.wycen(system.slowo(tmp.slowo), tmp.pozycja); | |
//console.log(wycena); | |
if (wycena <= budzet){ | |
if( system.slowo(tmp.slowo).wykup(tmp.pozycja)){ | |
//jesli jeszcze slowo na tej pozycji nie bylo wykupione | |
//kupuję | |
budzet -= wycena; | |
//i zapisuję | |
zakupy[tmp.slowo] = new Array(); | |
zakupy[tmp.slowo]['cena'] = wycena; | |
zakupy[tmp.slowo]['pozycja'] = tmp.pozycja; | |
} | |
} | |
} | |
} | |
this.zakupy = function(){ | |
return zakupy; | |
} | |
} | |
function Slowo(nazwa, cena){ | |
var nazwa = nazwa; | |
var cena = cena; | |
var kupione = new Array(); | |
for (var i=1; i<=3; i++){ | |
kupione[i] = false; | |
} | |
this.wykup = function(pozycja){ | |
var ret = !kupione[pozycja]; | |
if(ret){ | |
kupione[pozycja] = true; | |
} | |
return ret; | |
} | |
this.cena = function(){ | |
return cena; | |
} | |
this.nazwa = function(){ | |
return nazwa; | |
} | |
} | |
function jsonify(arr){ | |
var ret = ''; | |
if($.isArray(arr)){ | |
ret += '{\n'; | |
for(i in arr){ | |
ret += jsonify(i); | |
ret += ': '; | |
ret += jsonify(arr[i]); | |
ret +=',\n'; | |
} | |
ret = ret.substr(0, ret.length -2) | |
ret += '\n}'; | |
return ret; | |
}else{ | |
switch (typeof(arr)){ | |
case 'number': | |
return arr; | |
break; | |
case 'string': | |
return '"' + arr + '"'; | |
break; | |
default: | |
return 'weird type in jsonify' + typeof(arr); | |
} | |
} | |
return 'unsupported type in jsonfy'; | |
} | |
function SystemZakupow(){ | |
var klienci = new Array(); | |
var slowa = new Array(); | |
this.dodajKlienta = function(klient){ | |
klienci.push(klient); | |
} | |
this.dodajSlowo = function(slowo, cena){ | |
slowa[slowo] =new Slowo(slowo, cena); | |
} | |
this.wykup = function(slowo, pozycja){ | |
return slowa[slowo].wykup(pozycja); | |
} | |
this.rozegraj = function(){ | |
var ret = new Array(); | |
for (var i in klienci){ | |
var klient = klienci[i]; | |
klient.zakupuj(this); | |
ret[klient.imie()] = klient.zakupy(); | |
} | |
return jsonify(ret); | |
} | |
this.slowo = function(nazwa){ | |
return slowa[nazwa]; | |
} | |
} | |
function test(){ | |
s = new SystemZakupow() | |
k1 = new Klient("K1", 900) //klient o nazwie K1 i budżecie 900 | |
k1.doplataZaPozycje(1, 10) // klient za pozycję 1 dopłaca 10 % | |
k2 = new Klient("K2", 1000) | |
k2.doplataZaSlowo(".*piw.*", 20) // klient za reklamy przy słowach zawierających napis piw dopłaca 20% | |
k2.doplataZaPozycje(3, 10) | |
k1.kup("piwo", 1) // klient chce kupić piwo na pierwszej pozycji | |
k1.kup("piwo", 2) // jeśli klientowi nie uda się kupić piwa na pierwszej pozycji, to chce je kupić na drugiej pozycji | |
k1.kup("chrupki") | |
k1.kup("tonic") | |
k2.kup("piwo", 1) | |
k2.kup("piwo", 2) | |
k2.kup("tonic") | |
k2.kup("kurczak") | |
s.dodajKlienta(k1) | |
s.dodajKlienta(k2) | |
s.dodajSlowo("piwo", 600) | |
s.dodajSlowo("chrupki", 200) | |
s.dodajSlowo("tonic", 200) | |
s.dodajSlowo("kurczak", 400) | |
wynik = s.rozegraj()// // wynik jest w JSON | |
$('textarea#tarea').val(wynik); | |
//piwo = s.slowo('piwo'); | |
} | |
$(document).ready(function(){ | |
test(); | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment