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. #41
    Membre émérite
    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 : 37
    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
    Points : 2 778
    Points
    2 778
    Par défaut
    Je compte 80 et 78
    Excellent en tout cas
    j'ai testé une technique avec sort, me disant qu'un tableau trié puis avec une table de correspondance, ça pourrait marcher ... mais c'était sans compter sur les doublons, puis ça faisait + de 90, donc j'ai pas trouvé mieux

  2. #42
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (function parseNumbers(s){
    return s.replace(/ ?s?(\w+)/g,function(a,b){return'zudtqciehn'.search(b[0])})
    })("un deux trois quatre cinq six sept huit neuf zero six six sept");
    77 caractères sans globales. Ca commence à devenir dur
    One Web to rule them all

  3. #43
    Membre actif
    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
    Points : 210
    Points
    210
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function parseNumbers(s){
    return s.replace(/ ?s?(.)\S*/g,function(a,b){return'zudtqciehn'.search(b)})
    })("un deux trois quatre cinq six sept huit neuf zero six six sept");
    75 caractères

  4. #44
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    75 une fois, 75 deux fois...
    Attendons encore jusqu'à demain pour en être sûr, mais pour ma part je crois qu'on a notre gagnant

    EDIT: Okay je crois qu'on ira pas plus bas, bravo TheGwy pour cet exploit. Je change l'énoncé pour passer cette fois à du dessin procédural. Les approches sont limitées, mais il y a pas mal d'optimisations à envisager :
    One Web to rule them all

  5. #45
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    Numéro 3 : une fonction qui dessine avec des caractères # et whitespace un cercle de rayon variable (r)
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    (function cercle(r){
    //votre code ici, doit retourner la String suivante:
    "                                                                                
                                #########################                           
                           ###################################                      
                       ###########################################                  
                     ###############################################                
                  #####################################################             
                #########################################################           
              #############################################################         
             ###############################################################        
           ###################################################################      
          #####################################################################     
         #######################################################################    
        #########################################################################   
       ###########################################################################  
      ############################################################################# 
      ############################################################################# 
     ###############################################################################
     ###############################################################################
     ###############################################################################
     ###############################################################################
     ###############################################################################
     ###############################################################################
     ###############################################################################
     ###############################################################################
     ###############################################################################
      ############################################################################# 
      ############################################################################# 
       ###########################################################################  
        #########################################################################   
         #######################################################################    
          #####################################################################     
           ###################################################################      
             ###############################################################        
              #############################################################         
                #########################################################           
                  #####################################################             
                     ###############################################                
                       ###########################################                  
                           ###################################                      
                                #########################                           "
    })(20);
    Il y a une tolérance sur le nombre de whitespaces ou de lignes vides en trop, l'important est que l'on retrouve un cercle plein entouré de vide, avec une bonne courbure et un bon alignement sur chaque ligne. Le cercle plein doit avoir une hauteur de 2*r et une largeur de 4*r (notez l'échelle 2 fois plus courte en largeur pour respecter l'aspect du cercle avec les polices 1:2)
    One Web to rule them all

  6. #46
    Membre actif
    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
    Points : 210
    Points
    210
    Par défaut
    Exploit, je n'irai pas jusque là, c'était quand même très itératif, je n'aurai par exemple jamais cherché spontanément à utiliser une string comme index.

    Sinon, mon compas ASCII :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function circle(r){
    for(s=r=r*2,a=[];(s-=2)>-r;)t=~~Math.sqrt(r*r-s*s),a.push(Array(r-t+1).join(' ')+Array(t*2+2).join('#'));return a.join('\r')
    }(20));
    124 caractères

  7. #47
    Membre actif
    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
    Points : 210
    Points
    210
    Par défaut
    Une autre approche avec deux boucles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function circle(r){
    for(t="",l=r=r*2;l--;){for(c=r*2;c--;)t+=(r-c)*(r-c)+(r-l*2)*(r-l*2)<r*r?'#':' ';t+='\n'}return t
    }(20));
    97 caractères


    EDIT :

    une optimisation en mettant les facteurs dans des variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function circle(r){
    for(t="",l=r=r*2;l--;){for(c=r*2;c--;)t+=(x=r-c)*x+(x=r-l*2)*x<r*r?'#':' ';t+='\n'}return t
    }(20));
    91 caractères


    EDIT 2 :

    un réorganise les expressions pour supprimer les accolades des boucles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function circle(r){
    for(t="",l=r=r*2;l--;t+='\n')for(c=r*2;c--;t+=(x=r-c)*x+(x=r-l*2)*x<r*r?'#':' ');return t
    }(20));
    89 caractères

  8. #48
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    Faut laisser jouer les autres aussi

    Perso j'étais parti sur une version à une seule boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function cercle(r){
    for(d=r*2,n=d*d,s="";n-=.5;)s+=(n%d?'':'\n')+' #'[+((x=n%d-r)*x+(y=~~(n/d)-r)*y<r*r)];return s
    })(20);
    Mais on dirait qu'on y gagne pas par rapport à deux boucles for (94 caractères)

    Un caractère d'économisé sur ta version avec l'opérateur *=:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function circle(r){
    for(t="",l=r*=2;--l;t+='\n')for(c=r*2;--c;t+=(x=r-c)*x+(y=r-l*2)*y<r*r?'#':' ');return t
    }(20));
    88 caractères
    One Web to rule them all

  9. #49
    Expert confirmé 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 : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 484
    Points : 5 277
    Points
    5 277
    Par défaut
    En incrémentants les boucle au lieu de les décrémenter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function cercle(r){
    for(t="",y=-r;y<r;t+='\n',y++)for(x=-2*r;x<2*r;x++){t+=x*x/4+y*y<r*r?'#':'_'};return t
    })(20);
    86 caractères
    "tatatatatatatatataaa !! tata taaa !! tata taaa !! tatatata tataaa !! tata taaa !! tata taaa !!"

  10. #50
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    Bien vu
    Du coup en regroupant la condition et l'incrémentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function cercle(r){
    for(t="",y=-r;++y<r;t+='\n')for(x=-2*r;++x<2*r;){t+=x*x/4+y*y<r*r?'#':'_'};return t
    })(20);
    83 caractères

    EDIT: pourquoi s'embêter à doubler l'échelle X avec la loop :p
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function cercle(r){
    for(t="",y=-r;++y<r;t+='\n')for(x=-r;++x<r;)t+=x*x+y*y<r*r?'##':'__';return t
    })(20);
    77 caractères
    One Web to rule them all

  11. #51
    Membre actif
    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
    Points : 210
    Points
    210
    Par défaut
    La version à 77 caractères est originale, mais tu perds en définition du coup.

    Sinon on peut encore retirer les accolades et tomber à 81 caractères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function cercle(r){
    for(t="",y=-r;y++<r;t+='\n')for(x=-2*r;x++<2*r;)t+=x*x/4+y*y<r*r?'#':' ';return t
    })(20);
    EDIT : en tout cas bravo Barsy !

  12. #52
    Membre émérite
    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 : 37
    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
    Points : 2 778
    Points
    2 778
    Par défaut
    Grillé
    J'étais arrivé à peu de chose au même résultat que Mc Gyver
    En 81 donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function cercle(r){
    a='';for(i=~r;i++<r;a+='\n')for(j=-r*2;j++<r*2;)a+=j*j/4<r*r-i*i?'#':' ';return a
    })(20);
    A ceci près que j'ai commencé la boucle par i=~r pour éviter le décalage dû au " (et sur des petits rayons, c'est plus sexy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    "                    
        ###########     
      ###############   
    ################### 
    ################### 
    ################### 
    ################### 
    ################### 
      ###############   
        ###########     
     
    "
    Plutôt que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    "    ###########     
      ###############   
    ################### 
    ################### 
    ################### 
    ################### 
    ################### 
      ###############   
        ###########     
     
    "
    Mais c'est chipoter je dois l'avouer

    EDIT : et ça respecte l'énoncé, j'avais même pas vu qu'il y avait une première ligne blanche
    REEDIT : Sylvain !

  13. #53
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    Oui pour l'histoire du guillemet à la première ligne, je pense qu'on peut tolérer vu que ces guillemets n'apparaissent pas lorsqu'on affiche la String à l'écran autrement que par un log.

    La solution de Kaamo semble le meilleur compromis taille/qualité du rendu. J'avoue que pour les 77 caractères, j'ai un peu triché Ca ne se voit pas trop à l'oeil nu haha

    Au fait, personne n'a essayé une autre piste que x²+y²<r² ? Coordonnées polaires, trigonométrie ?
    One Web to rule them all

  14. #54
    Expert confirmé 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 : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 484
    Points : 5 277
    Points
    5 277
    Par défaut
    C'est impossible de faire plus court en polaire, il faut ecrire "Math.cos" et "Math.sin" qui sont des méthodes gourmandes en caractères. Et il faut faire varier un nombre entre -180 et 180 ce qui est là aussi gourmand.

    Sinon, pour raccourcir, j'ai essayé de trouver une méthode qui au lieu de faire incrémenter x, ferait incrémenter x*x, mais j'ai pas trouvé.
    "tatatatatatatatataaa !! tata taaa !! tata taaa !! tatatata tataaa !! tata taaa !! tata taaa !!"

  15. #55
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    Pour incrémenter x, ça peut se faire dans le second argument de la boucle for, regarde mon code.
    One Web to rule them all

  16. #56
    Expert confirmé 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 : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 484
    Points : 5 277
    Points
    5 277
    Par défaut
    En fusionnant les deux boucles for en une seule, j'arrive à 80 caractères, ce qui est moins bien que les 77 caractères de SylvainPV :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(t="",y=x=-r;y<r;x>r?(x=-r,y++,t+='\n'):x++)t+=x*x+y*y<r*r?'##':'__';return t
    Mais je suis sur que ça peut encore être réduit.
    "tatatatatatatatataaa !! tata taaa !! tata taaa !! tatatata tataaa !! tata taaa !! tata taaa !!"

  17. #57
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    Oui mais comme l'a soulginé TheGwy, en affichant systématiquement 2 # ou 2 _, on perd un peu de qualité dans la courbure du cercle comparé à un calcul avec un pas de 1 sur l'axe des abscisses.

    Perso je n'ai plus d'idées d'améliorations possibles, à part changer carrément d'approche.
    One Web to rule them all

  18. #58
    Membre émérite
    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 : 37
    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
    Points : 2 778
    Points
    2 778
    Par défaut
    changer carrément d'approche
    C'est-à-dire ? Je pense que c'est plus long de passer par Math.cos etc (comme l'a expliqué @Barsy, surtout qu'il faut inclure l'angle comme infos supplémentaire.
    A mon avis, les solutions ci dessus semblent être les plus appropriées

  19. #59
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    Ben je n'en sais rien justement, je ne vois plus d'améliorations possibles sauf si quelqu'un a une nouvelle idée révolutionnaire. C'est ce que je voulais dire

    Du coup je vais plancher sur un nouvel énoncé. N'hésitez pas à me proposer vos idées d'énoncé par message privé car à ce rythme là, je vais vite être à court d'idées. Sachant que les énoncés intéressants sont ceux avec le plus d'approches différentes envisageables.
    One Web to rule them all

  20. #60
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    Numéro 4 : créer un compte à rebours à partir d'une date donnée
    proposé par Kaamo

    La fonction devra appeler la fonction print une fois par seconde et renvoyer un texte au format '2j 6h 32m 15s' pour désigner le temps restant avant de parvenir à la date d.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var print = function(msg){ console.log(msg); };
    (function(d,p){
    p("test"); //votre code ici
    })(new Date(2013,6,20),print);
    Notes :
    - pas besoin de gérer les zéros de tête pour les minutes, secondes et heures (2h 06m peut être écrit 2h 6m)
    - une précision de +/- 1 seconde est demandée
    - pas de comportement spécial attendu lors de l'arrivée du décompte à zéro: ça peut partir dans les négatifs ou lancer une exception, on n'en tiendra pas rigueur

    On va voir si ça tient en 140 caractères Have fun
    One Web to rule them all

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