1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
| program cipher;
const
KEY = 'ПЕЛИКАН';
MSG = 'ТЕРМИНАТОР ПРИБЫВАЕТ СЕДЬМОГО В ПОЛНОЧЬ';
type
TIndexArray = array of integer; // Тип: массив целых чисел
function BubbleSort(text: string): TIndexArray; // Пузырьковая сортировка, на выходе в result записывается массив целых чисел
var
i, j, n: integer;
count: integer;
tmp_c: char;
tmp_i: integer;
begin
n := Length(text); // n - это длина строки text
SetLength(result, n); // размер массива результата сортировки:= n
For i := 1 to n do // от 1 до конца массива
result[i - 1] := i - 1; // заносим в result значение текущего индекса (счёт индекса идёт от нуля, т.к. n-1, хотя можно было выше написать For i:= 0 to n-1 do)
For j := 1 to n - 1 do begin // тут от 1 до n-1
count := 0; // значению count каждый раз присваивается 0
For i := 1 to n - j do begin // от 1 (i увеличивается) до n-j (n - уменьшается, т.к. j увеличивается |см. цикл выше|)
if (text[i] > text[i + 1]) then begin // Если текущий символ строки больше следующего элемента
tmp_c := text[i]; // заносим его во временный символ
text[i] := text[i + 1]; // а в него самого заносим следующий символ
text[i + 1] := tmp_c; // а в следующий символ заносим символ со временного символа, тоесть больший поменяли местами м меньшим
tmp_i := result[i - 1]; // во временный целочисленный элемент заносим значение с массива результата [i-1]
result[i - 1] := result[i]; // а на его место ставим следующее значение
result[i] := tmp_i; // на место следующего ставим значение предыдущего (которое мы созранили во временном элементе), короче как и там поменяли местами 2 соседних элемента
Inc(count); // увеличиваем наш count на 1
end; // закрываем цикл раз, который вот этот (if (text[i] > text[i + 1]) then begin)
end; // закрываем цикл два, который вот этот (For i := 1 to n - j do begin)
if (count = 0) then break; // если не было переноса, т.е. не выполнялось условие (text[i] > text[i + 1]), то выходим из цикла
end; // закрываем вот ето: (For j := 1 to n - 1 do begin)
end; // а тут конец самой функции бабл сорт
function IntArrayToStr(int_array: TIndexArray): string; // функция переводит целочисленное значение в текстовое, типа из int в string, на выходе у неё стринг, а на входе массив integer
var
s: string;
i: integer;
begin
result := ''; // Очищаем результат
For i := 0 to Length(int_array) - 1 do begin // от 0 до конца массива
Str(int_array[i], s); // заносим цифру в виде строчного значения в s
result := result + s; // в результат функции добавляем s
end;
end;
function Encrypt(keyword, message: string): string; // функция которая получает 2 стринга и выводит 1 стринг
var
index: integer;
row, rows: integer;
index_array: TIndexArray;
position: integer;
begin
index := Pos(' ', message);
While (index > 0) do begin
Delete(message, index, 1);
index := Pos(' ', message);
end;
rows := Length(message) Div Length(keyword);
if (Length(message) Mod Length(keyword) <> 0) then
Inc(rows);
index_array := BubbleSort(keyword);
result := '';
For row := 1 to rows do begin
For index := 0 to Length(index_array) - 1 do begin
position := index_array[index] * rows + row;
if (position > Length(message)) then
continue;
result := result + message[position];
end;
end;
end;
function Decrypt(keyword, cipher: string): string;
var
index: integer;
row, rows: integer;
index_array: TIndexArray;
position: integer;
begin
rows := Length(cipher) Div Length(keyword);
if (Length(cipher) Mod Length(keyword) <> 0) then
Inc(rows);
index_array := BubbleSort(keyword);
index_array := BubbleSort(IntArrayToStr(index_array));
result := '';
For index := 0 to Length(index_array) - 1 do begin
For row := 0 to rows - 1 do begin
position := (index_array[index] + 1) + Length(keyword) * row;
if (position > Length(cipher)) then
continue;
result := result + cipher[position];
end;
end;
end;
var
enc, dec: string;
begin
WriteLn(KEY, ' / ', MSG);
WriteLn;
enc := Encrypt(KEY, MSG);
WriteLn('ENC: ', enc);
dec := Decrypt(KEY, enc);
WriteLn('DEC: ', dec);
end. |