Pyth,69个字节
Ksm>+0jCd16_2zJ?,hKeKQmxFdCcK2=KsmmxFkC,dJc?tPKQK2smCid16c?KQ++hJKeJ2
这结合了加密和解密,只需0
为加密添加一个as参数或1
解密。这样做的原因是简单的。在Pyth中,将字符串转换为位(或4位整数)或相反的操作确实非常长。通过将这两个函数组合到一个程序中,我可以节省很多字节。
在线演示:加密和解密。
说明:
第一部分将输入转换为4位整数列表(每个char转换为2个4位整数)并将其存储在中K
。
m z map each character d of input (=z) to:
Cd the ascii-value of d
j 16 convert the result into base 16
>+0 _2 insert a zero to the front and take the last 2 values
(so that each char gets mapped to exactly 2 numbers)
Ks chain all these tuples and assign them to K
第二部分确定哈希值并将其存储在中J
。如果Q==0
通过xor进行计算,则采用的第一个和最后一个值K
。
? Q ... if Q (=second input) else ...
,hKeK [K[0], K[-1]]
m CcK2 map each d of zipped(K chopped into pairs) to:
[zipped(...) gives me 2 lists, one with the values of the even indices, and one with the odd indices]
xFd fold the list d by xor
J store the result in J (this is the hash value)
下一部分使用哈希值进行异或。在Q == 0
完整列表上执行时K
,否则仅在K
没有第一个和最后一个值的列表上执行。
=KsmmxFkC,dJc?tPKQK2
?tPKQK K[1:-1] if Q else K
m c 2 map each d of [... chopped into pairs] to:
m C,dJ map each pair k of zip(d,J) to:
xFk apply xor to the 2 values in k
=Ks chain all these tuples and assign them to K
最后一部分转换K
回字符:
smCid16c?KQ++hJKeJ2
?KQ++hJKeJ K if Q else J[0] + K + J[1]
m c 2 map each pair of [... chopped into pairs] to:
id16 convert d into a single integer
C convert to char
s join all chars and print