Szyfr Bacona.

0

Witam.
Probuje napisac szyfr Bacona w delphi ale wydaje mi sie ze moje deklaracje sa zle i mam problem z zamiana znakow. Czy ktos moze mi doradzic co zrobic zeby bylo to poprawne.

procedure TForm1.Button1Click(Sender: TObject);
const
  tab1 : array [1..26] of string = (('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H'), ('I'), ('J'),
                                    ('K'), ('L'), ('M'), ('N'), ('O'), ('P'), ('Q'), ('R'), ('S'), ('T'),
                                    ('U'), ('V'),('W'),('X'),('Y'),('Z'));

  tab2 : array [1..26] of string = (('aaaaa'), ('aaaab'), ('aaaba'), ('aaabb'), ('aabaa'), ('aabab'), ('aabba'),
                                    ('aabbb'), ('abaaa'), ('abaaa'), ('abaab'), ('ababa'), ('ababb'), ('abbaa'),
                                    ('abbab'), ('abbba'), ('abbbb'), ('baaaa'), ('baaab'), ('baaba'), ('baabb'),
                                    ('baabb'), ('babaa'), ('babab'), ('babba'), ('babbb'));
var
  s : string;
  i : integer;
begin
  s := Edit1.Text;
  for i := 1 to length(s) do
  tab1 := tab2;
  Edit2.Text := s;
end;
2
tab1 := tab2;

A co to? Nie możesz do tablicy zadeklarowanej jako stała czegokolwiek wpisywać (tzn. możesz, ale do tego trzeba małych sztuczek, których na pewno nie szukasz);

Zapoznaj się może jeszcze raz z szyfrem Bacona, napisz kod jeszcze raz i wróć jak będziesz miał poważniejszy problem niż braki w wiedzy;

0

Przemyśl sobie taki kod:

const
  Bacon: array ['A'..'Z'] of string = ('aaaaa', 'aaaab', 'aaaba', 'aaabb', 'aabaa', 'aabab', 'aabba',
                                       'aabbb', 'abaaa', 'abaaa', 'abaab', 'ababa', 'ababb', 'abbaa',
                                       'abbab', 'abbba', 'abbbb', 'baaaa', 'baaab', 'baaba', 'baabb',
                                       'baabb', 'babaa', 'babab', 'babba', 'babbb');

  s := '';
  s1 := UpperCase(Edit1.Text);
  for i := 1 to Length(s1) do s := s + Bacon[s1[i]];
0
var Str,Bacon:String;
var I,V,M:Integer;
var Bit:array[Boolean]of String=('a','b');

Str:=UpperCase(Edit1.Text);
Bacon:='';
for I:=1 to Length(Str) do
begin
  V:=Ord(Str[I])-Ord('A');
  M:=16;
  while M>0 do
  begin
    Bacon:=Bacon+Bit[((M)and(V))<>0];
    M:=(M)shr(1);
  end;
end;

To jest zwykły kod binarny, z tym że zamiast '0' mamy 'a' zaś zamiast '1' mamy 'b' więc można każdy znak zwyczajnie wyliczyć. Ten kod będzie jednak nieco wolniejszy niż to co podał @pelsta.

0

zrobilem tak

procedure TForm1.KodujClick(Sender: TObject);
var
  s : string;
begin
  s := Memo1.Text;
  s := uppercase(s);
  S := StringReplace(s, 'A', 'aaaaa', [rfReplaceAll]);
  s := StringReplace(s, 'B', 'aaaab', [rfReplaceAll]);
  s := StringReplace(s, 'C', 'aaaba', [rfReplaceAll]);
  s := StringReplace(s, 'D', 'aaabb', [rfReplaceAll]);
  s := StringReplace(s, 'E', 'aabaa', [rfReplaceAll]);
  s := StringReplace(s, 'F', 'aabab', [rfReplaceAll]);
  s := StringReplace(s, 'G', 'aabba', [rfReplaceAll]);
  s := StringReplace(s, 'H', 'aabbb', [rfReplaceAll]);
  s := StringReplace(s, 'I', 'abaaa', [rfReplaceAll]);
  s := StringReplace(s, 'J', 'abaaa', [rfReplaceAll]);
  s := StringReplace(s, 'K', 'abaab', [rfReplaceAll]);
  s := StringReplace(s, 'L', 'ababa', [rfReplaceAll]);
  s := StringReplace(s, 'M', 'ababb', [rfReplaceAll]);
  s := StringReplace(s, 'N', 'abbaa', [rfReplaceAll]);
  s := StringReplace(s, 'O', 'abbab', [rfReplaceAll]);
  s := StringReplace(s, 'P', 'abbba', [rfReplaceAll]);
  s := StringReplace(s, 'Q', 'abbbb', [rfReplaceAll]);
  s := StringReplace(s, 'R', 'baaaa', [rfReplaceAll]);
  s := StringReplace(s, 'S', 'baaab', [rfReplaceAll]);
  s := StringReplace(s, 'T', 'baaba', [rfReplaceAll]);
  s := StringReplace(s, 'U', 'baabb', [rfReplaceAll]);
  s := StringReplace(s, 'V', 'baabb', [rfReplaceAll]);
  s := StringReplace(s, 'W', 'babaa', [rfReplaceAll]);
  s := StringReplace(s, 'X', 'babab', [rfReplaceAll]);
  s := StringReplace(s, 'Y', 'babba', [rfReplaceAll]);
  s := StringReplace(s, 'Z', 'babbb', [rfReplaceAll]);
  Memo2.Text := s;
end;

Ale dziekuje za odpowiedzi

0
_13th_Dragon napisał(a)

To jest zwykły kod binarny, z tym że zamiast '0' mamy 'a' zaś zamiast '1' mamy 'b' więc można każdy znak zwyczajnie wyliczyć.

Nie do końca jest to kod binarny - wartości liter I/J są te same, tak samo jak U/V, więc zakodowanego ciągu nie da się poprawnie odkodować, jeśli zawiera ww. litery; Poza tym Twój kod da zupełnie inny szyfr niż oryginalny, jeśli zawiera litery dalej w alfabecie niż I;

Kod wszystkich liter opisany jest tutaj;

1 użytkowników online, w tym zalogowanych: 0, gości: 1