Pyth、69バイト
Ksm>+0jCd16_2zJ?,hKeKQmxFdCcK2=KsmmxFkC,dJc?tPKQK2smCid16c?KQ++hJKeJ2
これは、暗号化と復号化を組み合わせたもので、単に0
暗号化または1
復号化の引数として追加します。その理由は簡単です。Pythでは、文字列をビット(または4ビット整数)またはその逆に変換するのは本当に長いです。両方の機能を1つのプログラムにまとめることで、多くのバイトを節約できます。
オンラインデモンストレーション:暗号化と復号化。
説明:
最初の部分は、入力を4ビット整数のリストに変換し(各文字は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
2番目の部分はハッシュ値を決定し、それらを保存します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)
次の部分では、ハッシュ値を使用してxorを実行します。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