Un nombre est-il premier ? en une ligne

Un collègue m’a soumis le code suivant :


<script type="text/javascript">
function prime (i){return /^(?!(11+)\1+$)/.test (Array.apply(null, new Array(i)).map(Number.prototype.valueOf,1).toString().replace (/,/g, ""));}
</script>

C’est très intelligent mais très obfuscant.
Imaginez que votre nombre n devienne 11..1 (n fois). (code réalisé par l’expression Array.apply(null, new Array(i)).map(Number.prototype.valueOf,1).toString().replace (/,/g, «  »));)
Le principe de la regex est de s’assurer que la chaîne passée en paramètre n’est pas précédée d’un 1 lors de son recoupage. L’algo de test de la regex va d’abord s’assurer que 11..1 n-1 fois ne soit pas capturé par le groupe \1 (vraisemblablement il y a peu de chance que ce soit le cas), sinon il va recouper avec n – 2, et ainsi de suite jusqu’à 2.

S’il y arrive, c’est que n est divisible par le nombre utilisé pour la recoupe. Si aucune recoupe n’a marché, l’expression régulière sera valide et en fait sa condition est nécessaire et suffisante pour prouver que n est premier.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*