2017-10-06 354 views
0

我已經開始在MATLAB中編程,最近試圖實現一個1337揚聲器般的發生器/字符串操作器只是爲了好玩。作爲一項挑戰,我試圖隨機更改每個角色的出現,以便並非所有「a」都變爲「@」。MATLAB循環來隨機修改字符串字符

看來我的嘗試在某種程度上起作用,因爲它非常隨意(但有時效率不高),但我相信還有更好的方法來完成這個任務。也許爲26個字符中的每一個添加更多的替代方案,並分別從它們中隨機選擇?

function O = obfuscate(s) 

str = 'hello world'; 

for i=1:length(str) 
    randomNum = randi(26,1); 

    switch randomNum 
     case 1    
      str = regexprep(str, 'a', '@', 'once'); 
     case 2 
      str = regexprep(str, 'b', 'l3', 'once'); 
     case 3 
      str = regexprep(str, 'c', '<', 'once'); 
     case 4 
      str = regexprep(str, 'd', '|]', 'once'); 
     case 5 
      str = regexprep(str, 'e', '3', 'once'); 
     case 6 
      str = regexprep(str, 'f', '|#', 'once'); 
     case 7 
      str = regexprep(str, 'g', '6', 'once'); 
     case 8 
      str = regexprep(str, 'h', '|-|', 'once'); 
     case 9 
      str = regexprep(str, 'i', '!', 'once'); 
     case 10 
      str = regexprep(str, 'j', '_/', 'once'); 
     case 11 
      str = regexprep(str, 'k', '|{', 'once'); 
     case 12 
      str = regexprep(str, 'l', '1', 'once'); 
     case 13 
      str = regexprep(str, 'm', '|\/|', 'once'); 
     case 14 
      str = regexprep(str, 'n', '/\/', 'once'); 
     case 15 
      str = regexprep(str, 'o', '[]', 'once'); 
     case 16 
      str = regexprep(str, 'p', '|*', 'once'); 
     case 17 
      str = regexprep(str, 'q', '9', 'once'); 
     case 18 
      str = regexprep(str, 'r', '|2', 'once'); 
     case 19 
      str = regexprep(str, 's', '$', 'once'); 
     case 20 
      str = regexprep(str, 't', '+', 'once'); 
     case 21 
      str = regexprep(str, 'u', '|_|', 'once'); 
     case 22 
      str = regexprep(str, 'v', '\/', 'once'); 
     case 23 
      str = regexprep(str, 'w', '\X/', 'once'); 
     case 24 
      str = regexprep(str, 'x', '%', 'once'); 
     case 25 
      str = regexprep(str, 'y', '¥', 'once'); 
     case 26 
      str = regexprep(str, 'z', '2', 'once'); 
    end 

    O = str; 

    %fprintf('%s(%i)', str(i), randomNum); 
end 

有什麼建議嗎?

+0

我不明白你是如何決定選擇更換?你能告訴我們簡單的輸入和預期的輸出嗎? –

+0

當然。我已經硬編碼這個函數來使用'str ='hello world'',但是當你運行obfuscate('your text here')時你可以改變它成爲'str = s'來接受參數。根據要求,運行'hello world'這個函數可以產生不同的結果,因爲它是隨機的。一個可能的結果是:'| - | 3llo w [] rld' – theflarenet

+0

'這樣並不是所有的「a」都變成了「@」'......好,但'hello world'與'不是全部'有什麼關係一個」 ? –

回答

1

您正在生成一個介於1到26之間的隨機數,但僅在字符串循環時生成。在你的例子中,你只會產生11個隨機數,所以在遍歷字符串的時候可能永遠不會產生混淆。

這解釋了爲什麼它會像您所描述的那樣「有時無效」。

例如,在一種情況下,您的隨機數生成器可以連續生成10個2,它只會改變字符'b'。

您的示例中沒有任何b,因此沒有任何文本會被混淆。

使用地圖容器(在Matlab幫助中搜索containers.map),您可能會更成功地將每個字符映射到混淆(替換您的開關案例邏輯),而不是將其置於概率。

然後,您可以生成一個統一的隨機數字, 1和2在每次循環迭代中確定角色是否應該被模糊處理。

例子:

function O = obfuscate(s) 

str = 'hello world'; 
keys ={'h','e','l','o','w','r','d'}; 
values = {'|-|','3','1','[]','\X/','|2','|]'}; 
obfuscationMap = containers.Map(keys,values); 
tempCell = {} %cell to hold the growing string 

for i = 1:length(str) 
    randomNum = randi(2,1); 
    switch randomNum 
     case(1) %obfuscate 
      if(isKey(obfuscationMap, str(i)) %check key is in map to avoid missing chars 
       tempCell{end+1} = obfuscationMap(str(i)); 
      else 
       tempCell{end+1} = str(i); 
      end 
     case(2) %don't obfuscate 
      tempCell{end+1} = str(i); 
    end 
end 

O = strjoin(tempStr,''); %combine cell in single string without spaces 

與上面的代碼,當randomNum是1,你會得到一個模糊處理,如果randomNum是2,那麼你不會。

因此,您應該比以前看到的更頻繁一些。

您可能需要修改一下才能得到您想要的。

+0

優秀的答案!我不知道這可以通過這種方式實現,儘管你的建議已經超出了我作爲Matlab的新手用戶的範圍。任何更多的建議,或者我可以分析一個簡單的例子,將不勝感激! – theflarenet

+0

這正是我正在尋找的(有更多的調整)。難以置信!你教過我一些新的東西,我非常棒。我期待更頻繁地使用映射!詹姆斯,非常感謝你。 – theflarenet