Skip navigation

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 :(.

Anunțuri

3 Comments

  1. Sal,

    Acest algoritm este bun/adevarat? Am citit si pe softpedia despre acest calcul, dar vreau sa stiu daca e 100% sigur. Nu de alta, dar e pt un mag virtual. si nu vreau sa ma trezesc ca invalidez un CNP valid. lol. Astept si eu un raspuns (aici sau pe mail)
    Ms.
    O seara buna

  2. am căutat acu, şi am dat de
    http://www.validari.ro/cnp.html, care povesteşte mai în detaliu (compoziţia numarului, valori posibile pt prima cifra (habar n-aveam ca is atatea :)), etc.); se pare că e corect ce am scris aci 😀

  3. buna … codul tau are un mic bug
    daca introduci un cnp de genul 2222222222225 el il valideaza ca cnp valid … ceea ce este incorect


Lasă un răspuns

Completează mai jos detaliile tale sau dă clic pe un icon pentru a te autentifica:

Logo WordPress.com

Comentezi folosind contul tău WordPress.com. Dezautentificare / Schimbă )

Poză Twitter

Comentezi folosind contul tău Twitter. Dezautentificare / Schimbă )

Fotografie Facebook

Comentezi folosind contul tău Facebook. Dezautentificare / Schimbă )

Fotografie Google+

Comentezi folosind contul tău Google+. Dezautentificare / Schimbă )

Conectare la %s

%d blogeri au apreciat asta: