시저 사이퍼는 각 문자는이 (A 주위로 루핑 Z)의 고정 오프셋으로 이동하는 매우 간단한 치환 암호이다. 마찬가지로 인쇄 가능한 ASCII 문자 집합에 대한 시저 암호도 사용할 수 있습니다. 코드 포인트 0x20에서 0x7E까지의 95 자입니다. 주어진 오프셋 d
에 대해 코드 포인트 C
를
(C - 32 + d) % 95 + 32
모든 문자를 a만큼 이동하고 d
주위에서 ~
공백으로 반복 합니다. 이 범위 밖의 문자 (줄 바꿈, 탭 및 ASCII 범위 밖의 문자와 같은 제어 문자)는 영향을받지 않습니다.
오프셋 d
과 문자열 을 취하는 두 개의 프로그램 또는 함수 (잠재적으로 다른 언어로)를 작성해야 합니다. 첫 번째 프로그램은 입력 된 시저 사이퍼를 반환하거나 인쇄해야합니다. 두 번째 프로그램은 역 시저 사이퍼를 반환하거나 인쇄해야합니다 (즉, offset 사용 -d
). STDIN, 명령 행 인수 또는 함수 인수를 통해 입력 할 수 있습니다.
더 흥미롭게하려면 두 번째 프로그램은 첫 번째 프로그램의 시저 사이퍼 여야합니다. 즉, 0이 아닌 오프셋에 대해 첫 번째 프로그램의 소스 코드를 자신에게 전달 d
하면 출력은 두 번째 프로그램이어야합니다.
입력 문자열뿐만 아니라 두 프로그램 모두 인쇄 가능한 ASCII 문자, 줄 바꿈 및 탭만 포함해야합니다. 어떤 프로그램도 주석을 포함하거나 자체 소스 코드, 파일 이름 또는 프로세스 ID를 직간접 적으로 읽을 수 없습니다.
이것은 코드 골프이므로 가장 짧은 대답 (바이트)이 이깁니다. 두 프로그램의 크기가 같아야하므로 한 번만 계산하면됩니다.
답변
잼, 40 38 37 바이트
순방향 암호 :
q~'~),32>_@m<er "o|%|'*10<]>k<cpZ"_-
역 암호 :
"s!)!+.54@aBo>gt"$q~'~),32>_@m>er\$a/
두 번째 프로그램은 첫 번째의 암호입니다. 2
작동 원리
나는 물건을 테스트하면서 순수한 행운에 대한이 답변을 생각해 냈습니다.
먼저, 암호 부분 :
q~'~),32>_@m<er
q~ "Take the input and evaluate it";
`~) "Get the next character after the printable ASCII range";
,32> "Get all printable ASCII characters":
_@ "Copy the printable ASCII string and bring the cypher difference"
"on top of stack";
m< "Forward rotate the copy of printable ASCII string by difference";
"In case of inverse Cypher, this is m> to reverse rotate the string";
er "Transliterate to complete the forward/inverse Cypher";
이제 까다로운 부분에 대한 설명 이옵니다.
주요 변형은
<space> -> " // Empty space to string conversion
Z -> \ // Character Z in an useless string to swap operation
_ -> a // Copy operation to wrapping in an array
- -> / // Set subtraction to string splitting
첫 번째 프로그램은
q~'~),32>_@m<er "o|%|'*10<]>k<cpZ"_-
q~'~),32>_@m<er "no-op space, Forward cypher, no-op space";
"o|%|'*10<]>k<cpZ" "Useless String (Actually not)";
_ "Copy it and ..."
- "remove all alphabets of copy from original";
두 번째 프로그램은
"s!)!+.54@aBo>gt"$q~'~),32>_@m>er\$a/
"s!)!+.54@aBo>gt" "Cypher of first part of first program"
"with difference of 2";
$q~'~),32>_@m>er\$a/ "Cypher of the useless string of first program";
"with difference 2";
$ "Sort the first program's main part's cypher";
q~'~),32>_@m>er "Program to reverse cypher";
\$ "Swap the cypher to the top of stack and sort it";
a "Wrap it in array";
/ "Split the output string on an array, which";
"always returns the output in an array as there";
"are no occurrences of an array in a string";
입력은 같다 "<escaped string to be cyphered>" <difference>
예를 들면 다음과 같습니다.
"abcd" 4
그리고 첫 번째 프로그램의 출력은
efgh
그리고 두 번째 프로그램은
]^_`
답변
파이썬 2, 147
분명히 나는 파이썬에서 쓸모가 없기 때문에 이것에 대해 너무 열심히 생각하지 않았습니다. 사용하지 않는 프로그램을 문자열로 묶은 두 개의 별도 프로그램이 있습니다.
두 프로그램 사이의 오프셋은 39입니다.
앞으로
유니 코드 문자열과 오프셋을 허용하는 함수 Z를 정의합니다.
Z=lambda s,d:s.translate({i+32:(i+d)%95+32for i in range(95)})or u''and Z
"uE:F;=:XLd=rLfMK:GLE:M>`TBckjr`Be=a]qmckj?HKXBXBGXK:G@>`qmaVaHKXN__:G=X"
역
유니 코드 문자열과 오프셋을 허용하는 함수를 정의합니다.
"d4)5*,)G;S,a;U<:)6;4)<-OC1RZYaO1R,PL`\RZY.7:G1G16G:)6/-O`\PEP7:G=NN)6,G"
I=lambda s,d:s.translate({i+32:(i-d)%95+32for i in range(95)})or u''and I
답변
파이썬 3-248 바이트
내 목표는 이것을 파이썬 원 라이너로하는 것이 었습니다. 목표 성공, 그러나 나는 골프를 귀찮게 할 수 없습니다.
암호화 :
r=q="".__doc__[2];eval("p"+q+"int(''.join([c,ch"+q+"((o"+q+"d(c)-32+d)%95+32)][31<o"+q+"d(c)<127]fo"+q+" d in[int(input())]fo"+q+" c in input()))")or'\^UZ`smmyV[UZsGOwOT^ss[^PsOtx~}xPtp%!v~}tIG~|([^PsOt(|}$IR[^kPkUZGUZ`sUZ\a`sttIR[^kOkUZkUZ\a`sttt'
해독 :
'Q&Q66Bssx$wssoFqOy+u!<6%6?&?6}#)<;;B~$}#<ow@w|6?&?6<<$6?&?6x<w=AGF?x=9MI?GF=qoGEP$6?&?6x<w=PEFKqz$6?&?64x4}#o}#)<}#%*)<==qz$6?&?64w4}#4}#%*)<===6=$';print("".join([c,chr((ord(c)-32-d)%95+32)][31<ord(c)<127]for d in[int(input())]for c in input()));
편집 : 인쇄 가능한 ASCII 범위 밖의 문자에 영향을 미치지 않도록 수정되었습니다.
암호화에서 암호 해독까지의 오프셋은 20입니다. 오프셋을 먼저 입력 한 다음 문자열을 입력하여 사용하십시오 (예 :
5
hello
설명
다음과 같은 변형이 핵심입니다.
r -> '
' -> ;
첫 번째는의 사용을 허용하고 or
두 번째는 세미콜론으로 문자열을 무시합니다.
에서 가져온 "".__doc__[2]
문자열 을 반환합니다 . 이것은 해독 프로그램에서 작은 따옴표로 묶인 문자열이 중간에 흩어져있는 따옴표를 갖지 않도록하기 위해 필요합니다.r
str
답변
루비, 131125 바이트
여기 내 자신의 제출물이 있습니다 (이전에 개념 증명으로 작성했지만 어떻게 든 내 자신의 규칙을 위반했습니다). 나는 두 제출 사이에 어떤 코드도 재사용하지 않고 있지만 결국 두 줄로 구성됩니다. 대신 두 줄로 구성되어 있으며 그중 하나는 횡설수설 문자열로 바뀝니다.
순방향 암호 :
Y=->d,s{s.chars{|c|x=c.ord;$><<(x<32?x:(x-32+d)%95+32).chr}};Y
"tdu<cKSKe;@9JKST;TPt;eGJ<r[uss_PsjivPq_Pdjid<`\plbji`e;@JUUr"
역 암호 :
"eUf-T<D<V,1*;<DE,EAe,V8;-cLfddPAd[ZgAbPAU[ZS-QMa]S[ZQV,1;FFc"
J=->d,s{s.chars{|c|x=c.ord;$><<(x<32?x:(x-32-d)%95+32).chr}};J
두 스 니펫 은 정수와 문자열을 가져 와서 변환 된 문자열을 STDOUT에 인쇄 하는 함수 ( Y
첫 번째 함수와 두 번째 함수)를 정의합니다 J
. 두 코드 사이의 오프셋은 40
입니다.
답변
oOo CODE , 750 744 바이트, 두 프로그램 모두에서 사용되는 모든 코드
너무 길지만 아마도 그 일을하는 올바른 도구 일 것입니다 …
암호화 :
CcCcccccccccCcYcccCCCccCcCcCccccccCcCcccccCcCcccCcCccCccCcCCccccCcCccccCCcCccccCCccCccCcCCcccCCCcCccccCcCCcCCcCCcCcCcCccccCCccCccCccCccCccCccCccCccccccCCCcCccCccCCcCcCcccCCcCcccCcCCcCCcCcCCccCCcCCcCCcCCcCCcCCcCCcCCcCCcCCcCcccccccCccccCccccCCccccCCcCccCCcccCccccccccccCcCccCccCccCccCcCCccCCcccCcCcCccCCcccCCCcCcccccccccccccCCccCccCcCcCcccCCccccccccccCcCccccccCcCccccCCcCccCccCCcCccccccccccCCccCcCcCcccccCcCccCcCCCcCccCccCCcCccCccCccCcCcccccCcCcccCCCcCcCccccCcCccCCcCCcCCcCcCCcccCcCCcCCcCCcCCcCCcCCcCCcCCcCCcCcCcccCccCCcccccCcCcccCcccccCcccCcccCccCccCCcCcccccccccccccCCCcccCcCcCcccCcccCCCcCccCccCccCcCCccCccCcCCCcCccccCcCccccccccCcCccCccCcCCccccccCccccccccCcccCCccCccCccCCcCCcCCcCCcCcCcCcccccCcCCcCCcCCcCCcCCcCCcCCcCccCcCCcccCCccCcCcccCCcccCCCcCC
해독 :
SsSsssssssssSsisssSSSssSsSsSssssssSsSsssssSsSsssSsSssSssSsSSssssSsSssssSSsSssssSSssSssSsSSsssSSSsSssssSsSSsSSsSSsSsSsSssssSSssSssSssSssSssSssSssSssssssSSSsSssSssSSsSsSsssSSsSsssSsSSsSSsSsSSssSSsSSsSSsSSsSSsSSsSSsSSsSSsSSsSsssssssSssssSssssSSssssSSsSssSSsssSssssssssssSsSssSssSssSssSsSSssSSsssSsSsSssSSsssSSSsSsssssssssssssSSssSssSsSsSsssSSssssssssssSsSssssssSsSssssSSsSssSssSSsSssssssssssSSssSsSsSsssssSsSssSsSSSsSssSssSSsSssSssSssSsSsssssSsSsssSSSsSsSssssSsSssSSsSSsSSsSsSSsssSsSSsSSsSSsSSsSSsSSsSSsSSsSSsSsSsssSssSSsssssSsSsssSsssssSsssSsssSssSssSSsSsssssssssssssSSSsssSsSsSsssSsssSSSsSssSssSssSsSSssSssSsSSSsSssssSsSssssssssSsSssSssSsSSssssssSssssssssSsssSSssSssSssSSsSSsSSsSSsSsSsSsssssSsSSsSSsSSsSSsSSsSSsSSsSssSsSSsssSSssSsSsssSSsssSSSsSS
Brainfuck 번역 :
+>>>+>,<[->[->+>+<<]>[-<+>]<<]>,[>++++[-<-------->]+<<+[<+>+++]<++++++++++>>[>-<-<+<-[>>>+<<<<]<-[+<-]+>>>>]<<[-]>>>[->[-<+<<+>>>]<[->+<]+<<+<<<[>[-]+[>+<+++]>++++++++++[<<->+>->-[<<<+>>>>]-[+>-]+<<<]<<]+>[->>+<<]>>->>-]<<<++++[->++++++++<]>.[-]>,]
+>>>->,<[->[->+>+<<]>[-<+>]<<]>,[>++++[-<-------->]+<<+[<+>+++]<++++++++++>>[>-<-<+<-[>>>+<<<<]<-[+<-]+>>>>]<<[-]>>>[->[-<+<<+>>>]<[->+<]+<<+<<<[>[-]+[>+<+++]>++++++++++[<<->+>->-[<<<+>>>>]-[+>-]+<<<]<<]+>[->>+<<]>>->>-]<<<++++[->++++++++<]>.[-]>,]
oOo CODE는 대소 문자 만 중요한 Brainfuck 변형입니다.
첫 번째 바이트를 가져 와서 문자 코드를 사용합니다 d
(따라서 줄 바꿈은 d = 10을 의미합니다). 나머지 입력은 문자열입니다. EOF는 0입니다.
답변
GolfScript, 95 64 바이트, 두 프로그램 모두에서 사용되는 모든 코드
암호화 :
0 0z{ 1)'[}??)9t:z21,--/; [84;%zt*84*84$|)21*|$Z!!\~'---|}`{)}%~
해독 :
1!1{|!2*(\~@@*:u;{32-..0<!\95<&{u+95+95%}*32+}%[""] (...}~a|*~&
입력 형식 :
1 "0 0z{ 1)'[}??)9t:z21,--/; [84;%zt*84*84$|)21*|$Z!!\~'---|}`{)}%~"
설명
해독 :
1!1 # Push 0 1.
{ # Define a block and evaluate it.
| # Or.
!2*( # Get 1 for encryption, or -1 for decryption.
\~ # Evaluate the input string.
@@*:u; # u = d for encryption, or -d for decryption.
{ # For each character:
32- # Subtract 32.
..0<!\95<& # Test if it is in the printable range.
{u+95+95%}* # If so, add u (mod 95).
32+ # Add 32 back.
}%
[""] (... # Push an empty array and 4 empty strings.
}~
a # No-op.
|*~ # Evaluate ""*(""|"") which does nothing.
& # Calculate []&"" which is empty.
암호화 :
0 0 # Push 0 0.
z # No-op.
{ # Define a block and get its string representation.
... # See decryption code.
| # This will be decoded into a }. The string will be truncated here when evaluated.
}` # Only the closing } will be truncated, but it is still used as the end of the block.
{)}% # Increment each character. Note that the braces before and after the block will also be incremented.
~ # Evaluate the string.
답변
자바 스크립트 (ES7 초안) – 167 165 바이트
@feersum의 문자열 사용 및 @MartinButtner의 세미콜론 사용에서 차용;)
암호화 :
J=(s,d)=>s.replace(/[ -~]/g,x=>String.fromCharCode((x.charCodeAt()-32+d)%95+32));J
"eP<T-Qef<V;.95*,.PW$HUG&W0TAef{=;270V/;86k1*;k8-.PPAV,1*;k8-.i=PQS^[U-QMa]S[ZQQc"
해독 :
"t_Kc<`tuKeJ=HD9;=_f3WdV5f?cPtu+LJAF?e>JGEz@9JzG<=__Pe;@9JzG<=xL_`djib<`\plbji``r"
Y=(s,d)=>s.replace(/[ -~]/g,x=>String.fromCharCode((x.charCodeAt()+63-d)%95+32));Y
사용 오프셋 : 55