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] Coder en Javascript avec seulement 3 caractères


Sujet :

JavaScript

  1. #21
    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, je passe bien par là pour faire un eval, mais c'est derrière le compile(code) que j'ai ajouté une (grosse) optimisation. Regarde la différence de taille entre alert("Hello World") compilé par rapport à alert("test"), c'est très minime par rapport aux autres façons de récupérer les lettres "H", "W" etc...

    Je ne lâche pas la solution tout de suite, il faut que je corrige ce problème de virgules ; et je vais peut-être rédiger un article pour tout expliquer depuis le début.

  2. #22
    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 : 38
    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
    Malin !! Si j'ai bien capté, tu récupères l'Unicode de chaque caractère saisi, tu le passes à la moulinette pour récupérer le nombre (traduit en String) en ([]!+). Mais du coup .. tu passes par là pour chaque caractère plutôt que de checker avant s'il se trouve parmi les caractères "simples" à traduire ?

  3. #23
    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
    Okay j'ai résolu mon problème de virgules, ça venait de ["to"+(("")["constructor"]+[]).slice(9,15)] ; je n'ai pas pensé à convertir la virgule entre les deux arguments de slice ; du coup j'ai remplacé par [""]["constructor"]["name"]. Plus long mais tant pis !

    Donc maintenant, le code de l'encodeur !
    Préchauffez vos neurones et réapprovisionnez-vous en café

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    app.encode = function(input){
            var charcodes = [];
            for(var c=0; c<input.length; c++){
                charcodes.push( app.convertInt( input.charCodeAt(c) ) );
            }
     
            var out = "[]+" + charcodes.join("+"+app.convertTable["f"]+"+");
            out = "[]+(" + out + ")["+_("split")+"]("+app.convertTable["f"]+")";
            out = _("return ") + "+" + app.convertTable["String"] + "+" + _(".fromCharCode(") + "+(" + out +")+" + _(')');
            out = app.eval(out);
            out = app.eval(out);
            return out;
        };
    Avant tout je parcours le code et pour chaque caractère, récupère le charCode associé. Les charcodes sont des petits nombres, ils prennent en moyenne moins de place que les conversions de lettres exposées auparavant. De plus, String.fromCharCode() prend une infinité d'arguments et nous permettra de convertir tous les charcode en un seul appel.

    Pour générer une array de charcodes numériques, ce serait très lourd de la constituer en String en encodant les virgules, puis de faire un eval. A la place je constitue une string avec les charcode séparés par un caractère séparateur. Il faut qu'il soit le plus court possible sans être un nombre, j'ai donc choisi le "f" : (![]+[])[+[]] ; Puis il suffit d'appeler split sur ce même code séparateur pour reconstituer l'array.

    Seulement avec cette méthode, les éléments de l'array (les charcodes) ne sont plus des nombres mais des String. Donc au lieu d'un appel direct de la fonction String.fromCharCode, je constitue une string "String.fromCharCode(" + (array castée en string) +")" que je retourne évaluée ensuite.

    Le premier eval remplace le code ([+!]) par la string "String.fromCharCode(123,145,167,...)", le second exécute la fonction String.fromCharCode pour récupérer le code "décompilé". Et voilà le travail

  4. #24
    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 : 38
    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
    Héhé excellent !
    Sympa les petites astuces et l'emploie de fromCharCode qui prend tout son sens du coup.

    Donc tu pourrais faire de même pour convertir les données "en dur" que tu dois utiliser pour encoder, non ? app.convertTable["String"], _("split") etc car celles-ci, si j'ai bien compris, sont traduites en utilisant la table de correspondance des lettres pré-calculées ?

    D'ailleurs, j'ai trouvé un compilateur fonctionnel hier en cherchant un peu : JSF*ck ! Le même charset est employé et il utilise la même table de correspondance à quelques broutilles près. Pour alert(1), il le fait en 1669 car. Mais j'ai testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var name = prompt("What is your name ?");
    alert("Hello "+name);
    et là, les perfs sont désastreuses.

    A priori, il utilise d'abord les caractères connus, il construit les digits à la volée et il remplace les caractères inconnus par la même technique que toi fromCharCode(CharCodeAt()). Une fois tous les caractères matchés, il traduit le tout en soupe ([!+]) à coup de regex.

  5. #25
    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
    Citation Envoyé par Kaamo Voir le message
    Donc tu pourrais faire de même pour convertir les données "en dur" que tu dois utiliser pour encoder, non ? app.convertTable["String"], _("split") etc car celles-ci, si j'ai bien compris, sont traduites en utilisant la table de correspondance des lettres pré-calculées ?
    Je ne comprends pas trop, ces données en dur sont justement celles qui me permettent de faire le String.fromCharcode, autrement le double eval. C'est le serpent qui se mord la queue si on fait ça.

    Je ne connaissais pas JSFuck, on dirait que je ne suis pas le seul à avoir eu cette idée farfelue Mais c'est intéressant de comparer les implémentations, par exemple il économise un caractère pour undefined, il a pensé utiliser sort comme moi et il a utilisé return this comme toi pour récupérer Window.

    Au niveau du compilateur, il ne passe pas par String.fromCharCode comme wrapper total du code, donc autant il gagne en place pour les petits scripts, autant la taille explose avec les scripts plus gros.

  6. #26
    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 : 38
    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
    En effet

    Il y a Hieroglyphy, mais qui utilise {} en plus !
    Lui n'utilises pas du tout fromCharCode mais il utilise la technique charCodeAt pour chaque lettre de l'input qui n'est pas dans la table des lettres pré-calculées. Ensuite, il emploie plusieurs techniques (unescape, hexa) et prend celle qui fournit la séquence la plus courte et la stocke dans une table pour ne pas recalculer ensuite si le caractère revient ! C'est malin aussi.

    Mais ta solution semble la plus optimale. A titre d'exemple, ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var name = prompt("What is your name ?");
    alert("Hello "+name);
    donne 55287 caractères chez lui. Par contre, contrairement à JSFuck, il est ultra rapide pour la conversion.

  7. #27
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Si j'ai bien compris, le jour où je veux balancer les 241k caractères constituant le fatras de mon générateur de phrases dans ton compilateur... >>>

    La question "pour quoi faire ça ?" renvoyant dos à dos nos deux projets qui ont tous deux un petit problème pour répondre à cette question ^^ (quoi que je n'aie pas la moindre prétention de comparer mon jouet avec tes prouesses )

  8. #28
    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 regardé ton générateur Romain, ça donne des résultats plutôt amusants ! Il y a quelques temps j'avais vu un outil similaire qui générait des "phrases bidons qui font bien sur les powerpoint d'entreprise" en anglais. C'était à pisser de rire

    J'ai pris contact avec l'auteur de JSFuck pour comparer nos implémentations. Il doit y avoir moyen de grapiller quelques centaines de caractères encore, juste pour le plaisir de bien faire

Discussions similaires

  1. [Article] Coder en JavaScript avec seulement six caractères
    Par vermine dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 05/06/2016, 23h02
  2. Réponses: 3
    Dernier message: 04/05/2014, 15h27
  3. [PHP-JS] var javaScript avec test php
    Par lepierre dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/12/2004, 13h58
  4. Requete avec chaine de caractère commence par
    Par jazzes_dean dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/08/2004, 14h07
  5. [imprecis]Réaliser a^n avec seulement l'opérateur d'addition
    Par Amon dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 08/11/2002, 23h22

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