IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[Ludique] Défis code en un tweet


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut [Ludique] Défis code en un tweet
    Salut les codeurs,

    Pour changer un peu des ordinaires questions/réponses aux débutants, je propose aux ninjavascript un petit challenge ludique: celui d'écrire une fonction avec un code suffisamment court pour rentrer dans un tweet, c'est à dire <= 140 caractères. Ce petit défi est inspiré de ce site : http://www.140byt.es/ ; vous pouvez vous en inspirer pour trouver des pistes pour réduire la taille de votre code. Une fois n'est pas coutume, ce défi n'a pas d'intérêt pratique si ce n'est vous apprendre à manier les notations alambiquées et assemblages subtils du Javascript minifié. Et puis, pour le fun

    Je vous donnerais régulièrement de nouveaux objectifs à réaliser par cette fonction, dès lors que plus personne n'aura trouvé le moyen de réduire le code de la précédente. Je suis aussi ouvert à toute suggestion de fonction à réaliser par message privé, si quelqu'un a une bonne idée.

    En voici les règles :
    • le code sera inséré et testé sous cette forme:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      (function maFonction(){
      // votre code ici
      })()
      Seule la partie interne est comptée pour la limite des 140 caractères. Votre code devra comprendre une instruction return pour renvoyer le résultat désiré de la fonction
    • aucune librairie externe n'est permise (de toute façon elle ne rentrerait pas en 140 caractères)
    • la fonction doit renvoyer le résultat escompté avec les dernières versions des navigateurs Firefox et Chrome. Je vous fais grâce de IE
    • le code doit être suffisamment performant pour renvoyer le résultat en moins de cinq secondes sur un ordinateur de moyenne gamme
    • il n'y a aucune exigence particulière en matières de bonnes pratiques d'écriture de code : variables globales, conditions ternaires, opérateurs logiques à tout va... vous pouvez vous lâcher !

    Comme premier défi, je vous propose d'écrire une fonction qui renverra le prochain vendredi 13 du mois à arriver. Incontournable pour les superstitieux, vous pourrez l'exposer sur votre site Internet à côté de votre compteur d'apocalypse maya qui vend beaucoup moins de rêve depuis son passage dans les négatifs. Je vous laisse la liberté du format du résultat de la fonction, du moment que l'on dispose des deux informations essentielles : le mois et l'année du prochain jour fatidique.

    N'hésitez pas à poster vos propositions même au delà de 140 caractères, ou à challenger les propositions des autres. Bonne chasse aux caractères

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 209
    Par défaut
    Bonjour,
    après avoir cherché à augmenter la taille des JS tu veux la réduire

    Je ne saisie pas pourquoi cette forme de déclaration pour la fonction de test.

    Voici ma proposition, le code de la fonction fait 109 caractères, donc dans les clous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function getNextVendredi13(){
    d=new Date();d.setDate(13);m=d.getMonth();while(d.getDay()!=5){d.setMonth(++m);}return{m:m,y:d.getFullYear()}
    }
    Je ne sais pas si cela répond au cahier des charge, toujours est-il que la fonction retourne un objet avec m pour le mois, au format Date soit le mois -1, et y pour l'année.

  3. #3
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonsoir,
    En reprennant le "format" de NoSmoking, de mon côté j'avais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function getNextVendredi13(){
    f=new Date();m=f.getMonth();y=f.getFullYear();do{t=new Date(y,m,13);if(t.getDay()==5){f=null;return t}if(m==11){m=0;y+=1}else m+=1}while(f)
    };
    139 chars, si je compte bien.
    Décidemment, je suis trop "bavard".
    J'avais un petit peu plus court et fainéant sur le départ, mais ca supposait de considérer qu'on partait de manière "statique" de Juillet 2013 au lieu de "sysdate".
    J'ai pas osé, bien que cela n'était pas spécifié.

    @+

  4. #4
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    @NoSmoking: c'est la même forme de déclaration que toi, c'est juste qu'elle est auto-exécutée. De cette manière c'est plus pratique pour tester et ça me laisse la possibilité de passer des arguments en entrée si j'en ai besoin sur d'autres problèmes. Bien joué pour ta solution, 109 caractères c'est pas mal du tout. Mais on peut descendre bien plus bas Un indice: naviguer entre valeurs UTC est plus simple que naviguer entre les mois.

    @Sunchaser: Non, on ne part d'aucun argument en entrée, il faut donc récupérer la date d'aujourd'hui via le constructeur Date comme tu l'as fait. Quelques petits conseils pour réduire ton code :
    - l'opérateur ++ est plus court que d'écrire +=1
    - la double do..while peut être écrite de manière plus courte en un simple while
    - les conditions if..else peuvent être écrire de manière plus courte via des conditions ternaires ? : ou des opérateurs logiques || && ou binaires.
    - f=new Date; suffit pour récupérer la date d'aujourd'hui

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 209
    Par défaut
    celui d'écrire une fonction avec un code suffisamment court pour rentrer dans un tweet, c'est à dire <= 140 caractères
    j'ai même un ; en trop, je ramène donc à 108 caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function getNextVendredi13(){
    d=new Date();d.setDate(13);m=d.getMonth();while(d.getDay()!=5){d.setMonth(++m)}return{m:m,y:d.getFullYear()}
    }
    ...dès lors que plus personne n'aura trouvé le moyen de réduire le code de la précédente
    je ne veux pas tuer le défi trop vite

  6. #6
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    D'ailleurs j'aurais accepté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function getNextVendredi13(){
    d=new Date();d.setDate(13);m=d.getMonth();while(d.getDay()!=5){d.setMonth(++m)}return d
    })()
    puisqu'on a toutes les infos attendues en sortie.
    Ce qui porte à 87 caractères ! Pas mal, pas mal ! Pour ma part, voici le plus court que j'ai trouvé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function getNextVendredi13(){
    for(d=new Date;(d=new Date(+d+8e7)).getDay()*d.getDate()!=65;);return d
    })()
    8e7 est en notation exponentielle un intervalle en millisecondes juste en dessous des 24 heures. Je teste le produit 13*5=65 car par chance il s'agit d'une décomposition en facteurs premiers, et comme il n'y a pas 13 jours dans la semaine le cas est unique. Cela nous donne 71 caractères. Qui dit mieux ?

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 128
    Par défaut
    J'adore le code golf !

    79 caractères, en repartant de la version de NoSmoking :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function getNextVendredi13(){
    for(d=new Date,d.setDate(13);d.getDay()!=5;d.setMonth(d.getMonth()+1));return d
    }
    EDIT : SylvainPV m'a tuer

Discussions similaires

  1. Défi : Toutes les semaines un peu de code pour aller plus loin avec Windows 7
    Par Jérôme Lambert dans le forum Développement Windows
    Réponses: 41
    Dernier message: 05/01/2012, 12h00
  2. [Ludique] Mini-jeu : épisode 3 (déchiffrage de code, niveau : facile)
    Par RomainVALERI dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 03/11/2010, 00h45
  3. [Ludique] Mini-jeu - niveau 2 : déchiffrage de code (niveau modéré)
    Par RomainVALERI dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 28/07/2010, 23h15
  4. [Ludique] Mini-jeu : déchiffrage de code (niveau facile)
    Par RomainVALERI dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 13/07/2010, 18h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo