2012-09-01 45 views

回答

1

我在VB中的「一」字線實現這一點:

Dim outText = Regex.Replace(inText, _ 
     "\b([a-zA-z])([a-zA-Z]+)([a-zA-Z])\b", _ 
     Function(g) (g.Groups(1).Value & String.Join("", _ 
      (g.Groups(2).Value.ToCharArray.OrderBy(_ 
          Function(c) (Rnd(1))) _ 
          )) & _ 
      g.Groups(3).Value)) 

更好的解決方案將提供一個「更正確」的FunctionOrderBy,將返回相同的值特定字符的字符串,但在這種情況下,只需設置Rnd種子就可以獲得(有點)可重複的結果。

(注意,設置Function是直接依賴於所提供的c裝置的所有內部字符根據一些隨機排序,因此,所有內部重複字母以加擾的話總是一起分組重新排序。)

的示例輸出:

(注意sttenig的Fictunon是drcteily dpeednent uopn 的c previodd mnaes所有inratnel cthcearras被roeerredd aindorccg到SMOE ronadm oidrren克,因此所有ietnnarl reteaepd ltteers是在srlmceabd wodrs guorped tgtheoer awayls)由馬克·赫德

+0

不錯。有沒有簡單的方法來獲取角色的索引到函數中?只是想知道,因爲那樣你就可以創建一個確定性函數,它不一定將重複字符組合在一起。我知道你可以通過增加一個外部計數器來實現,但這不是一個非常漂亮的技巧。 :) – Chris

+0

@Chris:是的,特別是如果您將外部'Function'擴展爲獨立或多行功能:'''Captures'的'Groups'包含原始匹配的'Index'字符串,所以可以做更多的事情來爲'OrderBy'提供一個「正確的」和/或可重複的'Function'。 –

1

答案是有缺陷的。即使在糾正重複字母的問題下,使用排序算法也不會產生有效的結果。 //請參閱http://okmij.org/ftp/Haskell/perfect-shuffle.txt

這是我的嘗試,使用遞歸。非常簡單易懂,但性能可以提高。顯然它不使用正則表達式,vb.net或linq(請參閱標籤)。我把它留給讀者。

Random _rng = new Random(); 

string Scramble(string text) { 
    return String.Concat(text[0], Shuffle3(text.Substring(1, text.Length - 2)), text[text.Length - 1]); 
} 

string Shuffle3(string text) { 
    return ShuffleStep(text, _rng.Next(text.Length)); 
} 

string ShuffleStep(string text, int i) { 
    return (text.Length == 1) ? text : text[i] + ShuffleStep(text.Remove(i, 1), _rng.Next(text.Length-1)); 
} 
+0

我已經實現了一個'.OrderRandomly'擴展方法,使用了你指出的正確的shuffle,但是因爲我已經使用了不帶'Yield'的VB.NET,所以不值得把它放在這裏。 –