[Java][Javascript][PHP]ROT13, ROT47書いた

文字変換の練習にJava, Javascript, php で書いた。

JavaでROT13変換する

  • A-Z 0x41(65)-0x5a(90)
  • A-M 0x41(65)-0x4d(77)
  • N-Z 0x4e(78)-0x5a(90)
  • a-z 0x61(97)-0x7a(122)
  • a-m 0x61(97)-0x6d(109)
  • n-z 0x6e(110)-0x7a(122)

    package jp.fernweh;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Fw8k {
    
    private Fw8k() {}
    
    public static void main(String[] args) {
    String s2, s1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    System.out.println(s1);
    s2 = strRot13(s1);
    System.out.println(strRot13(s2));
    System.out.println(s2);
    }
    
    public static String strRot13(String s) {
    
    // 正規表現で対象文字列の確認
    Matcher m = Pattern.compile("[a-zA-Z]").matcher(s);
    if (!m.find()) {
      return s;
    }
    
    // 対象文字のキャラクタコードをルールに従って増減する
    char[] a = s.toCharArray();
    s = "";
    for (char c : a) {
      if (64 < c && c < 78 || 96 < c && c < 110) {
        c += 13;
      } else if (77 < c && c < 91 || 109 < c && c < 123) {
        c -= 13;
      }
    
      // 毎回Stringオブジェクト生成することになる?
      // パフォーマンス的にどうなのだろう
      s += c;
    }
    
    return s;
    }
    }

結果

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM

Javaでコールバック置換どうやるか知らないからとりあえずはコレでいいや。

JavasciptでROT47

  • !-~ 0x22(33)-ox7e(126)
  • !-O 0x22(33)-0x4f(79)
  • P-~ 0x50(80)-0x7e(126)

    function str_rot47(str)
    {
    return str.replace(/[!-~]+/g, function(m0){
    for(var i = 0, l = m0.length, c, res = []; i < l; i++)
    {
      c = m0.charCodeAt(i);
    
      if(32 < c && c < 80)
        c += 47;
      else if(79 < c && c < 127)
        c -= 47;
    
      res.push(String.fromCharCode(c));
    }
    return res.join('');
    });
    }
    

PHPでROT47

function str_rot47($str){
  return preg_replace_callback('/[!-~]/u',
    create_function(
      '$m',
      '
        $c = ord($m[0]);

        if(32 < $c && $c < 80)
          $c += 47;
        else if(79 < $c && $c < 127)
          $c -= 47;

        return chr($c);
      '
    ),
    $str
  );
}

無名関数を使う場合

function str_rot47 ($str) {
    return preg_replace_callback(
        '/[!-~]/u',
        function ($m) {
            $c = ord($m[0]);
            
            if(32 < $c && $c < 80)
              $c += 47;
            else if(79 < $c && $c < 127)
              $c -= 47;
              
            return chr($c);
        },
        $str);
}

メモ:Unicode変換ツール(PHP編)

Share
関連記事