Cum să generezi permutări în node.js?
0Node.js tinde să aibă o rată de adopție destul de semnificativă și să crească încet, dar sigur. Dacă ai nevoie de o metodă simplă de a genera toate aranjamentele de minim x caractere și maxim y caractere aplicația de mai jos te-ar putea ajuta. Exemplul de mai jos este o implemantare de bază a unei funcții nextPermutation(callback) care iți va genera mereu următoarea permutare și o va scrie în fișierul wordlist.txt. Implementarea nu e foarte maleabilă și are nevoie de ceva update-uri dacă dorești să o folosești în mod repetat în același proiect dar ca și concept este extrem de utilă. Am integrat comentarii doar în partea algoritmului, restul presupunând că ar cam trebui să cunoașteți.
Dependențe
Node Package Manager + cele două pachete NPM de mai jos:
npm install optimist npm install underscore
Sursa
var fs = require('fs'), argv = require('optimist').argv, _ = require('underscore'), file = 'wordlist.txt', stream = fs.createWriteStream(file, {flags: 'w'}); // Numbers = 48 - 57 // Capital = 65 - 90 // Lower = 97 - 122 var charsBuffer = [], numbers = _.range(48, 58), alfalow = _.range(97,123), alfacap = _.range(65,91); switch(argv.type){ case 1: charsBuffer = numbers; break; case 2: charsBuffer = alfacap; break; case 3: charsBuffer = alfalow; break; case 4: charsBuffer = _.union(numbers,alfacap); break; case 5: charsBuffer = _.union(numbers,alfalow); break; case 6: charsBuffer = _.union(numbers,alfalow,alfacap); break; case 7: charsBuffer = _.union(alfalow,alfacap); break; default: console.log(""+ "Invalid options, please chose a type number between 1 to 7. \nEx: node wordlist.js --type 1 --min 1 --max 10\n"+ "1) Numbers\n"+ "2) Capital Letters\n"+ "3) Lowercase Letters\n"+ "4) Numbers + Capital Letters\n"+ "5) Numbers + Lowercase Letters\n"+ "6) Numbers + Capital Letters + Lowercase Letters\n"+ "7) Capital Letters + Lowercase Letters\n"); process.exit(0); } var string = _.map(charsBuffer,function(dec) { return String.fromCharCode(dec); }).join(''); if(!_.isNumber(argv.min) || !_.isNumber(argv.max) || argv.min <= 0 || argv.min > argv.max) { console.log("Invalid options, please chose valid values for min and max params. \nEx: node wordlist.js --type 1 --min 1 --max 10 "); process.exit(0); } /* permutations info */ var permutation = [], MIN = argv.min, MAX = argv.max+1, last = _.last(string), len = 0; function setChar(curr,callback) { if(curr >= 0) //daca pozitia curenta in permutare exista { if(permutation[curr] != last) //si nu am generat ultima permutare pentru pozitia curenta { permutation[curr] = string[_.indexOf(string,permutation[curr])+1]; // o generam pe urmatoarea si o afisam //console.log("#1 " + len); callback(permutation); } else // in caz contrar resetam pozitia curenta, coboram o pozitie si facem incrementare daca e posibil { permutation[curr] = string[0]; setChar(curr-1, callback); } } else //daca nu ori avansam lungimea permutarii daca nu am depasit max ori WTF?! { len++; if(len < MAX) //avansam o pozitie in dimensiunea permutarilor { permutation[len-1] = string[0]; //console.log("#2 " + len); callback(permutation); } else callback(true); //am terminat de generat toate variantele } } function nextPermutation(callback) { if(len < MIN)//generam prima permutare { for(i=0;i<MIN;i++) permutation[i] = string[0]; len = MIN; //console.log("#3 " + len); callback(permutation); } else //cautam permutarea urmatoare { setChar(len-1, callback); } } function write() { nextPermutation(function(perm) { if(typeof(perm) != 'object') process.exit(0); stream.write(perm.join('') + "\n", function() { write(); }); }); } write();