Skip to content

Instantly share code, notes, and snippets.

@nietaki
Created April 3, 2011 21:37
Show Gist options
  • Save nietaki/900850 to your computer and use it in GitHub Desktop.
Save nietaki/900850 to your computer and use it in GitHub Desktop.
/*
*/
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