Utilisateur:DavidL/tests.js

Un livre de Wikilivres.

Attention : Depuis MediaWiki 1.18 les pages se terminant avec l'extension .js ou .css sont interprétées comme des pages wiki ! En particulier les modèles (subst ou non) et les liens. Vous devez donc migrer le code source et effectuer vos changements en évitant ces éléments de syntaxe wiki (peu importe leurs emplacements dans le code source : commentaire, chaine) :

  • Double accolades ouvrantes (en particulier avec subst:) : séparer les deux accolades "{"+"{" du reste de la chaine
  • Double crochets ouvrants : même technique de séparation.
  • Signature (tildes ~ multiples) : même technique de séparation.

Note : après avoir enregistré vos préférences, vous devrez attendre que le serveur mette à jour la feuille de style globale avant de forcer le rechargement complet du cache de votre navigateur pour voir les changements.

  • Firefox / Safari : Maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ou Ctrl-R (⌘-R sur un Mac) ;
  • Google Chrome : Appuyez sur Ctrl-Maj-R (⌘-Shift-R sur un Mac) ;
  • Internet Explorer : Maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ;
  • Konqueror : Cliquez sur Actualiser ou pressez F5 ;
  • Opera : Videz le cache dans Outils → Préférences.
wgDavidL_testsJsVersion = "20120408001";
// Quelques fonctions dont je suis l'auteur en réserve :

function pgcd(a,b)
{
    for(;;)
    {
        if (a==0) return b;
        b %= a;
        if (b==1) return 1;
        if (b==0) return a;
        a %= b;
        if (a==1) return 1;
    }
}

function phi(n) // [[w:Indicatrice d'Euler]]
{
    var p = 2;
    var r = 1;
    while (p<=n)
    {
        if ((n%p)==0)
        {
            r *= p-1; n/=p;
            while ((n%p)==0)
            { r *= p; n/=p; }
        }
        p++;
    }
    return r;
}



////////////////////////////////////////////////////////////////
// Ensemble d'éléments                                        //
////////////////////////////////////////////////////////////////

function set()
{
this.arr=[];
this.add1=function(e)   { if (this.arr.indexOf(e)<0) this.arr.push(e); }
this.remove1=function(e){ var i=this.arr.indexOf(e); if (i>=0) this.arr.splice(i,1); }
this.change1=function(e){ var i=this.arr.indexOf(e); if (i<0) this.arr.push(e); else this.arr.splice(i,1); }
this.add=function()     { for(var i=0;i<arguments.length;i++) this.add1(arguments[i]); }
this.remove=function()  { for(var i=0;i<arguments.length;i++) this.remove1(arguments[i]); }
this.change=function()  { for(var i=0;i<arguments.length;i++) this.change1(arguments[i]); }
for(var i=0;i<arguments.length;i++) this.add1(arguments[i]);
this.toString=function(){ return this.arr.toString(); };
}

////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////
// Fonction de hachage MD5 basé sur l'algorithme de [[w:MD5]] //
////////////////////////////////////////////////////////////////

var md5_r = [
7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,
5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,
4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,
6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21
];

var md5_k = [];

for(var i=0;i<64;i++)
    md5_k[i] = Math.floor(Math.abs(Math.sin(i + 1)) * 0x100000000);

function leftrot(num, sh)
{ return ((num<<sh)|(num>>>(32-sh))); }

function md5(message)
{
    // Initialization
    var h0 = 0x67452301;
    var h1 = 0xEFCDAB89;
    var h2 = 0x98BADCFE;
    var h3 = 0x10325476;
    // Get message as array of bytes
    if (typeof(message)=='string') // string -> byte[]
    {
        var ar = [];
        for(var i=0;i<message.length;i++)
            ar[i] = message.charCodeAt(i);
        message = ar;
    }
    var len = message.length;
    // Padding
    message.push(0x80);
    var pl = len & 0x3F;
    pl = ((pl<56)?55:119)-pl;
    while (pl-->0) message.push(0x00);
    len <<= 3; // in bits
    for(var i=0;i<64;i+=8) { message.push(len&0xFF);len>>>=8; }
    len = message.length;
    alert("message(len="+len+",pl="+pl+") = "+message);
    // By block of 512 bits (64 bytes)
    for(var k=0;k<len;k+=64)
    {
        var w=[];
        for(var i=0,q=k;i<16;i++)
        {
            w[i] = message[q++];
            w[i] |= message[q++]<<8;
            w[i] |= message[q++]<<16;
            w[i] |= message[q++]<<24;
        }
        var a=h0, b=h1, c=h2, d=h3, f=0, g=0;
        for(var i=0;i<64;i++)
        {
            if (i<16)      { f = (b&c)|(d&(b^0xFFFFFFFF)); g = i; }
            else if (i<32) { f = (d&b)|(c&(d^0xFFFFFFFF)); g = (i*5+1)&0xF; }
            else if (i<48) { f = b^c^d; g = (i*3+5)&0xF; }
            else           { f = c^(b|(d^0xFFFFFFFF)); g = (i*7)&0xF; }
            var t=leftrot((a+f+md5_k[i]+w[g])&0xFFFFFFFF, md5_r[i]);
            a=d; d=c; c=b; b=(b+t)&0xFFFFFFFF;
        }
        h0+=a; h1+=b; h2+=c; h3+=d;
    }
    return [
        h0&0xFF,(h0>>>8)&0xFF,(h0>>>16)&0xFF,h0>>>24,
        h1&0xFF,(h1>>>8)&0xFF,(h1>>>16)&0xFF,h1>>>24,
        h2&0xFF,(h2>>>8)&0xFF,(h2>>>16)&0xFF,h2>>>24,
        h3&0xFF,(h3>>>8)&0xFF,(h3>>>16)&0xFF,h3>>>24
    ];
}

function md5str(message)
{
    var rmd5 = md5(message);
    var res = "";
    for (var i=0 ; i<16 ; i++)
        res+= (rmd5[i]<16?"0":"")+rmd5[i].toString(16);
    return res;
}

////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////
// Calcul du chemin d'une image (utilise MD5)                 //
////////////////////////////////////////////////////////////////

// image : nom de l'image
// thumbsize : (optionnel) taille en pixels
// project : (optionnel) chemin projet où se trouve l'image (commons par défaut)
//           ex: wikipedia/en

function getImagePath(image, thumbsize, project)
{
  var url = '//upload.wikimedia.org/'+(project?project:'wikipedia/commons')+'/';
  var rmd5 = md5(image);
  rmd5 = (rmd5[0]<16?"0":"")+rmd5[0].toString(16);
  var dir = rmd5.charAt(0)+'/'+rmd5;
  if (thumbsize) return url+'thumb/'+dir+'/'+image+'/'+thumbsize+'px-'+image;
  else return url+dir+'/'+image;
}

////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////
// Interpréteur de [[w:Brainfuck]]                            //
////////////////////////////////////////////////////////////////

var bf_data=[];
var bf_index=0;

function bf_reset()
{
  bf_data=[];
  bf_index=0;
}

function bf_make()
{
  if (bf_index<0)
  {
    var ar = [];
    while (bf_index<0) { ar.push(0);bf_index++; }
    bf_data=ar.concat(bf_data);
  }
  else if (bf_index>=bf_data.length)
  {
    while (bf_index>=bf_data.length) bf_data.push(0);
  }
}

function bf_get()
{
  bf_make();
  return bf_data[bf_index];
}

function bf_set(value)
{
  bf_make();
  bf_data[bf_index] = (value&0xFF);
}

var bf_input_EOF = 0;

function bf_run(prog, input, timeout)
{
  if (!timeout) timeout=1000;
  if (!input) input=[];
  var output = [];
  var ip = 0, o_in = 0;
  var target_ip = [];
  var stack = [];
  for(var i=0;i<prog.length;i++)
  {
    var c = prog.charAt(i);
    switch(c)
    {
    case '[': stack.push(i); break;
    case ']':
      if (stack.length<=0) { alert("ERROR ]");return [];}
      var n = stack.pop();
      target_ip[i] = n+1;
      target_ip[n] = i+1;
      break;
    default:  target_ip[i] = 0;
    }
  }
  if (stack.length>0) { alert("ERROR [");return [];}
  l_run:
  while (ip<prog.length)
  {
    if (--timeout<0) break;
    var c = prog.charAt(ip++);
    switch(c)
    {
    case '[': if (bf_get()==0) ip=target_ip[ip-1]; break;
    case ']': if (bf_get()!=0) ip=target_ip[ip-1]; break;
    case '+': bf_set(bf_get()+1); break;
    case '-': bf_set(bf_get()-1); break;
    case '>': bf_index++; break;
    case '<': bf_index--; break;
    case ',': if (o_in>=input.length) bf_set(bf_input_EOF); else bf_set(input[o_in++]); break;
    case '.': output.push(bf_get()); break;
    default: // ignore comment
    }
  }
  return output;
}

function bf_tostr(output)
{
  var s = "";
  for(var i=0;i<output.length;i++) s += String.fromCharCode(output[i]);
  return s;
}

function bf_runstr(prog, input, timeout)
{
  return bf_tostr(bf_run(prog,input,timeout));
}

// Hello World!
// bf_runstr('++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.')

////////////////////////////////////////////////////////////////