2017-10-06 23 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 =「こんにちはworld''しかし、あなたは難読化を実行したときの引数を受け入れるために、' STR = S'にそれを変更することができます(」あなたの文章がここ ')しました。要求に応じて、この関数を 'hello world'に実行すると、ランダムなので異なる結果が得られます。一つの可能​​な結果は次のとおりです。 '| - | 3llo W [] RLD' ' – theflarenet

+0

すべての「」に変更されないようにOK ...「@「'にどのように「こんにちは世界のすべてではない」とは何かを持っていません「? –

答えて

1

1から26の間の乱数を生成していますが、その間は文字列をループします。あなたの例では11個の乱数しか生成しないので、文字列をループしながら難読化することは決してできません。

あなたが説明したように「時々無効」になる理由を説明。

たとえば、乱数生成器では、文字 'b'を変更するだけの行に10 2が生成されます。

あなたの例には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

関連する問題