| 12
 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
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 
 | 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); | 
Partager