Rot 13 Minimal Version Java

时间:2014-01-02 16:47:10

标签: java encryption rot13

我尝试实现Rot13并尽可能减少它,这是我到目前为止的结果:

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

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

    return c;

我向我的教授展示了这一点,他说这可能有两行。我不知道如何进一步缩小此代码并且不会产生错误的输出。

感谢您的帮助

编辑:如果没有任何改变(外部范围ascii),它应该只返回c。也许解决方案是第二个答案+返回行c,以防没有返回。

6 个答案:

答案 0 :(得分:3)

您无需更新c;回来:

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

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

我还使代码更具可读性。

这很容易分为两行:

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

或者一个:

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

但当然,这不太可读,也不是一个好主意。

答案 1 :(得分:3)

一行:

return (c < 'a') ? ((c - 'A' + 13) % 26) + 'A' : ((c - 'a' + 13) % 26) + 'a';

这简单地利用了小写字母位于ASCII和UTF-8的大写字母之后的事实。当然,它不会以任何方式验证输入。

答案 2 :(得分:3)

使用ASCII表有一个小技巧。大小写字符只有一位不同。所以你可以立刻处理它们。看看这个:

A = 0100 0001     M = 0100 1101
a = 0110 0001     m = 0110 1101

所以,我认为这应该有效:

if (Character.isLetter(c))
   return (char) ((((c & 0b01011111) - 'A' + 13) % 26 + 'A') | (c & 0b00100000));
return c;

<强>解释

  1. c & 0b01011111将char变为大写。
  2. - 'A' + 13转换为基于0的int并应用偏移量。
  3. % 26 + 'A'取模数并将其归还为char。
  4. (c & 0b00100000)取出表示字母是否为小写字母的位。
  5. |将该位添加回结果,如果是,则将其设为小写。
  6. 你可以在这里使用条件运算符使其成为单行:

    return Character.isLetter(c) ? (char) ((((c & 0b01011111) - 'A' + 13) % 26 + 'A') | (c & 0b00100000)) : c;
    

    用decimal int literals替换binary和char文字后,得到:

    return Character.isLetter(c) ? (char) ((((c & 95) - 52) % 26 + 65) | (c & 32)) : c;
    

    消除空格和一些额外的括号可以:( 65个字符

    return Character.isLetter(c)?(char)((((c&95)-52)%26+65)|c&32):c;
    

    这是一场胜利,恕我直言,如果涉及到打高尔夫球的话。这当然不可读。


    演示:是的,确认。它有效:http://ideone.com/l6xYy6

    摘录输出:

    = -> =
    > -> >
    ? -> ?
    @ -> @
    A -> N
    B -> O
    C -> P
    D -> Q
    

    还有一点:

    W -> J
    X -> K
    Y -> L
    Z -> M
    [ -> [
    \ -> \
    ] -> ]
    ^ -> ^
    _ -> _
    ` -> `
    a -> n
    b -> o
    c -> p
    d -> q
    

答案 3 :(得分:2)

比Sibbo的回答略胜一筹。如果它既不属于两个范围,则返回c。并在一行。

return ((c >= 'A') && (c <= 'Z')) ? ((c-'A'+13)%26)+'A'
                                 :((c >= 'a') && (c <= 'z') ? ((c-'a'+13)%26)+'a'
                                                                  : c);

答案 4 :(得分:1)

更短并且(也许)更容易阅读

char a = c < 'a' ? 'A' : 'a';
return (c - a + 13) % 26 + a;

请注意,此解决方案与前面的一些答案一样,不会检查输入。此外,在Java中,此代码返回int而不是char,因此如果包含它的方法返回char,则必须进行强制转换。

正如已经提到的,我还想强调最短不一定是最好的。编写可读的代码。

答案 5 :(得分:0)

好吧,如果我们要短暂阅读;

return (c&~32) >= 'A' && (c&~32) <= 'Z' ? ((c&31) + 12) % 26 + (c&~31) + 1 : c;