var CHARS = ['[', ']', '+', '!', '(', ')']; /* changer ce tableau pour utiliser d'autres caractères */ var NB_CHARS = CHARS.length; var BALANCED_CHARS = {}; var CLOSE_CHARS = []; if ( CHARS.indexOf('[') >= 0 ) { BALANCED_CHARS['['] = ']'; CLOSE_CHARS.push(']'); } if ( CHARS.indexOf('(') >= 0 ) { BALANCED_CHARS['('] = ')'; CLOSE_CHARS.push(')'); } if ( CHARS.indexOf('{') >= 0 ) { BALANCED_CHARS['{'] = '}'; CLOSE_CHARS.push('}'); } var results = {}; /* Renvoie true si s est bien parenthésée, false sinon. */ function balanced(s) { 'use strict'; var s_LENGTH = s.length; var stack = []; var i; var c; for (i = 0; i < s_LENGTH; i++) { c = s[i]; if ( c in BALANCED_CHARS ) { stack.push(c); } else if ( CLOSE_CHARS.indexOf(c) >= 0 ) { if ( BALANCED_CHARS[stack.pop()] !== c ) { return false; } } } return (stack.length === 0); } /* Parcourt récursivement les chaînes jusqu'à une longueur num, tente de les évaluer et affiche les résultats non encore rencontrés ou déjà rencontrés mais au moins aussi long. */ function build_and_try_string(s, num) { 'use strict'; if ( num > 0 ) { var i; var c; for (i = 0; i < NB_CHARS; i++) { c = CHARS[i]; try_string(s + c); build_and_try_string(s + c, num - 1); } } } /* Affiche s */ function display(s) { try { // dans un navigateur document.write(s + '\n'); } catch ( err ) { // avec Rhino print(s); } } /* Tente d'évaluer s. Si l'évaluation s'est bien passée et que le résultat n'a pas encore été obtenu ou a déjà été obtenu avec une chaîne au moins aussi longue, alors affiche le résultat. BORD: ajoute l'éventuel élément affiché à results */ function try_string(s) { 'use strict'; if ( balanced(s) ) { var v; try { v = eval(s); } catch ( err ) { return; } var k = [typeof v, v]; if ( !(k in results) || (s.length <= results[k]) ) { results[k] = s.length; display((typeof v) + '\t' + v + '\t' + s.length + '\t' + s); } } } /* Main */ build_and_try_string('', 6);