Chaocipher: Difference between revisions

Content added Content deleted
No edit summary
No edit summary
Line 12: Line 12:


=={{header|Ada}}==
=={{header|Ada}}==
This solution uses array slices to permute the left and right strings. Use of slices clarifies the looping logic.
Ada strings are indexed starting at 1. This fact resulted in some adjustments in loop control values compared with the C# reference solution.
Ada strings are indexed with the predefined subtype Positive which begins at 1.
<lang Ada>
<lang Ada>
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Text_IO; use Ada.Text_IO;


procedure Main is
procedure chao_slices is
type iMode is (Encrypt, Decrypt);
type iMode is (Encrypt, Decrypt);


Line 24: Line 25:
ciphertext : String (1 .. plaintext'length);
ciphertext : String (1 .. plaintext'length);
plaintext2 : String (1 .. plaintext'length);
plaintext2 : String (1 .. plaintext'length);
offset : Natural;


function IndexOf (Source : String; Value : Character) return Positive is
function IndexOf (Source : String; Value : Character) return Positive is
Line 64: Line 66:


-- permute left
-- permute left
-- The array value permutations are performed using array slices
-- rather than explicit loops


for j in index .. 26 loop
if index > 1 then
temp (j - index + 1) := left (j);
offset := 26 - index;
temp (1 .. offset + 1) := left (index .. index + offset);
end loop;

for j in 1 .. index loop
temp (26 - index + j) := left (j);
temp (offset + 2 .. 26) := left (1 .. index - 1);
end loop;
store := temp (2);

store := temp (2);
for j in 3 .. 14 loop
temp (2 .. 13) := temp (3 .. 14);
temp (j - 1) := temp (j);
temp (14) := store;
end loop;
left := temp;
temp (14) := store;
end if;
left := temp;


-- permute right
-- permute right
-- The array value permutations are performed using array slices
-- rather than explicit loops

if index > 1 then
temp (1 .. offset + 1) := right (index .. index + offset);

temp (offset + 2 .. 26) := right (1 .. index - 1);
store := temp (1);

temp (1 .. 25) := temp (2 .. 26);
temp (26) := store;
store := temp (3);

temp (3 .. 13) := temp (4 .. 14);
temp (14) := store;
right := temp;
end if;


for j in index .. 26 loop
temp (j - index + 1) := right (j);
end loop;
for j in 1 .. index loop
temp (26 - index + j) := right (j);
end loop;
store := temp (1);
for j in 2 .. 26 loop
temp (j - 1) := temp (j);
end loop;
temp (26) := store;
store := temp (3);
for j in 4 .. 14 loop
temp (j - 1) := temp (j);
end loop;
temp (14) := store;
right := temp;
end loop;
end loop;


Line 102: Line 105:


end Exec;
end Exec;

begin
begin
Put_Line ("The original text is : " & plaintext);
Put_Line ("The original text is : " & plaintext);
Line 115: Line 117:
New_Line;
New_Line;
Put_Line ("The recovered plaintext is : " & plaintext2);
Put_Line ("The recovered plaintext is : " & plaintext2);
end Main;
end chao_slices;
</lang>
</lang>
{{output}}
{{output}}
Line 124: Line 126:


HXUCZVAMDSLKPEFJRIGTWOBNYQ PTLNBQDEOYSFAVZKGJRIHWXUMC
HXUCZVAMDSLKPEFJRIGTWOBNYQ PTLNBQDEOYSFAVZKGJRIHWXUMC
ONYQHXUCZVAMDBSLKPEFJRIGTW XUCPTLNBQDEOYMSFAVZKGJRIHW
ONYHXUCZVAMDSBLKPEFJRIGTWO XUPTLNBQDEOYSMFAVZKGJRIHWW
ADBSLKPEFJRIGMTWONYQHXUCZV OYSFAVZKGJRIHMWXUCPTLNBQDE
ADSBLKPEFJRIGMTWONYHXUCZVA OYMFAVZKGJRIHSWXUPTLNBQDEE
HUCZVADBSLKPEXFJRIGMTWONYQ NBDEOYSFAVZKGQJRIHMWXUCPTL
HUCZVADSBLKPEXFJRIGMTWONYH NBDEOYMFAVZKGQJRIHSWXUPTLL
QUCZVADBSLKPEHXFJRIGMTWONY NBEOYSFAVZKGQDJRIHMWXUCPTL
YUCZVADSBLKPEHXFJRIGMTWONY NBEOYMFAVZKGQDJRIHSWXUPTLL
HFJRIGMTWONYQXUCZVADBSLKPE JRHMWXUCPTLNBIEOYSFAVZKGQD
HFJRIGMTWONYUXCZVADSBLKPEH JRHSWXUPTLNBEIOYMFAVZKGQDD
CVADBSLKPEHFJZRIGMTWONYQXU YSAVZKGQDJRHMFWXUCPTLNBIEO
CVADSBLKPEHFJZRIGMTWONYUXC YMAVZKGQDJRHSFWXUPTLNBEIOO
NQXUCVADBSLKPYEHFJZRIGMTWO BIOYSAVZKGQDJERHMFWXUCPTLN
OYUXCVADSBLKPNEHFJZRIGMTWO BEOYMAVZKGQDJIRHSFWXUPTLNN
YHFJZRIGMTWONEQXUCVADBSLKP RHFWXUCPTLNBIMOYSAVZKGQDJE
YXCVADSBLKPNEUHFJZRIGMTWOY OYAVZKGQDJIRHMSFWXUPTLNBEE
NQXUCVADBSLKPEYHFJZRIGMTWO MOSAVZKGQDJERYHFWXUCPTLNBI
PEUHFJZRIGMTWNOYXCVADSBLKP RHSFWXUPTLNBEMOYAVZKGQDJII
XCVADBSLKPEYHUFJZRIGMTWONQ AVKGQDJERYHFWZXUCPTLNBIMOS
UFJZRIGMTWNOYHXCVADSBLKPEU FWUPTLNBEMOYAXVZKGQDJIRHSS
TONQXCVADBSLKWPEYHUFJZRIGM IMSAVKGQDJERYOHFWZXUCPTLNB
MWNOYHXCVADSBTLKPEUFJZRIGM EMYAXVZKGQDJIORHSFWUPTLNBB
SKWPEYHUFJZRILGMTONQXCVADB RYHFWZXUCPTLNOBIMSAVKGQDJE
MNOYHXCVADSBTWLKPEUFJZRIGM MYXVZKGQDJIORAHSFWUPTLNBEE
ZILGMTONQXCVARDBSKWPEYHUFJ LNBIMSAVKGQDJOERYHFWZXUCPT
JRIGMNOYHXCVAZDSBTWLKPEUFJ LNEMYXVZKGQDJBIORAHSFWUPTT
JILGMTONQXCVAZRDBSKWPEYHUF LNIMSAVKGQDJOBERYHFWZXUCPT
FRIGMNOYHXCVAJZDSBTWLKPEUF LNMYXVZKGQDJBEIORAHSFWUPTT
RBSKWPEYHUFJIDLGMTONQXCVAZ RYFWZXUCPTLNIHMSAVKGQDJOBE
JDSBTWLKPEUFRZIGMNOYHXCVAJ IOAHSFWUPTLNMRYXVZKGQDJBEE
RBSKWPEYHUFJIDLGMTONQXCVAZ RYFWZXUCPTLNIHMSAVKGQDJOBE
ZGMNOYHXCVAJDISBTWLKPEUFRZ YXZKGQDJBEIOAVHSFWUPTLNMRR
UJIDLGMTONQXCFVAZRBSKWPEYH LNHMSAVKGQDJOIBERYFWZXUCPT
PUFRZGMNOYHXCEVAJDISBTWLKP LNRYXZKGQDJBEMIOAVHSFWUPTT
ILGMTONQXCFVADZRBSKWPEYHUJ MSVKGQDJOIBERAYFWZXUCPTLNH
IBTWLKPUFRZGMSNOYHXCEVAJDI SFUPTLNRYXZKGWQDJBEMIOAVHH
DRBSKWPEYHUJIZLGMTONQXCFVA YFZXUCPTLNHMSWVKGQDJOIBERA
ADIBTWLKPUFRZJGMSNOYHXCEVA VHFUPTLNRYXZKSGWQDJBEMIOAA
HJIZLGMTONQXCUFVADRBSKWPEY HMWVKGQDJOIBESRAYFZXUCPTLN
KUFRZJGMSNOYHPXCEVADIBTWLK RYZKSGWQDJBEMXIOAVHFUPTLNN
ILGMTONQXCUFVZADRBSKWPEYHJ VKQDJOIBESRAYGFZXUCPTLNHMW
GSNOYHPXCEVADMIBTWLKUFRZJG QDBEMXIOAVHFUJPTLNRYZKSGWW
XUFVZADRBSKWPCEYHJILGMTONQ SRYGFZXUCPTLNAHMWVKQDJOIBE
OHPXCEVADMIBTYWLKUFRZJGSNO MXOAVHFUJPTLNIRYZKSGWQDBEE
WCEYHJILGMTONPQXUFVZADRBSK NAMWVKQDJOIBEHSRYGFZXUCPTL
BYWLKUFRZJGSNTOHPXCEVADMIB NIYZKSGWQDBEMRXOAVHFUJPTLL
KCEYHJILGMTONWPQXUFVZADRBS NAWVKQDJOIBEHMSRYGFZXUCPTL
IYWLKUFRZJGSNBTOHPXCEVADMI NIZKSGWQDBEMRYXOAVHFUJPTLL
PXUFVZADRBSKCQEYHJILGMTONW RYFZXUCPTLNAWGVKQDJOIBEHMS
KFRZJGSNBTOHPUXCEVADMIYWLK GWDBEMRYXOAVHQFUJPTLNIZKSS
KQEYHJILGMTONCWPXUFVZADRBS WGKQDJOIBEHMSVRYFZXUCPTLNA
OPUXCEVADMIYWHLKFRZJGSNBTO VHFUJPTLNIZKSQGWDBEMRYXOAA
LMTONCWPXUFVZGADRBSKQEYHJI BEMSVRYFZXUCPHTLNAWGKQDJOI
MYWHLKFRZJGSNIBTOPUXCEVADM ZKQGWDBEMRYXOSAVHFUJPTLNII


The ciphertext is : OAHYHCOYPUMMJFJZPIAKGOBIKOMK
The ciphertext is : OAHQHCNYNXTSZJRRUIDHIXWKPKLY


The recovered plaintext is : WELLDONEISBETTERTHANWELLSAID
The recovered plaintext is : WELLDONEISBETTERTHANWELLSAID