2011-11-16 4 views
2

"これは例の文字列です"のように、文字列中の単語の中間文字を混ぜ合わせる雄弁な方法を探しています。 "tihsはeplamxe sritngです。 私は最初に単語を配列に分けることを考えていますが、2文字より長い単語を選択し、最初の部分の最初の文字と最後の文字を分けていますが、スクランブルの良い方法を見つけることはできません。JavaScriptの文字列の真ん中を混ぜる

答えて

1
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; 
} 

このメソッドは、文字の配列に文字列を分割し、最初の文字をオフにシフトし、最後にオフにポップするためにあなたのシャッフル機能を呼び出します。

中間部分(ある場合)は、一度に1つのランダムな文字がスプライスされ、プレフィックスに追加されます。

最後に追加された接尾辞とともに返されます。

//編集 - 複数の単語

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

メモと同じように、彼は各単語が混ざり合っていて、全体の文字列ではありません。彼はそれを最初に分割し、各セクションをランダム化する必要があります。最後に、すべてのセクションをまとめて戻します。 – mrtsherman

+0

とてもエレガントで、説明に感謝します! – CascadingStyle

+1

男、なぜ説明が付いていませんか?それは私にとって素晴らしい解決策のように見えます。彼はOPのためのすべての仕事をしなければならないのですか?例 - http://jsfiddle.net/YgMF3/ – mrtsherman

0

配列をとり、インデックスiとjの間のすべてをシャッフルする関数を記述します。あなたは見つけることができますexamples here

今すぐすべての単語の開始と終了のインデックスのすべてのペアを識別する文字列から。

は、すべてのペア

2

編集はるかに良い答え。

ここはすばやく、汚いアプローチです。正規表現を使用すると、少なくとも3文字以上の文字列をすべて検索し、最初の文字、最後の文字、および中間の文字を引き出すことができます。次に、中間文字の配列を分割し、それらをランダムにソートして結合し直します。最初と最後の文字を貼り付けます。ここで

myStr.replace(/\b([a-z])([a-z]+)([a-z])\b/ig, function(str, first, middle, last) { 
    return first + 
      middle.split('').sort(function(){return Math.random()-0.5}).join('') + 
      last; 
}); 
+0

男、私はreg表現を考えていませんでした! – CascadingStyle

+0

誰もが元気! http://xkcd.com/208/ –

0

があなたのためにそれをするためにいくつかのコードです:ここから取ら

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

このコードは、トリックを行い、まあ、あなたが言ったように私は条件では、文字列の長さを見つけることを考慮しているが、2よりも3より大きい必要があります。

<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

完全なhtmlページのバージョン。 コアは@ kennebecのコードであり、関数の入力/引数は、好きな "テキスト" HTMLタグのリストであり、アポストロフィ間です。

私は 'を理解していません。いくつかの段落の後に「未定義」エラーが発生します。 (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要素(幅 "<" 文字)が含まれていました、その後、カットアウト、私はラッキーだった

.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

trans ... late ... d –

関連する問題