Ваше завдання - взяти зашифрований рядок як вхідний і вивести рядок розшифрованою, щоб розкрити її приховане повідомлення.
Рядки, вхідні та вихідні, містять символи із цього списку з 64 символів ASCII (зверніть увагу на провідний пробіл):
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
Цим символам присвоюються номери в порядку, зазначеному вище:
! " # $ % & ...
0 1 2 3 4 5 6 ...
Отже, простір - це число 0, !
це число 1 і ~
є число 63. Ці числа можна представити в 6-бітовому двійковому коді:
: 0: 000000
!: 1: 000001
": 2: 000010
#: 3: 000011
.. ... ......
z: 61: 111101
|: 62: 111110
~: 63: 111111
Шифрування дуже просте:
Я буду використовувати eC
для зашифрованих символів і C
для символів початкового рядка. C(n)
є n-м символом початкового рядка, тоді eC(n)
як n-м символом зашифрованого рядка.
Ви будете використовувати 6-бітове двійкове представлення символів. Перший персонаж буде eC(0) = not(C(0))
. Звідти всі персонажі будуть eC(n) = xor(C(n),C(n-1))
.
Приклад:
Припустимо, вхідний рядок є code
.
c
- це 38-й символ (індексований нулем) або100110
у двійковій формі. У зашифрованій версії всі біти перевернуті, тому011001 -> 25 -> '9'
(знову ж таки, нульова індексація).o
- це 50-й символ, або110010
у двійковій формі.xor(100110, 110010) = 010100 = 20 = '4'
.d
є 39-м символом, або100111
у двійковій формі.xor(100111, 110010) = 010101 = 21 = '5'
.e
- це 40-й символ, або101000
у двійковій формі.xor(101000, 100111) = 001111 = 15 = '/'
.
Отже, якщо початковий рядок є code
, зашифрований рядок стане 945/
.
Тестові приклади:
945/
code
,&'8[14 =?;gp+% 2'@s&&c45/eg8?&
programming puzzles & code golf
;a$5$%0r?2@12dw6# lb-eg&519nt%ot=9$@es@96+?;ga" 4*)&ta56dp[?o#t%oh/"(&?#ee![,+,/+fe4"
a $150 reward will be given to those sending account and pin# to hackers@steal_id.com
~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~