concurso de função garble

Lembre-se da mensagem ausente que dizia como:

De acordo com uma pesquisa realizada na Cmabrigde Uinervtisy, não é possível ver onde estão os últimos artigos, mas o que há de melhor é o primeiro e o último lugar. O rset pode ser um toatl mses e você pode usá-lo com um pouco de porbelm. Isso acontece porque o homem não pode ser perseguido por istlef, mas sim por um mundo inteiro.

Enfim, estou tentando criar uma função que faria isso em uma página inteira. Existem algumas regras para esta função.

menos de 4 caracteres são deixados em paz.caracteres não alfanuméricos não contam como parte da palavra.palavras hifenizadas são realmente duas palavrasas palavras devem ficar distorcidas se comprimento> = 4 (não pode ser como o original)O primeiro e o último caracteres permanecem os mesmos e apenas os caracteres intermediários ficam distorcidos (Obrigado Hersheezy)o texto sempre deve ser aleatório e produzir ilusões únicas a cada execuçãoJavascript puro e itera em todos os nós de textoO código mais doce e mais curto vence.

De qualquer forma, parece bastante simples de implementar. Que tal iniciar um concurso para ver quem poderia criar o código mais limpo e claro para realizar essa tarefa. Sinta-se livre para emprestar sem reconhecimento do meu código (eu tenho)

Se eu perdi alguma coisa, adicione-a nos comentários. Enfim, eu trabalhei nisso de forma muito hackishly e aqui estou eu mostrando meu trabalho menos que par

DEMO

var i, j, words, textNodes, punct = /[^a-zA-Z0-9]/;

Array.prototype.shuffle = function() {
    for (var i = 0; i < this.length; i++) {
        var j = i;
        while (j == i) {
            j = Math.floor(Math.random() * this.length);
        }
        var tmp = this[i];
        this[i] = this[j];
        this[j] = tmp;
    }
    return this;
};

String.prototype.shuffle = function() {
    return this.split('').shuffle().join('');
};

function transverse(element, array) {
    if (!array) array = [];
    if (element.nodeType === 3) {
        array.push(element);
    } else {
        for (var i = 0; i < element.childNodes.length; i++) {
            transverse(element.childNodes[i], array);
        }
    }
    return array;
}

function garble(str) {
    if (!str) return '';
    str = str.trim();
    if (/-/.test(str)) {
        str = str.split('-');
        for (var i = 0; i < str.length; i++) {
            str[i] = garble(str[i]);
        }
        return str.join('-')
    }
    if (punct.test(str.charAt(0))) {
        return str.charAt(0) + garble(str.slice(1));
    }
    if (punct.test(str.charAt(str.length - 1))) {
        return garble(str.slice(0, -1)) + str.charAt(str.length - 1);
    }
    if (str.length < 4) return str;
    if (str.length === 4) return str.charAt(0) + str.charAt(2) + str.charAt(1) + str.charAt(3)
    return str.charAt(0) + str.substr(1, str.length - 2).shuffle() +
        str.charAt(str.length - 1);
}


window.onload = function() {
    textNodes = transverse(document.documentElement);
    for (i = 0; i < textNodes.length; i++) {
        words = textNodes[i].data.split(' ');
        for (j = 0; j < words.length; j++) {
            words[j] = garble(words[j]);
        }
        textNodes[i].data = words.join(' ');
    }
};

questionAnswers(4)

yourAnswerToTheQuestion