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 :

[Défi] Trouvez les axes d'une map, en n'utilisant qu'un seul mot et une seule variable


Sujet :

JavaScript

  1. #1
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 741
    Points : 808
    Points
    808
    Par défaut [Défi] Trouvez les axes d'une map, en n'utilisant qu'un seul mot et une seule variable
    Bonjour à tous,

    Partant de mon idée de faire un jeu du genre de Puissance 4, j'ai voulu corser un peu les choses, pour voir la faisabilité et ajouter un peu de challenge.

    J'ai réussi à matcher pas mal de contraintes et, avant de vous le partager, j'me suis dit que ça pouvait être un challenge fun, pour les plus balèzes en JS d'entre vous.

    Voici les contraintes :
    • à partir d'un array de 7 entrées, créer une représentation de tous les jetons possibles, pour une map carrée de 7 cases de côté
    • un seul mot autorisé + une seule variable sont permis, autant de fois que vous voulez
    • pas de fonctions imbriquées
    • les seules fonctions autorisées sont des arrow-functions
    • pas de for/while
    • pas de globales
    • toutes les références à un même jeton, dans le résultat, doivent être le même objet
    • c'est un golf-code, chaque caractère est précieux !
    • ce code doit retourner un array contenant :
      1. un array des 7 lignes horizontales (7 jetons par ligne)
      2. un array des 7 lignes verticales (7 jetons par ligne)
      3. un array des 7 lignes diagonales, d'en haut à gauche, à en bas à droite (au moins 4 jetons par ligne)
      4. un array des 7 lignes diagonales, d'en haut à droite, à en bas à gauche (au moins 4 jetons par ligne)


    La solution est déjà hébergée sur Gist, je ne cherche donc pas une solution à quelque chose que je ne sais résoudre

  2. #2
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 142
    Points
    11 142
    Par défaut
    Bonsoir,

    une question :
    à partir d'un array de 7 entrées, créer une représentation de tous les jetons possibles,
    tu veux toutes les solutions de 4 jetons de la même couleur ? Ou toutes les positions possibles d'un même jeton ? Sachant qu'un joueur aura 25 jetons et l'autre 24.
    Je sèche sur la 1ère phrase ça commence bien

  3. #3
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 741
    Points : 808
    Points
    808
    Par défaut
    En gros, un jeton potentiel est un objet unique, devant être référencé dans :
    • une des lignes de l'array des horizontales
    • une des lignes de l'array des verticales
    • dans une des lignes de array des diagonales partant de la gauche, si cette diagonale contient au moins 4 jetons potentiels
    • dans une des lignes de array des diagonales partant de la droite, si cette diagonale contient au moins 4 jetons potentiels


    Le but n'est pas de déduire la victoire, en direct, mais bien de prémâcher le boulot de déduction de victoire, pour réduire, au maximum, le nombre d'opérations à faire lors de l'insertion d'un jeton, aux coordonnées du jeton potentiel.

  4. #4
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 741
    Points : 808
    Points
    808
    Par défaut
    Bon, ben, voici ma solution :

    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
    17
     
    [...[,,,,,,,]]
    .reduce((...a) => [...a[0], ...a[3]], [])
    .reduce((...a) => (
      a[3][a[2]] = [a[2] % 7, a[2] / 7 ^ 0],
      a[0][5](a[0][0], a[3][a[2]][1], a[3][a[2]]),
      a[0][5](a[0][1], a[3][a[2]][0], a[3][a[2]]),
      a[3][a[2]][0] < a[3][a[2]][1]
        ? a[2] % 8 > 4 && a[0][5](a[0][2], a[2] % 8 - 1, a[3][a[2]])
        : a[2] % 8 < 4 && a[0][5](a[0][2], a[2] % 8, a[3][a[2]]),
      a[2] % 6 === a[0][4](a[3][a[2]]) % 6 && a[0][4](a[3][a[2]]) > 2
        && (a[0][4](a[3][a[2]]) < 7 && a[0][5](a[0][3], (a[2] + 3) % 6, a[3][a[2]]))
        || a[0][4](a[3][a[2]]) < 10 && a[0][5](a[0][3], a[0][4](a[3][a[2]]) - 3, a[3][a[2]]),
      [a[0][0], a[0][1], a[0][2], a[0][3], a[0][4], a[0][5]]
    ), [[], [], [], [], a => a[0] + a[1], (...a) => (
      a[0][a[1]] = [...a[0][a[1]] || [], a[2]]
    )])

  5. #5
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 467
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 467
    Points : 4 656
    Points
    4 656
    Par défaut
    question a 10 balles, c'est juste pour le fun, ou c'est la solution la plus performante ?

  6. #6
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 741
    Points : 808
    Points
    808
    Par défaut
    Hum, évidemment, l'aspect golf-code ne sert à rien hormis à réduire sa taille, en revanche, dans mon code réel, j'ai nommé les arguments de mes fonctions mais, oui, cet algo a une utilité en performances, pour savoir comment se comporte toute la map, à l'insertion d'un jeton et à la détection d'une potentielle victoire ou forfait.

    Le code contient tout de même une petite astuce bien pratique, lorsqu'on veut éviter de nommer des paramètres inutiles : le destructuring du rest parameters.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [1, 2, 3].forEach((...[, key]) => console.log(key))

  7. #7
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 142
    Points
    11 142

  8. #8
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 741
    Points : 808
    Points
    808
    Par défaut
    Ben, c'est dans le même esprit ^^

  9. #9
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 142
    Points
    11 142
    Par défaut
    Je n'aurais jamais su trouver la solution, j'ai décroché de Javascript depuis trop longtemps. A l'époque les fonctions anonymes n'existaient pas encore

Discussions similaires

  1. [Toutes versions] Identifier et exploiter les coordonnées d'une cellule variable
    Par Dev_noob dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 29/07/2019, 11h04
  2. mettre les flèches sur les axes d'une figure
    Par Mac52 dans le forum MATLAB
    Réponses: 3
    Dernier message: 03/03/2015, 16h51
  3. Réponses: 2
    Dernier message: 22/01/2013, 18h31
  4. Permuter les axes d'une cartographie (imagesc)
    Par black cat747 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 12/05/2010, 17h29
  5. Comparer les clés d'une Map
    Par Tourix dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 27/10/2006, 12h43

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