User:Rical/mathRoman.lua

/*! 01/05/2012 14:41 calcul de valeur de nombre romain pour http://fr.wikisource.org/ */

// To translate into Lua

// voir la documentation en fin de script, exemples d'appels : // roman2int('MCXI'); // testerUnRomain('MMMMCMXCIX', 'span.vueromains', 'Erreur :'); // testerDesRomains('span.vueromains'); function roman2int(r, err) { if ( r ) { r = +r; } else { r = ; }; // anti null, to text if ( err ) { err = +err; } else { err = ; }; // anti null, to text var v=0; var v1=0; var v2=0; var v3=0; // valeurs totale, de derniere lettre, et precedentes var x='-'; var i=0; // caractere courant et son numéro var lst='-MDCLXVIJ'; // liste des chiffres romains var e0=; var e1=; var e2=; var e3=; var e4=''; // erreurs detectables while (x!='') { v3=v2; v2=v1; v1=0; x=r.substr(i,1); if ( x=='M' ) { v1=1000 }; if ( x=='D' ) { v1=500 }; if ( x=='C' ) { v1=100 }; if ( x=='L' ) { v1=50 }; if ( x=='X' ) { v1=10 }; if ( x=='V' ) { v1=5 }; if ( x=='I' ) { v1=1 }; if ( x=='J' ) { v1=1; if ( i < (r.length-1) ) {e4=' caractere J avant la fin.';} };		v+=v1; if ( (v1==5*v2) | (v1==10*v2) ) {v-=2*v2}; // pour ajuster 4, 9, 40, 90 ... if ( lst.indexOf(x) < 1 ) {e3=' caractere '+x+' en '+(i+1)+'.';}; if ( (v1>v2) & (v2>v3) ) {e2=' caracteres croissants.';}; i+=1; x=r.substr(i,1); };	if ( v == 0) {e0=' valeur nulle.';}; if ( v > 4999) {e1=' valeur > 4999.';}; if ( ( e0+e1+e2+e3+e4 >  ) && ( err >  ) ) { err = ''+v+ err +e0+e1+e2+e3+e4; // sortie avec les erreurs } else { err = ''+v; // sortie sans les erreurs };	return err; // avec ou sans erreurs } // function roman2int(r, err) function i2r(i, j) { var rm=''; if ( i == 1000 ) { rm = 'M' }; if ( i == 500 ) { rm = 'D' }; if ( i == 100 ) { rm = 'C' }; if ( i == 50 ) { rm = 'L' }; if ( i == 10 ) { rm = 'X' }; if ( i == 5 ) { rm = 'V' }; if ( i == 1 ) { rm = 'I'; if ( j == 'J' ) { rm = 'J' }; };	return rm; } // function i2r(i, j) function int2roman(i, err) { if ( i == null ) { i = 0; }; // anti null i = i.valueOf; if ( err ) { err = +err; } else { err = ; }; // anti null, to text var v100 = 100; var v500 = v100*5; var v1000 = v100*10; // cycle romain 1000, 100, 10, 1 var v=0; var v1=0; var v2=0; var v3=0; // valeurs totale, derniere, et precedentes var reste=0; var reduction=0; // reste a convertir, derniere reduction //var x='-'; var i=0; // caractere courant et son numéro //var lst='-MDCLXVIJ'; // liste des chiffres romains var rm=; var roman=; // chiffre et nombre romain resultant var e0=; var e1=; var e2=; var e3=; var e4=''; // erreurs detectables if ( i > 4999 ) { e1 = ' valeur > 4999.'; roman = 'ERREUR'; i = 0; }; 	if ( i < 1 ) { e2 = ' valeur < 1.'; roman = 'ERREUR'; i = 0; }; 	reste = i;	// return ' test '; // temporaire while (reste > 0) { v3 = v2; v2 = v1; v1 = reste; reduction = 0; if ( reste >= v1000 ) { reduction = v1000; } else if ( reste >= v100*9 ) { reduction = v100; reste = reste + v100*2; } else if ( reste >= v500 ) { reduction = v500; } else if ( reste >= v100*4 ) { reduction = v100; reste = reste + v100*2; } else if ( reste >= v100 ) { reduction = v100; } else if ( reste >= 1000 ) { v100 = 100; v1000 = 1000; reduction = v1000; };		rm = i2r(reduction); roman = roman + rm; reste = reste - reduction; if ( reste < v100 ) { if ( v100 >= 10 ) { v100 = v100/10; v500 = v100*5; v1000 = v100*10; };		};	};	//if ( v == 0) {e0=' valeur nulle.';}; //if ( v > 4999) {e1=' valeur > 4999.';}; if ( ( e0+e1+e2+e3+e4 >  ) && ( err >  ) ) { err = '' + roman + err +e0+e1+e2+e3+e4; // sortie avec les erreurs } else { err = '' + roman; // sortie sans les erreurs };	return err; // avec ou sans erreurs return roman; // + reste; } // function int2roman(in, err) function testerUnRomain(r1, vue, err) { var rm = int2roman(r1); var i = roman2int(rm); $(vue).append(' - '+r1+'='+rm+'='+i ); } function erreurUnRomain(r1, vue, err) { var rer = roman2int(r1, err); $(vue).append(' - '+r1+'='+rer ); } function testerDesRomains(vue) { var err = ' Erreur :'; testerUnRomain( 12, vue, err); testerUnRomain( 1111, vue, err); testerUnRomain( 1444, vue, err); testerUnRomain( 1555, vue, err); testerUnRomain( 1666, vue, err); testerUnRomain( 1999, vue, err); testerUnRomain( 2222, vue, err); testerUnRomain( 3333, vue, err); testerUnRomain( 4444, vue, err); testerUnRomain( 4555, vue, err); testerUnRomain( 4666, vue, err); testerUnRomain( 4777, vue, err); testerUnRomain( 4888, vue, err); testerUnRomain( 4999, vue, err); testerUnRomain( 5000, vue, err); testerUnRomain( 0, vue, err); //return; // Nombres avec erreurs erreurUnRomain('ERREURS', vue, err); erreurUnRomain('XIA', vue, err); erreurUnRomain('XIA', vue, err); erreurUnRomain('XJI', vue, err); erreurUnRomain('IXC', vue, err); erreurUnRomain('VLD', vue, err); erreurUnRomain('MMMMM', vue, err); erreurUnRomain('MMMMMYJXC', vue, err); erreurUnRomain('MMMMMYJXC', vue, err); } /* 22/04/2012 15:35 Le script ci-dessus donne le resultat suivant : [ bouton Calculs de romains ] Nombres romains : XIJ=12 MCXI=1111 MCDXLIV=1444 MDCLXVI=1666 MCMXCIX=1999 MMCCXXII=2222 MMMMCMXCIX=4999 ERREURS=0 erreur caractere S en 7. XIA=11 erreur caractere A en 3. XJI=12 erreur caractere J avant la fin. IXC=89 erreur caracteres croissants. VLD=445 erreur caracteres croissants. MMMMM=5000 erreur > 4999. MMMMMYJXC=5089 erreur > 4999. erreur caractere Y en 6. erreur caractere J avant la fin. Le test consiste à placer les fichiers calculromain.html, calculromain.js et jquery.js dans un même dossier. Puis à lancer calculromain.html et à cliquer sur le bouton [ Calculs de romains ] Le fichier calculromain.html contient exactement : <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

  valeurDeRomain    Calculs de romains  raz Nombres romains :