function celkova_doba(stavebni_rada, delka_polozky)
{
var suroviny = [500, 500, 0];
var doly = [0, 0, 0];
var doba = 0;
var budova;
var lvl;
var cena_surr = [0, 0, 0];
var cekani = [0, 0, 0];
for(i=0; i<stavebni_rada.length ; i+=delka_polozky+1)
{
cekani = [0, 0, 0];
budova = stavebni_rada[i];
//console.log("BUDOVA: "+budova);
if(budova=="K") budova = "kov";
else if(budova=="C") budova = "krystal";
//else if(budova=="D") budova = "deuterium";
else if(budova=="S") budova = "solar";
lvl = extract_number(stavebni_rada.substring(i, i+delka_polozky));
cena_surr[0] = cena(budova, lvl, "kov");
cena_surr[1] = cena(budova, lvl, "krystal");
//cena_surr[2] = cena(budova, lvl, "deuterium");
//console.log("CENA: "+cena_surr);
//console.log("SURR_mame:"+suroviny);
if(cena_surr[0] > suroviny[0]){ cekani[0] = ((cena_surr[0]-suroviny[0]) / (produkce("kov", doly[0], 1) ) *3600) |0; }
if(cena_surr[1] > suroviny[1]){ cekani[1] = ((cena_surr[1]-suroviny[1]) / (produkce("krystal", doly[1], 1)) *3600) |0; }
//if(cena_surr[2] > suroviny[2]){ cekani[2] = (cena_surr[2]-suroviny[2]) / (produkce("deuterium", doly[2], 1)); }
//console.log("CEKANI: "+cekani);
cekani = cekani.sort(function(a, b){return a-b});
cekani[2] += doba_stavby(budova, lvl, 0, 0);
//console.log("CEKANI_2: "+cekani[2]);
suroviny[0] += ((((cekani[2]/3600) * produkce("kov", doly[0], 1)) |0) ) - cena_surr[0];
suroviny[1] += ((((cekani[2]/3600) * produkce("krystal", doly[1], 1)) |0) ) - cena_surr[1];
//suroviny[2] += (cekani[2] * produkce("deuterium", doly[2], 1)) - cena_surr[2];
doba += cekani[2];
//console.log("SURR: "+suroviny);
//console.log("Cekani: "+cekani);
//console.log(" ");
if(budova=="kov") doly[0]++;
else if(budova=="kov") doly[1]++;
//else if(budova=="deuterium") doly[2]++;
}
return doba;
}
// --------------------------------------------------------------------------------------------------------------------------------------------------------
function produkce(budova, lvl, rychlost) // kov + krystal = celková produkce
{
if(budova == "kov" && lvl>0){ return ((30*lvl*Math.pow(1.1,lvl)*rychlost)+30) | 0 ; }
else if(budova == "kov" && lvl==0){ return 30; }
else if(budova == "krystal" && lvl>0){ return ((20*lvl*Math.pow(1.1,lvl)*rychlost)+15) | 0 ; }
else if(budova == "krystal" && lvl==0){ return 15; }
// deu
else {console.log("Chyba ve fci produkce"); return 0};
}
function spotreba(budova, lvl)
{
if(lvl==0){ return 0;}
var solar = [0, -22, -26, -31, -38, -43, -51, -60, -70, -82, -94, -109, -126, -144, -166, -190, -217, -248, -283, -323, -366, -418, -473, -537, -609, -690, -780, -882, -996, -1125, -1269, -1431, -1612, -1816, -2044, -2299, -2586];
var kov_krystal = [0, 11, 14, 15, 19, 22, 26, 30, 35, 41, 47, 54, 63, 72, 83, 95, 109, 124, 141, 162, 183, 209, 236, 269, 304, 345, 390, 441, 498, 563, 634, 716, 806, 908, 1022, 1149, 1293, 1453, 1632, 1833, 2057, 2308, 2589, 2903, 3253, 3644, 4082, 4570, 5166, 5724, 6403];
var deuterium = [0, 22, 27, 31, 38, 44, 51, 60, 70, 82, 94];
if(budova == "solar") return solar[lvl];
else if(budova == "kov" || budova == "krystal") return kov_krystal[lvl];
else if(budova == "deuterium") return deuterium[lvl];
else {console.log("Chyba ve fci spotreba()"); return 0};
}
function cena(budova, lvl, surovina)
{
//console.log("CENA-BUDOVA:"+budova+";"+lvl+";"+surovina);
if(lvl==0){ return 0;}
else if(surovina=="kov")
{
if(budova == "kov"){ return 60*Math.pow(1.5, lvl-1) | 0; }
else if(budova == "krystal"){ return 48*Math.pow(1.6, lvl-1) | 0; }
else if(budova == "deuterium"){ return 225*Math.pow(1.5, lvl-1) | 0; }
else if(budova == "solar"){ return 75*Math.pow(1.5, lvl-1) | 0; }
}
else if(surovina=="krystal")
{
if(budova == "kov"){ return 15*Math.pow(1.5, lvl-1) | 0; }
else if(budova == "krystal"){ return 24*Math.pow(1.6, lvl-1) | 0; }
else if(budova == "deuterium"){ return 75*Math.pow(1.5, lvl-1) | 0; }
else if(budova == "solar"){ return 30*Math.pow(1.5, lvl-1) | 0; }
}
else if(surovina=="deuterium")
{
if(budova == "kov"){ return 0; }
else if(budova == "krystal"){ return 0; }
else if(budova == "deuterium"){ return 0; }
else if(budova == "solar"){ return 0; }
}
else {console.log("Chyba ve fci cena"); return 0};
}
function doba_stavby(budova, lvl, robo, nano)
{
if(lvl==0){ return 0;}
return (((cena(budova, lvl, "kov") + cena(budova, lvl, "krystal")) / (2500*(robo+1)*Math.pow(0.5,nano)) ) *3600 ) | 0;
}
// --------------------------------------------------------------------------------------------------------------------------------------------------------
function extract_number(data)
{
var i=0; var y="";
while( i < data.length )
{
if( data[i]==="0" || data[i]==="1" || data[i]==="2" || data[i]==="3" || data[i]==="4" || data[i]==="5" || data[i]==="6" || data[i]==="7" || data[i]==="8" || data[i]==="9" ) { y += data[i]; }
i++;
}
return parseInt(y);
}
// --------------------------------------------------------------------------------------------------------------------------------------------------------
function test_duplicity(pole)
{
for (var i=0; i < pole.length-1; i++) { if(pole[i+1] == pole[i]) { return -1; } }
}
// --------------------------------------------------------------------------------------------------------------------------------------------------------
function test_predchudcu(pole)
{
pole.forEach( function(polozka, index)
{
var lvl = extract_number(polozka);
for(i=1; i<lvl; i++)
{
if(i<10){ if( pole.indexOf(polozka[0]+i+" ") == -1 || pole.indexOf(polozka[0]+i+" ") > index){ pole[0] = -1;} }
else { if( pole.indexOf(polozka[0]+i+"") == -1 || pole.indexOf(polozka[0]+i+"") > index){ pole[0] = -1;} }
}
}
)
if( pole[0] == -1 ) return -1;
else return 0;
}
// --------------------------------------------------------------------------------------------------------------------------------------------------------
function test_energie(pole)
{
var spotreba_en = 0;
for(i=0; i<pole.length-1; i++)
{
var budova = pole[i][0];
// console.log(budova);
if(budova=="K") budova = "kov";
else if(budova=="C") budova = "krystal";
else if(budova=="D") budova = "deuterium";
else if(budova=="S") budova = "solar";
var lvl = extract_number(pole[i]);
// console.log(lvl);
spotreba_en += spotreba(budova, lvl);
// console.log(spotreba_en);
if(spotreba_en > 0) return -1;
}
return 0;
}
// --------------------------------------------------------------------------------------------------------------------------------------------------------
function generuj(chars, suroviny, doly, energie)
{
var pocet_polozek = chars.length;
var delka_polozky = chars[0].length;
var pole = JSON.parse(JSON.stringify(chars));
pole.forEach(function(i, index){ pole[index] = 0; })
var stavby = JSON.parse(JSON.stringify(chars));
stavby.forEach(function(i, index){ stavby[index] = 0; })
var duplicita = 0;
var predchudci = 0;
var energie = 0;
var iterace = 0;
var pocet_it = 0;
while( pole[0] != pocet_polozek)
{
if(iterace == 1000000)
{
pocet_it++;
iterace=0;
console.log("It: "+pocet_it+".000.000 | Dup:"+duplicita+" | Pred:"+predchudci+" | En:"+energie);
}
if( test_duplicity(pole.slice().sort()) != -1)
{
for(y=0 ; y<pocet_polozek ; y++){ stavby[y] = chars[pole[y]]; }
//console.log(stavby);
if( test_predchudcu(stavby) != -1 )
{
if( test_energie(stavby) != -1 )
{
console.log(stavby+"\t"+celkova_doba(stavby.toString(), delka_polozky)+"\t\t It:"+((pocet_it*1000000)+iterace)+" | Dup:"+duplicita+" | Pred:"+predchudci+" | En:"+energie);
}
else{ energie++;}
}
else{ predchudci++;}
}
else{ duplicita++;}
iterace++;
for(i=pocet_polozek-1; i>=0; i--)
{
if(i==0 && pole[i] < pocet_polozek){pole[i]++; break;}
if(pole[i] < pocet_polozek-1){pole[i]++; break;}
else pole[i]=0;
}
}
}
//localStorage.setItem("SHEDULE_TIME", 999999999999999999999);
//var chars = ["S1 ", "S2 ", "S3 ", "S4 ", "S5 ", "S6 ", "S7 ", "S8 ", "S9 ", "K1 ", "K2 ", "K3 ", "K4 ", "K5 ", "K6 ", "K7 ", "K8 ", "K9 ", "K10", "C1 ", "C2 ", "C3 ", "C4 ", "C5 ", "C6 ", "C7 "];
var chars = ["S1 ", "K1 ", "K2 ", "C1 ", "S2 ", "S3 ", "S4 ", "K3 ", "K4 "];
console.log("START");
generuj(chars, [500, 500, 0], [0, 0, 0], 0);
console.log("KONEC");
//--------------------------------------------------------
function solve(a, b, c, a_max, b_max, c_max, solution)
{
if( a==a_max && b==b_max && c==c_max )
{
console.log(solution);
//if( test_energie(stavby) != -1 )
// {
// console.log(stavby+"\t"+celkova_doba(stavby.toString(), delka_polozky)+"\t\t It:"+((pocet_it*1000000)+iterace)+" | Dup:"+duplicita+" | Pred:"+predchudci+" | En:"+energie);
// }
}
if( a<a_max )
{
a++;
solution = solution+"K"+a+" ";
solve(a, b, c, a_max, b_max, c_max, solution);
a--;
solution = solution.substring(0, solution.length - 3);
}
if( b<b_max )
{
b++;
solution = solution+"C"+b+" ";
solve(a, b, c, a_max, b_max, c_max, solution);
b--;
solution = solution.substring(0, solution.length - 3);
}
if( c<c_max )
{
c++;
solution = solution+"S"+c+" ";
solve(a, b, c, a_max, b_max, c_max, solution);
c--;
solution = solution.substring(0, solution.length - 3);
}
}
solve(0, 0, 0, 4, 2, 4, "");