【问题标题】:ROT-13 function in java?java中的ROT-13函数?
【发布时间】:2012-01-24 02:16:59
【问题描述】:

作为标准 Java 库之一的一部分,是否已经有 rot13()unrot13() 实现?还是我必须自己编写并“重新发明*”?

它可能看起来像这样:

int rot13 ( int c ) { 
  if ( (c >= 'A') && (c <= 'Z') ) 
    c=(((c-'A')+13)%26)+'A';

  if ( (c >= 'a') && (c <= 'z') )
    c=(((c-'a')+13)%26)+'a';

  return c; 
}

【问题讨论】:

  • @BNL 我个人更喜欢 rot104。虽然需要专用的协处理器
  • @BNL LOL 谁说这是出于安全目的?见this
  • 顺便说一下,rot13 是它自己的逆,所以你实际上不需要“unrot13”方法。

标签: java rot13


【解决方案1】:

不妨贡献我的功能,为其他开发者节省宝贵的时间

public static String rot13(String input) {
   StringBuilder sb = new StringBuilder();
   for (int i = 0; i < input.length(); i++) {
       char c = input.charAt(i);
       if       (c >= 'a' && c <= 'm') c += 13;
       else if  (c >= 'A' && c <= 'M') c += 13;
       else if  (c >= 'n' && c <= 'z') c -= 13;
       else if  (c >= 'N' && c <= 'Z') c -= 13;
       sb.append(c);
   }
   return sb.toString();
}

【讨论】:

【解决方案2】:

我不认为默认情况下它是 Java 的一部分,但这里有一个如何实现它的示例;

public class Rot13 { 

    public static void main(String[] args) {
        String s = args[0];
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if       (c >= 'a' && c <= 'm') c += 13;
            else if  (c >= 'A' && c <= 'M') c += 13;
            else if  (c >= 'n' && c <= 'z') c -= 13;
            else if  (c >= 'N' && c <= 'Z') c -= 13;
            System.out.print(c);
        }
        System.out.println();
    }

}

来源:http://introcs.cs.princeton.edu/java/31datatype/Rot13.java.html

【讨论】:

    【解决方案3】:
    private final static List<String> upperAlphabets = Arrays.asList(
            "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N",
            "O", "P", "Q", "R", "S", "T", "U",
            "V", "W", "X", "Y", "Z");
    private final static List<String> lowerAlphabets = Arrays.asList(
            "a", "b", "c", "d", "e", "f", "g",
            "h", "i", "j", "k", "l", "m", "n",
            "o", "p", "q", "r", "s", "t", "u",
            "v", "w", "x", "y", "z");
    
     private static void rot(int toSkip, String value) {
            StringBuilder sb = new StringBuilder();
            int pos = 0, newPos = 0;
            boolean upper;
            for (char c : value.toCharArray()) {
                pos = upperAlphabets.indexOf(String.valueOf(c));
                if (pos == -1) {
                    pos = lowerAlphabets.indexOf(String.valueOf(c));
                    upper = false;
                } else {
                    upper = true;
                }
    
                if (pos + toSkip > 25) {
                    newPos = (pos + toSkip) % 26;
                } else {
                    newPos = pos + toSkip;
                }
    
                if (upper) {
                    sb.append(upperAlphabets.get(newPos));
                } else {
                    sb.append(lowerAlphabets.get(newPos));
                }
            }
            System.out.println(sb);
        }
    

    这不仅仅是关于 rot13,它可以根据您传递的值执行 rot100 或 rot1213 任何操作,最重要的是,大写和小写字母列表都是必须的。

    【讨论】:

      【解决方案4】:

      你做的很像:

      pblic 类 Rot13 {

      pblic static void main(Strng[] args) {
          String s = args[0];
          for (int i = 0; i < s.length(); i++) {
              char c = s.chrAt(i);
              if       (c >= 'a' & c <= 'm') c += 13;
              els if  (c >= 'A' & c <= 'M') c += 13;
              els if  (c >= 'n' & c <= 'z') c -= 13;
              els if  (c >= 'N' & c <= 'Z') c -= 13;
              System.out.print(c);
          }
          System.out.println();
      }
      

      【讨论】:

      • 为什么要复制已接受的邮件并通过破坏格式和删除某些字符来使情况变得更糟?这有什么意义?