如何實現加密內部字母文字的「舊」技巧?交換內部字母文字
對於那些不瞭解它的人Wikipedia描述得很好。
正如在this question的評論中提到的,這已經有一些research納入最初提到的「研究」中。
如何實現加密內部字母文字的「舊」技巧?交換內部字母文字
對於那些不瞭解它的人Wikipedia描述得很好。
正如在this question的評論中提到的,這已經有一些research納入最初提到的「研究」中。
我在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))
更好的解決方案將提供一個「更正確」的Function
爲OrderBy
,將返回相同的值特定字符的字符串,但在這種情況下,只需設置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)由馬克·赫德
答案是有缺陷的。即使在糾正重複字母的問題下,使用排序算法也不會產生有效的結果。 //請參閱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));
}
我已經實現了一個'.OrderRandomly'擴展方法,使用了你指出的正確的shuffle,但是因爲我已經使用了不帶'Yield'的VB.NET,所以不值得把它放在這裏。 –
不錯。有沒有簡單的方法來獲取角色的索引到函數中?只是想知道,因爲那樣你就可以創建一個確定性函數,它不一定將重複字符組合在一起。我知道你可以通過增加一個外部計數器來實現,但這不是一個非常漂亮的技巧。 :) – Chris
@Chris:是的,特別是如果您將外部'Function'擴展爲獨立或多行功能:'''Captures'的'Groups'包含原始匹配的'Index'字符串,所以可以做更多的事情來爲'OrderBy'提供一個「正確的」和/或可重複的'Function'。 –