Nuş cum am ajuns să dau de o implementare a algoritmului de verificare a CNP-urilor postată de cineva pe softpedia (ocazie cu care am descoperit că nu mai recunosc o sursă de foxpro - eh, amintiri din tinereţe), şi am muncit 10 minute să fac o implementare în javascript; ete-o:
function map(fn, arr){
var ret = [];
for(var x = 0; x < arr.length; x++)
ret.push(fn(arr[x]));
return ret;
}
function reduce(fn, arr, initial){
function iter(idx, ret){
if(idx >= arr.length)
return ret;
else
return iter(idx+1, fn(arr[idx], ret));
}
return iter(initial ? 0 : 1, initial || arr[0]);
}
function sum(arr) { return reduce(function(x, y){ return x + y;}, arr, 0); }
function ccnp(cnp){
if(cnp.length != 13)
return false;
cnp = map(parseInt, cnp.split(''));
var coefs = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9];
var idx = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
var s = map(function(x){return coefs[x] * cnp[x];}, idx);
s = sum(s) % 11;
return (s < 10 && s == cnp[12]) || (s == 10 && cnp[12] == 1);
}
Scris în javascript 1.7 (suportat de Firefox), map era mult mai simplu de scris ca [fn(arr[x]) for(x in arr)], dar să păstrăm lucrurile portabile…
pentru cine se întreabă:
map aplică o funcţie elementelor unui array şi returnează un array cu rezultatele
reduce combină elementele unui array cu o funcţie dată şi returnează o valoare; după ce am scris-o the functional way mi-am amintit că există for, deci se putea scrie şi aşa:
function reduce(fn, arr, initial) {
ret = initial;
for(var i = 0; i < arr.length; i++) { ret = fn(arr[i], ret); }
return ret;
}
(varianta cu for şi side-effects e probabil mai rapidă, but nowhere as fun :D).
On an unrelated note: extrem de enervant editorul de la wordpress, când ai de pus snippet-uri de cod; evident, cine l-a scris a considerat că scriptul lui ştie html mai bine ca mine, prin urmare modifică şi când scriu raw HTML :(.