Evo rešenja! Nadam se da mi nećete uzeti za zlo neoptimalan i ne tako lep kod, ipak je sada 3 ujutru. Takođe želeo bih da se izvinim jer je moj Kliper malo zarđao, pa sam se ipak odlučio za JS. Nadam se da će sledeći put u opticaju biti i Cobol ili bar Algol. Od objektno orijentisanih jezika ako može Simula, ako ne onda Smalltalk. Tu su naravno i Lisp i Prolog. Mada, kada bolje razmislim, BrainF*ck je zakon!
Code:
//test
console.log(fIndex(8,3,[1,4,8]));
console.log(gKombinacija(8, 3, 15));
//
function fIndex(n, k, arr)
{
var ret = 0;
function poredi(index, k, kombinacija)
{
if (arr.join("") === kombinacija.join("")) {
ret = index;
return true;
}
return false;
}
generisi(n, k, poredi);
return ret;
}
function gKombinacija(n, k, index)
{
var ret = [];
function poredi(brojac, k, kombinacija)
{
if (brojac === index) {
ret = kombinacija;
return true;
}
return false;
}
generisi(n,k, poredi);
return ret;
}
function generisi(n, k, func)
{
function isOverflow(index, val) {return val > n - (k - index - 1);}
function findIndex(inc)
{
for (var i = k-1; i >=0; i--) {
var val = current[i] + inc;
if ( ! isOverflow(i, val)) {
return i;
}
}
return false;
}
var current = [];
for (var i = 1; i <= k; i++) {
current.push(i);
}
var inc = 0
var brojac = 0;
while (true) {
brojac++;
var index = findIndex(inc);
if (index === false) {
return;
}
current[index] += inc;
for (var j = index + 1; j < k; j++) {
current[j] = current[j-1] + 1;
}
if (func(brojac, k, current)) {
return;
}
inc = 1;
}
}