델타 암호화와 복호화

시간 제한1초메모리 제한128 MB

문제

델타 암호(delta cipher)는 매우 단순하면서도 치환 암호보다 크게 개선된 암호화 방식입니다. 알파벳 26개 글자 A–Z에는 각각 0부터 25까지의 숫자 값이 하나씩 배정됩니다. 이 배정은 일대일 대응(글자들의 순열)이며, 반드시 알파벳 순서일 필요는 없습니다. 기본 암호표는 A = 0, B = 1, …, Z = 25로 값을 배정하며, 새로운 유효한 암호표가 주어지기 전까지 사용됩니다.

암호화는 연속한 글자들의 값 차이를 이용합니다.

  1. 글자가 아닌 문자는 모두 그대로 출력합니다.
  2. 어떤 글자 바로 앞이 글자가 아닐 때(문자열의 첫 글자 포함), 그 글자는 앞에 A가 있는 것으로 간주합니다.
  3. 대소문자는 유지됩니다. 입력이 대문자면 출력도 대문자, 소문자면 소문자입니다. 다만 Aa는 같은 글자로 보아 값이 같습니다.
  4. 어떤 글자가 다른 글자 뒤에 올 때, 현재 글자의 값에서 바로 앞 글자의 값을 뺍니다. 이 차이를 26으로 나눈 나머지에 해당하는 값을 가진 글자가 출력에서 현재 글자를 대신합니다(현재 글자의 대소문자는 유지).

복호화는 이 과정을 거꾸로 수행하여 한 글자씩 원래 문자열을 복원합니다.

입력

입력은 한 줄에 하나씩 주어지는 명령들의 나열이며, 파일 끝(EOF)에서 종료됩니다. 어떤 줄도 10000자를 넘지 않습니다. 명령은 세 가지이고, 명령어의 대소문자는 구분하지 않습니다. 각 명령어 뒤에는 적어도 하나의 공백이 옵니다.

  • ENCRYPT — 줄의 나머지는 현재 암호표로 암호화할 평문입니다.
  • DECRYPT — 줄의 나머지는 현재 암호표로 평문으로 되돌릴 암호문입니다.
  • CIPHER — 줄의 나머지는 새 암호표를 정의합니다. 정확히 26개의 글자가 중복 없이 있어야 하며, 공백과 문장 부호는 무시합니다. 글자들의 순서가 값을 정합니다. 첫 번째 글자의 값은 0, 두 번째는 1, 이런 식으로 이어집니다.

첫 단어가 이 세 명령 중 어느 것도 아닌 줄은 이해할 수 없는 명령입니다.

출력

입력의 각 줄마다 한 줄씩 출력합니다. 아래에 보이는 공백은 출력의 일부이며 정확히 그대로 재현해야 합니다. 특히 모든 출력 줄은 공백 한 칸으로 끝납니다.

  • ENCRYPTDECRYPT: RESULT: 다음에 공백 두 칸, 변환된 문자열, 그리고 공백 한 칸을 출력합니다.
  • 유효한 CIPHER: Good cipher. 다음에 공백 두 칸, Using, 공백 한 칸, 26개의 글자를 대문자로 쓴 것, 그리고 마침표와 공백 한 칸을 출력합니다. 이후 모든 명령은 이 새 암호표를 사용합니다.
  • 잘못된 CIPHER(글자 개수가 틀리거나 글자가 중복된 경우): Bad cipher. 다음에 공백 두 칸, Using default., 그리고 공백 한 칸을 출력하고, 이후에는 기본 암호표를 사용합니다.
  • 인식할 수 없는 명령: Command not understood. 다음에 공백 한 칸을 출력합니다.