Смешивание середины строк в JavaScript - PullRequest
2 голосов
/ 16 ноября 2011

Я ищу красноречивый способ смешать средние символы слов в строке, так как в «это пример строки» становится «tihs - eplamxe sritng».Я думаю сначала разделить слова в массив, выбрать слова длиннее двух символов, разделив первые и последние буквы для первой части, но я не могу найти хороший способ их зашифровать.

Ответы [ 6 ]

2 голосов
/ 16 ноября 2011

Редактировать Намного лучший ответ.

Вот быстрый и грязный подход.Вы можете использовать регулярное выражение, чтобы найти все строки длиной не менее 3 символов и вытащить первый символ, последний символ и средние символы.Затем вы просто разбиваете массив средних символов, случайным образом сортируете их и соединяете их вместе, вставляя первый и последний символы обратно.

1 голос
/ 16 ноября 2011
function middleMix(s){
    var A= s.split(''), c1= A.shift(), c3= A.pop() || '';
    while(A.length) c1+= A.splice(Math.floor(Math.random()*A.length), 1);
    return c1+c3;
}

Этот метод разбивает строку на массив символов, сдвигает первый символ и выскакивает последний.

Средняя часть (если есть) затем соединяется по одному случайному символу за раз и добавляется к префиксу.

Возвращается с последним добавленным суффиксом.

// edit- несколько слов

function middleMix(str){
    var s= str.split(' ');
    for(var i= 0; i<s.length;i++){
        var A= s[i].split(''), c1= A.shift(), c3= A.pop() || '';
        while(A.length) c1+= A.splice(Math.floor(Math.random()*A.length), 1);
        s[i]= c1+c3;
    }
    return s.join(' ');
}

middleMix("this is an example string")

/*  returned value: (String)
tihs is an exmlpae sitrng
*/
0 голосов
/ 23 ноября 2014

Версия для полной HTML-страницы. Ядром является код @ kennebec, а входными / аргументами функции является список разыскиваемых «текстовых» тегов HTML между апострофами.

Я не понимаю '. undefined 'ошибки после некоторого абзаца .. (Www.juxta.hu/eng/04.html) но это работает - ширина размещенных HTML-элементов тоже. например.

<em>Para<b>graph</b>I.C. etc.</em>

Секрет для меня - метод работы этого раздела:

 if (s[i].search("<")==-1)
                        {s[i].split("<*>")

Если разделенное слово НЕ (== - 1) содержало какие-либо элементы HTML (ширина "<" char), то вырезать это… </p>

.split("<*>")

Мне повезло.

<script>
    function shuffle() 
    {
        for (var k = 0; k < arguments.length; k++) 
      {                             
            var x = document.getElementsByTagName(arguments[k]);
                for (var n = 0; n < x.length; n++) 
          {
                var s= x[n].innerHTML.split(' ');
                for (var i= 0; i<s.length; i++) 
                    {   if (s[i].search("<")==-1)
                        {s[i].split("<*>");
                            var A= s[i].split(''), c1= A.shift(), c3= A.pop() || '';
                        while(A.length) c1+= A.splice(Math.floor(Math.random()*A.length), 1);
                        s[i]= c1+c3;
                      }
                    }                                               
                    x[n].innerHTML= s.join(' ');
              }
      }
    }

</script>

<body onload='shuffle("p", "a", "li", "h1", "span", "u", "b", "dd", "dt")'>
0 голосов
/ 16 ноября 2011

Этот код помогает, да, как вы сказали, я рассмотрел вопрос определения длины строки в условии if, но она должна быть больше 3, а не 2.

<script type="text/javascript">
 var myString = "hello world" ;         ' some value
 var mySplitResult = myString.split(" ");   ' now split it with space seperator
 var a = mySplitResult.Length();           ' get the lenth of splitted array in a
 var i ;
 var temp;
 var result_string;
 result_string= ""; 
 for(i=0;i<a;i++)
 {
   var k = mysplitResult[i].length();  ' now get the length of each string of array 
   if ( k > 3 )                        ' greater than 3 then enter if block
   {
      mySplitResult = mySplitResult.Reverse()  ' just used reverse function
      temp = mySplitResult[0];             
      mySplitResult[0] = mySplitResult[k-1];  ' then swapped first and last element of the string
      mySplitResult[k-1] = temp;
      result_string = result_string + mySplitResult[i]; ' here is the result string this is what is final output
   }
  else
  {
     result_string = result_string + mySplitResult[i];
  }
 }

</script>
0 голосов
/ 16 ноября 2011

Вот код для этого:

var str = 'this is an example string.';

var arr = str.split(/\b/g);
var i, j;
for(i = 0; i < arr.length; i++){
    if(/^\w{4,}$/.test(arr[i])){
        var temp = [];
        var end = arr[i].length - 1;
        for(j = 1; j < end; j++)
            temp.push(arr[i][j]);
        arr[i] = arr[i][0] + shuffle(temp).join('') + arr[i][end];
    }
}
str = arr.join('');

document.write(str);

function shuffle(o){
    for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
    return o;
};

Функция случайного выбора, взятая отсюда: http://snippets.dzone.com/posts/show/849

Вот, пожалуйста: http://jsfiddle.net/66LXx/

0 голосов
/ 16 ноября 2011

Напишите функцию, которая принимает массив и перемешивает все между индексами i и j. Вы можете найти примеры здесь

Теперь из строки идентифицируем все пары начального и конечного индексов всех слов.

Вызовите функцию перемешивания для всех пар

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...