Pyth, 69 바이트
Ksm>+0jCd16_2zJ?,hKeKQmxFdCcK2=KsmmxFkC,dJc?tPKQK2smCid16c?KQ++hJKeJ2
이것은 암호화와 암호 해독을 결합하고 단순히 0
암호화 또는 1
해독을위한 인수로 추가합니다 . 그 이유는 간단합니다. 문자열을 비트 (또는 4 비트 정수)로 변환하거나 그 반대는 실제로 Pyth에서 실제로 길다. 두 기능을 하나의 프로그램으로 결합함으로써 많은 바이트를 절약 할 수 있습니다.
온라인 데모 : 암호화 및 암호 해독 .
설명:
첫 번째 부분은 입력을 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
두 번째 부분은 해시 값을 결정하여에 저장합니다 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