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

  1. #81
    Membre Expert Avatar de Barsy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 484
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function pgcd()
    {
    for(a=arguments,r=a[i=0];n=a[i++];)while(b=n%r)r=b;return r
    }
    59 caractères

  2. #82
    Membre Expert
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Par défaut
    Outch, la barre est haute ! Joli

    97 pour moi, pas mieux donc. J'ai tenté par la récursivité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function pgcd(){
    x=function(a,b){return!b?a:x(b,a%b)};return[].reduce.call(arguments,function(a,b){return x(a,b)})
    }
    console.log( pgcd(27,36) === 9 );
    console.log( pgcd(128,8,32) === 8 );
    console.log( pgcd(7,14,7,35,707) === 7 );
    console.log( pgcd(13,17) === 1 );
    console.log( pgcd(7,7) === 7 );
    ps : tu peux même virer le dernier ; pour faire 60

  3. #83
    Membre Expert Avatar de Barsy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 484
    Par défaut
    c'est fait, je tombe donc à 60. J'essaie encore d'enlever ce que je peux. J'édite mon post au fur et à mesure que j'y arrive.

  4. #84
    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 : 55
    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
    Bravo

    Citation Envoyé par Barsy Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function pgcd()
    {
    for(a=arguments,r=a[i=0];n=a[i++];)while(b=n%r)r=b;return r
    }
    59 caractères
    Et dire que j'étais content d'avoir trouvé une solution égale a celle d'Auteur ...
    Tu m'as déprimé la

  5. #85
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 643
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 643
    Par défaut
    Citation Envoyé par Sunchaser Voir le message
    Et dire que j'étais content d'avoir trouvé une solution égale a celle d'Auteur ...
    Tu m'as déprimé la
    on devrait l'interdire de jouer, il gagne tout le temps
    mais je me console en me disant que j'étais le premier à répondre

  6. #86
    Membre Expert Avatar de Barsy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 484
    Par défaut
    C'est pas vrai, à l'exercice précédent, je me suis fait exploser par Kaamo alors que j'étais persuadé qu'il était impossible de mieux faire.

    Ici, je pensais qu'il était possible de réduire encore le code en écrivant quelque chose dans le genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(a=arguments,(b=n%r)||(r=a[i=0]);n=a[i++];)r=b
    Mais il semblerait qu'en Javascript, tous les éléments d'un OU sont joués même si le premier retourne vrai. Ce n'est pas le cas dans d'autre langages.

  7. #87
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 643
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 643
    Par défaut
    il y a quand même un truc qui me chagrine dans ton code : tu ne vérifies pas si a<b avant de faire la division

  8. #88
    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
    Citation Envoyé par Barsy Voir le message
    C'est pas vrai, à l'exercice précédent, je me suis fait exploser par Kaamo alors que j'étais persuadé qu'il était impossible de mieux faire.

    Ici, je pensais qu'il était possible de réduire encore le code en écrivant quelque chose dans le genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(a=arguments,(b=n%r)||(r=a[i=0]);n=a[i++];)r=b
    Mais il semblerait qu'en Javascript, tous les éléments d'un OU sont joués même si le premier retourne vrai. Ce n'est pas le cas dans d'autre langages.
    Non ce n'est pas le cas, il doit y avoir un soucis dans ton expression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function first(){
     
        console.log('first called');
        return true;
    }
    function second(){
     
        console.log('second called');
        return true;
    }
     
    (function(){
     
        first()||second();
    })();

  9. #89
    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
    Haha il est fort, très fort ce Barsy (normal pour un Sylvain)

  10. #90
    Membre Expert Avatar de Barsy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 484
    Par défaut
    Ben en fait, pas si fort que ça. Auteur vient de mettre le doigt sur un problème. Si on fait pgcd(27,36), ça passe, mais pgcd(36,27) ça retourne 27.

    Je vais corriger ça

  11. #91
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 261
    Par défaut
    95 avec la fonction d'Auteur simplifiée simplement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function pgcd(){
    for(x=arguments,i=x.length-1;i;i--){r=a=x[i];b=x[i-1];for(;r;){a=b;b=r;r=a%b}x[i-1]=b}return b;
    }
    les modifs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function pgcd(){
      for(x=arguments, i=x.length-1;i;i--){
        r=a=x[i];
        b=x[i-1];
    //    while(r!=0){
        for(;r;){
    //      if(r!=0){
            a=b;
            b=r;
    //      }
          r=a%b
        }
        x[i-1]=b
      }
      return b;
    }
    Je doute que cela tienne face au 59 de Barsy plus la modif

  12. #92
    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
    Si ça peut donner des idées à certains :

    PGCD des nombres 96 et 36
    96-36=60
    60-36=24
    36-24=12
    24-12=12
    12-12=0
    PGCD(96;36)=12


  13. #93
    Membre Expert Avatar de Barsy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 484
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function pgcd()
    {
    for(a=[].sort.call(arguments),r=a[i=0];n=a[i++];)while(b=n%r)r=b;return r
    }
    La correction me ramène à 73 caractères

    EDIT : Et ça ne marche pas avec 96 et 36... et crotte

  14. #94
    Membre Expert Avatar de Barsy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 484
    Par défaut
    Cette fois, c'est la bonne, enfin j'espère... j'ai essayé avec beaucoup de nombres différents et je n'ai pas eu d'erreurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function pgcd()
    {
    for(a=arguments,r=a[i=0];n=a[++i];)while(b=n%r){n=r;r=b};return r
    }
    Ce qui me ramène au final à 65 caractères.

  15. #95
    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
    J'ai essayé avec la méthode des soustractions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function pgcd(){
    for(a=arguments,n=a[i=0];m=a[++i];){do{if(m<n){t=n;n=m;m=t}m-=n}while(m>0)}return n
    }
    83 caractères. Mais ça marche pour tous les cas

    Sinon 2 caractères économisés sur le code de Barsy:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function pgcd(){
    for(a=arguments,r=a[i=0];n=a[++i];)while(b=n%r)n=r,r=b;return r
    }
    63 caractères

    La méthode de la division euclidienne est plus courte car le tri croissant est réalisé par la même boucle.

  16. #96
    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
    Bon je crois qu'on ira pas plus bas pour ce problème-ci

    Numéro 6 : convertir un nombre quelconque entre 1 et 3999 en chiffres romains
    proposé par Barsy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function romain(n){
          //votre code ici
    }
    console.assert( romain(12) === "XII" );
    console.assert( romain(49) === "XLIX" );
    console.assert( romain(74) === "LXXIV" );
    console.assert( romain(383) === "CCCLXXXIII");
    Les unités à intégrer sont :
    I 1
    V 5
    X 10
    L 50
    C 100
    D 500
    M 1 000

    Celui-là n'est pas facile, bon courage

  17. #97
    Membre Expert
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Par défaut
    Outch, ça m'a l'air chaud

    Une question, après avoir lu quelques articles ici ou là :
    - On ne peut aller que jusqu'à 3999. En effet, 4000 === MMMM. Or, quatre caractères identiques est une exception et ça fait un paramètre de plus à gérer. ça risque de faire un peu trop

    5000 c'est V surmonté d'un trait horizontal, mais 4999 === MMMMCMXCIX.

    Faut il gérer cette histoire de quatre "M" donc ?

  18. #98
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    A la Bovino

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var print=function(msg){console.log(msg)};
    (function rtoa(A,R,n,p){ // pour n entre 1 et 3999
    s="",L=A.length;for(i=0;++i<L;){while(n>=A[i]){n-=A[i];s+=R[i];}if(n==0)p(s)}
    })([1000,900,500,400,100,90,50,40,10,9,5,4,1],["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"],383,print);

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  19. #99
    Membre Expert
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Par défaut

    Basé sur le même raisonnement que Daniel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function romain(n){
    a={M:1e3,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1},r='';for(x in a)for(i=a[x];n>=i;n-=i)r+=x;return r
    }
    console.log( romain(12) + ' / ' + (romain(12) === "XII") );
    console.log( romain(49) + ' / ' + (romain(49) === "XLIX") );
    console.log( romain(74) + ' / ' + (romain(74) === "LXXIV") );
    console.log( romain(383) + ' / ' + (romain(383) === "CCCLXXXIII"));
    console.log( romain(1000) + ' / ' + (romain(1000) === "M"));
    console.log( romain(3888) + ' / ' + (romain(3888) === "MMMDCCCLXXXVIII")); // le plus long possible !
    En 126 caractères donc. Mais à mon avis, y'a plus court, la table de correspondance doit pouvoir se simplifier ... mais avant, j'ai besoin de manger

    ça ne marche pas pour "0" et pour les nombres plus grands que 4000, les "M" s'affichent par quatre. Pour 5000, par 5 etc, je ne crois pas que ça soit bon

    ps : n'essayez pas 1'000'000

    EDIT : une mini amélioration pour gagner 1 caractère
    125 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function romain(n){
    a={M:100,CM:90,D:50,CD:40,C:10,XC:9,L:5,XL:4,X:1,IX:.9,V:.5,IV:.4,I:.1},r='';for(x in a)for(i=a[x]*10;n>=i;n-=i)r+=x;return r
    }

  20. #100
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 643
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 643
    Par défaut
    Citation Envoyé par Kaamo Voir le message
    ça ne marche pas pour "0"
    ça c'est normal, le 0 n'existe pas en chiffre romain.

    Citation Envoyé par danielhagnoul
    A la Bovino
    Je ne connais pas cette technique tu peux m'en dire plus ?

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: 44
    Dernier message: 17/10/2025, 16h54
  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