Ciao ragazzi vi spiego il problema....




io ho questo codice :



codice:

 function getCombinations(arr, n){  
    var i,j,k,elem,l = arr.length,childperm,ret=[];
    if(n == 1){
        for(var i = 0; i < arr.length; i++){
            for(var j = 0; j < arr[i].length; j++){
                ret.push([arr[i][j]]);
            }
        }
        return ret;
    }
    else{
        for(i = 0; i < l; i++){
            elem = arr.shift();
            for(j = 0; j < elem.length; j++){
                childperm = getCombinations(arr.slice(), n-1);
                for(k = 0; k < childperm.length; k++){
                         ret.push([elem[j]].concat(childperm[k]));                    
                }
            }
        }
        return ret;
    }
    i=j=k=elem=l=childperm=ret=[]=null;
}


che mi crea delle combinazioni senza ripetizione e senza un ordine preciso, e di "n" cifre.


Quindi se noi avessimo questi elementi:


B
C
D
E


con l'aggiunta di quest'altro pezzo di codice:




codice:

function combinazione() {
 
var pi18= ("B");
var pi7= ("C");
var pi8= ("D");
var pi9 = ("E");
 

var arr2 = [[pi18],[pi7],[pi8],[pi9]];
var n2 = 2;
var results2 = getCombinations(arr2.slice(),n2);
for(var i = 0; i < results2.length; i++) {
var cs1 = results2[i].slice(0,1);
    var cs2 = results2[i].slice(1,2);   
    var cs1s = cs1.toLocaleString();
    var cs2s = cs2.toLocaleString(); 
 var cs1ss= cs1s.substr(0);
 var cs2ss= cs2s.substr(0);
    var elem1= (cs1ss);
    var elem2= (cs2ss);
 
 document.write( elem1 +  elem2 + "<br>");
 
 }
 }


verrebbero stampate a video le seguente combinazioni:


BC
BD
BE
CD
CE
DE


se invece volessimo combinazioni con 3 cifre, allora dovremmo inserire questo pezzo di codice:



codice:


function combinazione() {
 
var pi18= ("B");
var pi7= ("C");
var pi8= ("D");
var pi9 = ("E");
 

var arr2 = [[pi18],[pi7],[pi8],[pi9]];
var n2 = 3;    //qui è avvenuta la modifica ! abbiamo sostituito 2 con 3 
var results2 = getCombinations(arr2.slice(),n2);
for(var i = 0; i < results2.length; i++) {
var cs1 = results2[i].slice(0,1);
    var cs2 = results2[i].slice(1,2);   
    var cs1s = cs1.toLocaleString();
    var cs2s = cs2.toLocaleString(); 
 var cs1ss= cs1s.substr(0);
 var cs2ss= cs2s.substr(0);
    var elem1= (cs1ss);
    var elem2= (cs2ss);
 
 document.write( elem1 +  elem2 + "<br>");
 
 }
 }



Ora vi descrivo il problema:





ho questo codice:




codice:
function getCombinations(arr, n){  
    var i,j,k,elem,l = arr.length,childperm,ret=[];
    if(n == 1){
        for(var i = 0; i < arr.length; i++){
            for(var j = 0; j < arr[i].length; j++){
                ret.push([arr[i][j]]);
            }
        }
        return ret;
    }
    else{
        for(i = 0; i < l; i++){
            elem = arr.shift();
            for(j = 0; j < elem.length; j++){
                childperm = getCombinations(arr.slice(), n-1);
                for(k = 0; k < childperm.length; k++){
                         ret.push([elem[j]].concat(childperm[k]));                    
                }
            }
        }
        return ret;
    }
    i=j=k=elem=l=childperm=ret=[]=null;
}
 

function combinazione() {

var importo = parseFloat(200.56);
var importoN = (importo)-180;
var pi18= parseFloat(160);
var pi7= parseFloat(150);
var pi8= parseFloat(32.75);
var pi9= parseFloat(11);
var pi10= parseFloat(43.34);
var pi11= parseFloat(27.54);
var pi12= parseFloat(90.40);
 

var arr2 = [[pi18],[pi7],[pi8],[pi9],[pi10],[pi11],[pi12]];
var n2 = 2;
var results2 = getCombinations(arr2.slice(),n2);
for(var i = 0; i < results2.length; i++)
{
    var cs1 = results2[i].slice(0,1);
    var cs2 = results2[i].slice(1,2);   
    var cs1s = cs1.toLocaleString();
    var cs2s = cs2.toLocaleString(); 
 var cs1ss= cs1s.substr(0);
 var cs2ss= cs2s.substr(0);
    var elem1= parseFloat(cs1ss);
    var elem2= parseFloat(cs2ss); 
    var fine = (elem1+elem2)/2;
     var datoimp2= (importo-fine);
  var datoimp2N= (importoN-fine);  
    if (((datoimp2 < 50) && (datoimp2 > 40)) || ((datoimp2 > -50) && (datoimp2 < -40)) || ((datoimp2N > -50) && (datoimp2N < -40)) || ((datoimp2N > 50) && (datoimp2N < 40)) ) {
  var black2 = datoimp2;

 } 
  else if  ((datoimp2 < 40) || (datoimp2 > 50) || (datoimp2 > -40) || (datoimp2 < -50) )  {  
  var black3 = " ";
 }
 
 
 } 
 if (black2==null) {
   var black2 = ' ';
   }      
  var allerteq= '<span>' + black2 + '  ' + black3 + '  </span><br>';
  $(allerteq).appendTo('#modalita');
}

crea tutte le combinazioni (senza ordine e senza ripetizione) dei valori delle variabili.

poi c'è l' IF che praticamente fa si che venga preso solo quel valore della combinazione, compreso tra 40 e 50, o -40 e -50.



Se volessimo fare il document.write di:



codice:
var datoimp2= (importo-fine);
  var datoimp2N= (importoN-fine);

avremmo questi risultati:

codice:
181.33 --- 1.33
121.33 --- -58.66
161.33 --- -18.66
109.33 --- -70.66
213.83 --- 33.83
51.83 --- -128.16
136.33 --- -73.66
176.33 --- -3.66
124.33 --- -55.66
228.83 --- 48.83
66.83 --- -113.16
116.33 --- -63.66
64.33 --- -115.66
168.83 --- -11.16
6.83 --- -173.16
104.33 --- -75.66
208.83 --- 28.83
46.83 --- -133.16
156.83 --- -23.16
-5.16 --- -185.16
99.33 --- -80.66
ho riportato in grassetto l'unico valore che verrebbe riportato nel div #modalità


Fino a qui nessun problema.... ma ora arriva il bello:


ammettiamo che ci sia anche questo pezzo di codice:


codice:
function combinazione2() {

var importo = parseFloat(24);
var importoN = (importo)*(-1);
var pi18= parseFloat(16);
var pi7= parseFloat(14);
var pi8= parseFloat(12);
var pi9= parseFloat(10);
var pi10= parseFloat(8);
var pi11= parseFloat(12);
var pi12= parseFloat(4);
 

var arr2 = [[pi18],[pi7],[pi8],[pi9],[pi10],[pi11],[pi12]];
var n2 = 2;
var results2 = getCombinations(arr2.slice(),n2);
for(var i = 0; i < results2.length; i++)
{
    var cs1 = results2[i].slice(0,1);
    var cs2 = results2[i].slice(1,2);   
    var cs1s = cs1.toLocaleString();
    var cs2s = cs2.toLocaleString(); 
 var cs1ss= cs1s.substr(0);
 var cs2ss= cs2s.substr(0);
    var elem1= parseFloat(cs1ss);
    var elem2= parseFloat(cs2ss); 
    var fine = (elem1+elem2)/2;
     var datoimp2= (importo-fine);
  var datoimp2N= (importoN-fine);  
 
 
 document.write(datoimp2 + " --- " + datoimp2N +"<br>");
 } 
     
  var allerteq= '<span>' + ??????? + '  </span><br>';
  $(allerteq).appendTo('#modalita');
}

c'è il document.write ..... quindi avremmo questi risultati :


9 --- -39
10 --- -38
11 --- -37
12 --- -36
10 --- -38
14 --- -34
11 --- -37
12 --- -36
13 --- -35
11 --- -37
15 --- -33
13 --- -35
14 --- -34
12 --- -36
16 --- -32
15 --- -33
13 --- -35
17 --- -31
14 --- -34
18 --- -30
16 --- -32


io cerco un modo che recuperi (che inserisca li dove ho messo i punti interrogativi) quel valore che ora ho riportato in grassetto.
Perché quel -37 è associato al 48.83 ....



avete qualche idea ???


scusate se mi sono spiegato da cane, e scusate se non ho trovato un titolo adeguato...