55 lines
1.4 KiB
Ada
55 lines
1.4 KiB
Ada
WITH Ada.Text_IO, Ada.Characters.Handling;
|
|
USE Ada.Text_IO, Ada.Characters.Handling;
|
|
|
|
PROCEDURE Main IS
|
|
SUBTYPE Alpha IS Character RANGE 'A' .. 'Z';
|
|
TYPE Ring IS MOD (Alpha'Range_length);
|
|
TYPE Seq IS ARRAY (Integer RANGE <>) OF Ring;
|
|
|
|
FUNCTION "+" (S, Key : Seq) RETURN Seq IS
|
|
R : Seq (S'Range);
|
|
BEGIN
|
|
FOR I IN R'Range LOOP
|
|
R (I) := S (I) + Key (Key'First + (I - R'First) MOD Key'Length);
|
|
END LOOP;
|
|
RETURN R;
|
|
END "+";
|
|
|
|
FUNCTION "-" (S : Seq) RETURN Seq IS
|
|
R : Seq (S'Range);
|
|
BEGIN
|
|
FOR I IN R'Range LOOP
|
|
R (I) := - S (I);
|
|
END LOOP;
|
|
RETURN R;
|
|
END "-";
|
|
|
|
FUNCTION To_Seq (S : String) RETURN Seq IS
|
|
R : Seq (S'Range);
|
|
I : Integer := R'First;
|
|
BEGIN
|
|
FOR C OF To_Upper (S) LOOP
|
|
IF C IN Alpha THEN
|
|
R (I) := Ring'Mod (Alpha'Pos (C) - Alpha'Pos (Alpha'First));
|
|
I := I + 1;
|
|
END IF;
|
|
END LOOP;
|
|
RETURN R (R'First .. I - 1);
|
|
END To_Seq;
|
|
|
|
FUNCTION To_String (S : Seq ) RETURN String IS
|
|
R : String (S'Range);
|
|
BEGIN
|
|
FOR I IN R'Range LOOP
|
|
R (I) := Alpha'Val ( Integer (S (I)) + Alpha'Pos (Alpha'First));
|
|
END LOOP;
|
|
RETURN R;
|
|
END To_String;
|
|
|
|
Input : Seq := To_Seq (Get_Line);
|
|
Key : Seq := To_Seq (Get_Line);
|
|
Crypt : Seq := Input + Key;
|
|
BEGIN
|
|
Put_Line ("Encrypted: " & To_String (Crypt));
|
|
Put_Line ("Decrypted: " & To_String (Crypt + (-Key)));
|
|
END Main;
|