11488 sujets

JavaScript, DOM et API Web HTML5

Pages :
Yeah Smiley smile

Allez, une nouvelle énigme. Et pas oublier de bien préciser quelle version on a droit. Et si on pourrait se limiter à l'ecma-262, ce serait pas mal, histoire de bricoler sur un langage *utilisable dans la vie réelle* Smiley smile
Normalement ce serait au gagnant d'en proposer une autre...
Mais bon puisque personne ne réagit, je propose les miennes :

1 - Facile : Écrire une fonction qui soit le plus court/efficace et qui convertit 3 nombres R, V, B en code couleur #xxxxxx
2 - Facile : Éccrire une fonction qui soit le plus court/efficace qui met le nom des balises en minuscules.
3 - Moyen : même que 2 mais interdiction d'utiliser les regex.
4 - Difficile : En une seule instruction (ligne) sans point-virgule, extraire les paramètres GET de l'URL et les stocker dans des variables globales.
Modifié par QuentinC (24 Oct 2007 - 10:25)
Allez je tente la numero 1 Smiley murf

function codeCouleur(R, V, B) {
  return sprintf('#%x%x%x', R, V, B);
}



Edit: Zut en fait ça existe pas en javascript sprintf() Smiley sweatdrop Smiley rolleyes
Modifié par Necromantik (24 Oct 2007 - 11:15)
Sprintf existerait, tu aurais gagné.
Dommage...

Ceci dit c'est faisable en une seule ligne.
Modifié par QuentinC (24 Oct 2007 - 11:22)
Bonjour,


function codeCouleur( r, v, b )
{ 
   return '#'  + r.toString(16) + v.toString(16) + b.toString(16);
}


J'ai bon ?
QuentinC a écrit :
Normalement ce serait au gagnant d'en proposer une autre...
Mais bon puisque personne ne réagit, je propose les miennes :

1 - Facile : Écrire une fonction qui soit le plus court/efficace et qui convertit 3 nombres R, V, B en code couleur #xxxxxx
2 - Facile : Éccrire une fonction qui soit le plus court/efficace qui met le nom des balises en minuscules.
3 - Moyen : même que 2 mais interdiction d'utiliser les regex.
4 - Difficile : En une seule instruction (ligne) sans point-virgule, extraire les paramètres GET de l'URL et les stocker dans des variables globales.

Je prend dans l'ordre, n'hésitez pas à en proposer, surtout toi aussi Julien Smiley lol

(Je peux jouer? Smiley biggol )
La mienne, variation sur celle de Lanza :
function hex(r, g, b) {
    return '#' + (r << 16 | g << 8 | b).toString(16);
}
Shinuza a écrit :
Je prend dans l'ordre, n'hésitez pas à en proposer, surtout toi aussi Julien Smiley lol

J'ai peur de ne pas être très bon pour imaginer des questions intéressantes. Smiley smile
En réponse à la 4e, j'ai pondu un truc assez affreux


document.location.href.substr(document.location.href.lastIndexOf("?")+1).split("&").forEach(function(def) { eval(def.split("=")[0]+" = '"+def.split("=")[1]+"'") });

Modifié par Tymlis (24 Oct 2007 - 20:28)

return '#'  + r.toString(16) + v.toString(16) + b.toString(16); 

    return '#' + (r << 16 | g << 8 | b).toString(16); 

Presque! Il manque un petit détail, autant chez l'un que chez l'autre... réussi à 97%
QuentinC a écrit :
4 - Difficile : En une seule instruction (ligne) sans point-virgule, extraire les paramètres GET de l'URL et les stocker dans des variables globales.

Qu'est ce que t'entends par stocker dans des variables globales?
J'aurais plus prescrit d'en faire une hashmap de clés/valeurs, ce qui me parait plus propre Smiley confus
Sinon, j'aurais fais ça :

for(let [key,value] in [i.split("=") for each(i in window.location.search.substring(1).split('&'))]) {
  window[value[0]]=value[1]
}


Avec une préference pour un variable hors du scope globale Smiley langue
Modifié par Shinuza (25 Oct 2007 - 02:00)
a écrit :

Qu'est ce que t'entends par stocker dans des variables globales?

Ben... window['mavar'] == mavar... enfin je ne vois pas comment définir global

a écrit :
J'aurais plus prescrit d'en faire une hashmap de clés/valeurs, ce qui me parait plus propre

Plus propre effectivement... tu peux tenter le coup si tu veux, mais là je n'ai aucune idée de comment faire.
QuentinC a écrit :
Presque! Il manque un petit détail, autant chez l'un que
chez l'autre... réussi à 97%

Argh oui, y'a un bug Smiley bawling
ou comme ça?



for(p in s=this.location.search.substring(1).split("&")){this[s[p].split("=")[0]]=s[p].split("=")[1]};


pour la 2 ou 3 (de toute façon avec les regex j'ai jamais réussi à faire la difference entre un noeud text et une balise) pour un petit éditeur wysiwyg j'avais codé cette fonction bizarre (qui m'a jamais servie, heureusement...) :

function tagLowerCase(node) {

   var children = node.childNodes;
   var child_length = children.length;

      for (I=0;I<child_length;I++) {

         var child = children[I];
         switch (child.nodeType) {

            case 1: {
               var tag_name = String(child.tagName).toLowerCase();
               text += '\n<'+tag_name;
					          
               if (child.canHaveChildren || child.hasChildNodes()){
                  text += '>';
                  text += get_xhtml(child);
                  text += '</'+tag_name+'>\n';
               }else{
                  text += ' />';
               }
               break;
            }

            case 3: {
               text += child.nodeValue;
               break;
            }
	default:
        break;

        }
   }
return text;
}


moins élegant c'est dur, mais que ce soit classé "facile" c'est déprimant...
Modifié par matmat (30 Oct 2007 - 17:46)
bonsoir ,

Les vacances çà a du bon : on a le temps de 'plncher' sur vos énigmes ... Smiley langue

Concernant la question 3 je verrais bien un petit récursif :

function Lower(n){

 [#indigo]//si de type element[/#]
if(n.nodeType == 1) 

  {
    
    [#indigo]// mise en minuscule[/#]
    n.nodeName.toLowerCase();
    
    var enfant = n.childNodes;
    [#indigo]//on parcout la node liste[/#]
    for(var j = 0; j < enfant.length; j++) {
   [#indigo] // on relance la fonction pour chaque enfant ...[/#]
       Lower(enfant[j]);
       
    }
  }
    
}


... ???
Modifié par kzone (31 Oct 2007 - 02:10)
Pages :