fork download
  1. // Программа кодирует строки, используя алгоритмв класса ROT
  2. // !!! Не работает для 4-байтных символов UNICODE и многосимвольной диакритики
  3. // Alexey Kuzminov (с) 2016
  4.  
  5. program MultiROT;
  6.  
  7. var
  8. strFrom: WideString;
  9. strTo: WideString;
  10.  
  11. procedure ClearTable;
  12. begin
  13. strFrom := '';
  14. strTo := '';
  15. end;
  16.  
  17. // Процедура добавляет к имеющейся таблице кодирования символы алфавита, для
  18. // замены импользуется циклический сдвиг на shift символов.
  19. procedure InitTable(const alphabet: String; shift: Integer);
  20. var
  21. i, nPos, nLength: Integer;
  22. strAlphabet: WideString;
  23. begin
  24. strAlphabet := UTF8Decode(alphabet);
  25. nLength := Length(strAlphabet);
  26. if nLength <= 0 then Exit;
  27.  
  28. if shift = 0 then
  29. shift := nLength div 2
  30. else
  31. shift := ((shift mod nLength) + nLength) mod nLength;
  32.  
  33. for i := 1 to nLength do begin
  34. nPos := Pos(strAlphabet[i], strFrom);
  35. if nPos > 0 then
  36. strTo[nPos] := strAlphabet[(i - 1 + shift) mod nLength + 1]
  37. else begin
  38. strFrom := strFrom + strAlphabet[i];
  39. strTo := strTo + strAlphabet[(i - 1 + shift) mod nLength + 1];
  40. end;
  41. end;
  42. end;
  43.  
  44. // Если при передаче опущен параметр, то он будет равен половине длины строки
  45. procedure InitTable(const alphabet: String);
  46. begin
  47. InitTable(alphabet, 0);
  48. end;
  49.  
  50. function Encode(const str: String): String;
  51. var
  52. i, nPos: Integer;
  53. strInput, strOutput: WideString;
  54. begin
  55. strInput := UTF8Decode(str);
  56. strOutput := '';
  57.  
  58. for i := 1 to Length(strInput) do begin
  59. nPos := Pos(strInput[i], strFrom);
  60. if nPos > 0 then
  61. strOutput := strOutput + strTo[nPos]
  62. else
  63. strOutput := strOutput + strInput[i];
  64. end;
  65.  
  66. Encode := UTF8Encode(strOutput);
  67. end;
  68.  
  69.  
  70. begin
  71. // Шифр Цезаря (3 символа - классика)
  72. ClearTable;
  73. InitTable('ABCDEFGHIJKLMNOPQRSTUVWXYZ', -3);
  74. InitTable('abcdefghijklmnopqrstuvwxyz', -3);
  75. WriteLn(Encode('Alphabet 13'), ' - Caesar' );
  76.  
  77. // ROT5
  78. ClearTable;
  79. InitTable('0123456789');
  80. WriteLn(Encode('Alphabet 13'), ' - ROT5');
  81.  
  82. // ROT13
  83. ClearTable;
  84. InitTable('ABCDEFGHIJKLMNOPQRSTUVWXYZ');
  85. InitTable('abcdefghijklmnopqrstuvwxyz');
  86. WriteLn(Encode('Alphabet 13'), ' - ROT13');
  87.  
  88. // ROT18
  89. ClearTable;
  90. InitTable('0123456789');
  91. InitTable('ABCDEFGHIJKLMNOPQRSTUVWXYZ');
  92. InitTable('abcdefghijklmnopqrstuvwxyz');
  93. WriteLn(Encode('Alphabet 13'), ' - ROT18');
  94.  
  95. // ROT47
  96. ClearTable;
  97. InitTable('!"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ' +
  98. '[\]^_`abcdefghijklmnopqrstuvwxyz{|}~');
  99. WriteLn(Encode('Alphabet 13'), ' - ROT47');
  100.  
  101. end.
Success #stdin #stdout 0s 276KB
stdin
Standard input is empty
stdout
Ximexybq 13 - Caesar
Alphabet 68 - ROT5
Nycunorg 13 - ROT13
Nycunorg 68 - ROT18
p=A9236E `b - ROT47