Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Алгоритм] Алгоритм замены символов


Автор: kovalenko123 31.1.2011, 21:46
Всем привет! Не знаю в эту категорию надо ли писать вроде на первый взгляд задача простая и решается с помощью 
Код

if

 но практика показала что не все так просто. Случайный образом генерировать 6 переменныx и сравнивать их при этом использовать систему заменяющих чисел то есть число 1 к примеру заменяет 2 вот код кот сразу пришел на ум после показал преподу он сказал что это фигня и к тому же работать не будет хотя я тестировал и все работало...  сначала сделал для 3 чисел думал сейчас с один норм сделаю потом просто прокопирую код на все случаи потом 4 вот тут начались проблемы...

вот коды
для 3 чисел
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  s1, s2, s3, RS, i: integer;
begin
  memo1.Clear;
  RS := 1;//replace
  Randomize;
  s1 := random(3);
  s2 := random(3);
  s3 := random(3);

  if ((s1 = RS) or (s2 = RS) or (s3 = RS)) then
    if (
      ((s1 = RS) or (s1 = s2) or (s2 = s3) or (s1 = s3)) and
      ((s2 = RS) or (s1 = s2) or (s2 = s3) or (s1 = s3)) and
      ((s3 = RS) or (s1 = s2) or (s2 = s3) or (s1 = s3))
      ) then begin
      Memo3.Lines.Add(inttostr(s1) + ' ' + inttostr(s2) + ' ' + inttostr(s3) + '->> 3 символа');
      Memo3.Lines.Add('');
    end else begin
      Memo3.Lines.Add(inttostr(s1) + ' ' + inttostr(s2) + ' ' + inttostr(s3) + '->> Совпадений нет');
      Memo3.Lines.Add('');
    end;
  memo1.Lines.Add(inttostr(s1));
  memo1.Lines.Add(inttostr(s2));
  memo1.Lines.Add(inttostr(s3));
 // end;
end;



вот для 4 чисел он ужасный  я думал щас этот сделаю все остальные по такому же принципу но нет ..
он рабочий но препод сказал что нет 
Код

procedure TForm1.Button2Click(Sender: TObject);
var
  s1, s2, s3, s4, RS, i: integer;
begin
  memo1.Clear;
  RS := 1;//replace
 // for i := 0 to 20 do begin
  Randomize;
  s1 := random(3);
  s2 := random(3);
  s3 := random(3);
  s4 := random(3);

  if ((s1 = RS) or (s2 = RS) or (s3 = RS) or (s4 = RS)) then
    if (
      ((s1 = RS) or (s1 = s2) or (s1 = s3) or (s1 = s4) or ((s2 = RS) and (s3 = RS) and (s4 = RS))) and
      ((s2 = RS) or (s2 = s1) or (s2 = s3) or (s2 = s4) or ((s1 = RS) and (s3 = RS) and (s4 = RS))) and
      ((s3 = RS) or (s3 = s1) or (s3 = s2) or (s3 = s4) or ((s1 = RS) and (s2 = RS) and (s4 = RS))) and
      ((s4 = RS) or (s4 = s1) or (s4 = s2) or (s4 = s3) or ((s1 = RS) and (s2 = RS) and (s4 = RS)))
      )
      then begin
      Memo3.Lines.Add(inttostr(s1) + ' ' + inttostr(s2) + ' ' + inttostr(s3) + ' ' + inttostr(s4) + '->> 4 символа');
      Memo3.Lines.Add('');
      Label2.Visible := true;
      Label1.Visible := false;
    end else begin
      Memo3.Lines.Add(inttostr(s1) + ' ' + inttostr(s2) + ' ' + inttostr(s3) + ' ' + inttostr(s4) + '->> Совпадений нет');
      Memo3.Lines.Add('');
      Label1.Visible := true;
      Label2.Visible := false;
    end;


Вот для 5 чисел он ужасный и неработает 
Код

procedure TForm1.Button6Click(Sender: TObject);
var
  s1, s2, s3, s4, s5, RS, i: integer;
begin
  memo1.Clear;
  RS := 1;//replace
 // for i := 0 to 20 do begin
  Randomize;
  s1 := random(3);
  s2 := random(3);
  s3 := random(3);
  s4 := random(3);
  s5 := random(3);
  if ((s1 = RS) or (s2 = RS) or (s3 = RS) or (s4 = RS) or (s5 = RS)) then
    if (
      ((s1 = Rs) or (s1 = s2) or (s1 = s3) or (s1 = s4) or (s1 = s5) and ((s2 = RS) or (s3 = RS) or (s4 = RS) or (s5 = RS))) and
      ((s2 = RS) or (s2 = s1) or (s2 = s3) or (s2 = s4) or (s4 = s5) and ((s1 = RS) or (s3 = RS) or (s4 = RS) or (s5 = RS))) and
      ((s3 = RS) or (s3 = s1) or (s3 = s2) or (s3 = s4) or (s3 = s5) and ((s1 = RS) or (s2 = RS) or (s4 = RS) or (s5 = RS))) and
      ((s4 = RS) or (s4 = s1) or (s4 = s2) or (s4 = s3) or (s4 = s5) and ((s1 = RS) or (s2 = RS) or (s3 = RS) or (s5 = RS))) and
      ((s5 = RS) or (s5 = s1) or (s5 = s2) or (s5 = s3) or (s5 = s4) and ((s1 = RS) or (s2 = RS) or (s3 = RS) or (s4 = RS)))
      )
      then begin
      Memo3.Lines.Add(inttostr(s1) + ' ' + inttostr(s2) + ' ' + inttostr(s3) + ' ' + inttostr(s4) + ' ' + inttostr(s5) + '->> 5 символов');
      Memo3.Lines.Add('');
      Label2.Visible := true;
      Label1.Visible := false;
    end else begin
      Memo3.Lines.Add(inttostr(s1) + ' ' + inttostr(s2) + ' ' + inttostr(s3) + ' ' + inttostr(s4) + ' ' + inttostr(s5) + '->> Совпадений нет');
      Memo3.Lines.Add('');
      Label1.Visible := true;
      Label2.Visible := false;
    end;


для 6 пока не делал потому как еще с 5 не закончил ( Кто нить помогите плиз может быть какой то другой есть способ 

Автор: skyboy 31.1.2011, 22:55
Цитата(kovalenko123 @  31.1.2011,  20:46 Найти цитируемый пост)
лучайный образом генерировать 6 переменныx и сравнивать их при этом использовать систему заменяющих чисел то есть число 1 к примеру заменяет 2

че заменить-то? все определенные цифры в числе?
даже по коду мне лично мало что понятно.

Автор: _Y_ 31.1.2011, 23:31
Я не опознал что за язык у Вас. Я бы сделал карту замены и каждое вновь сгенерированное число использовал бы в качестве ключа этой карты:
1. Создаем карту замены, в которой каждому ключу соответствует значение. Ключ - то что надо заменить, значение - чем заменять.
2. Генерируем величину S.
3. Проверяем имеется ли у карты ключ  S. Если нет, идем к пункту 5.
4. Заменяем величину S значением, полученным из карты и соответствующим данному ключу.
5. Используем полученную величину так, как хотим.
6. Проверяем не надоело ли генерировать величины. Если нет, идем к пункту 2.
7. Сдаем работу, получаем пряник.


Автор: DarkProg 1.2.2011, 00:20
Цитата(_Y_ @  31.1.2011,  23:31 Найти цитируемый пост)
Я не опознал что за язык у Вас.

Это Delphi ;)


Автор: kovalenko123 1.2.2011, 06:25
skyboy, 
Цитата

че заменить-то? все определенные цифры в числе?

генерируем 5 чисел от 1 до 3 возьмем число 1 как число которое заменяет другие одинаковые числа у меня это переменная RS

вот сгенерировалось 1 2 2 2 2 это тоже самое что  2 2 2 2 2 тоесть число 1 заменило 2 и вот оно может выпасть в любом месте в середине в конце . мой алгоритм такой

Код

RS := 1;//replace
  Randomize;
  s1 := random(3);
  s2 := random(3);
  s3 := random(3);
  s4 := random(3);
  s5 := random(3);
 if ((s1 = RS) or (s2 = RS) or (s3 = RS) or (s4 = RS) or (s5 = RS)) then
    if (

После генерации смотрю есть ли где нибудь символ замены 
В задании сказано что те случаи когда символ замены не выпадет, в мемо заполнять не надо поэтому нужен такое отфильтровывающий код

в общем если по простому сказать : если числа одинаковы и в них есть заменяющий символ то надо записывать в мемо







Автор: Akina 1.2.2011, 08:55
 smile 
Цитата(skyboy @  31.1.2011,  23:55 Найти цитируемый пост)
даже по коду мне лично мало что понятно. 

А я думал - это у меня к вечеру мозг совсем склеился... ан нет!


kovalenko123, до сих пор совершенно непонятно, что же нужно сделать...
Давайте так - вот то самое задание, которое выдано преподавателем, скопируйте сюда символ в символ, без каких-либо изменений и дополнений.

Автор: kovalenko123 1.2.2011, 10:06
Используя генерацию случайных чисел разработать алгоритм сравнения этих чисел с последующей заменой. 
То есть Введя универсальное число которое заменяет совпавшие числа. 
По памяти восстановил оно сейчас на квартире лежит только вечером смогу добратся.

Он мне по простому объяснил имея 6 рандомных переменных от 1 до 3,  сравнивать их они должны быть одинаковыми при этом если выпадет символ замены к примеру 1 то все равно записывать в мемо а если нет то не записывать 

Примеры 

выпало 0 2 2 2 1 1 Записывать не будем потому что 0 есть , еслибы его небыло а была 1ница то записали в мемо бы

1 0 1 0 1 0 все совпали 0 и заменяющий символ 1 пишем в мемо

2 0 0 2 2 0 вообще ничего не делаем тут нет заменяющего символа 

сравнивать числа в общем используя заменяющие символы

Добавлено через 2 минуты и 39 секунд
Еще такой вариант пришел в голову записывать сгенерированные числа в статичный массив выкидывать от туда заменяющий символ и смотреть совпадают ли они только как реализовать выкидывание из массива не знаю

Автор: Akina 1.2.2011, 10:23
Ничего не понял всё равно... но пока получается так - если после удаления элементов, равных "замещающему числу", все оставшиеся элементы равны, и было хотя бы одно удаление - вывести исходную последовательность, иначе ничего не выводить.

Автор: kovalenko123 1.2.2011, 10:45
Цитата

но пока получается так - если после удаления элементов, равных "замещающему числу", все оставшиеся элементы равны, и было хотя бы одно удаление - вывести исходную последовательность, иначе ничего не выводить. 


Ну это как вариант только что пришел без ифоф ну вообще давайте еще раз распишу я наверно не так объясняю опыта в этих делах нет 

Числовая последовательность генерируется из случайных чисел от 1 до 3
Код

random(3);

Потом она сравнивается эта последовательность чтобы 1 число было равно 2 ,2 число равно 3тьему, 3тье 4ртому и 4ртое пятому.
Если выпал на каком то числе к примеру на втором заменяющее число тут оно равно 1 то все считать что оно равно всем остальным и в итоге получим (выпали 0)

0 1 0 0 0 

Это одно и тоже что и 
0 0 0 0 0  


Автор: Akina 1.2.2011, 10:53
Ну и в чём проблема тогда? 
Бежишь по последовательности (или по массиву) и подсчитываешь количество элементов с каждым из значений. Если в результате для одного из не-заменителей получен ноль - последовательность тебя устраивает. Иначе нет.

Автор: kovalenko123 1.2.2011, 11:24
А вообще как Вам такое решение задачи? 

вот начал но по прежнему не знаю как сделать подобную проверку
Код


    arraytest: array[1..5] of integer;

procedure TForm1.Button1Click(Sender: TObject);
 var
 i:integer;
begin
 Randomize;
  arraytest[1]:=  Random(3);
  arraytest[2]:=  Random(3);
  arraytest[3]:=  Random(3);
  arraytest[4]:=  Random(3);
  arraytest[5]:=  Random(3);

  for i:=1 to 5 do begin

  end;

end;


Автор: kovalenko123 1.2.2011, 13:32
Код

procedure TForm1.Button1Click(Sender: TObject);
 var
 i:integer;
 bool:boolean;
begin
 Randomize;
  arraytest[1]:=  Random(3);
  arraytest[2]:=  Random(3);
  arraytest[3]:=  Random(3);
  arraytest[4]:=  Random(3);
  arraytest[5]:=  Random(3);

  for i:=1 to 5 do begin
    if ((arraytest[i] = arraytest[i+1]) or (arraytest[i]=1)) then
    bool:=true
    else bool:=false;
    end;

Никак не могу додумать что же тут написать грамотного

   memo1.Lines.Add(inttostr(arraytest[1]));
   memo1.Lines.Add(inttostr(arraytest[2]));
   memo1.Lines.Add(inttostr(arraytest[3]));
   memo1.Lines.Add(inttostr(arraytest[4]));
   memo1.Lines.Add(inttostr(arraytest[5]));

   Edit1.Text:= BoolToStr(bool);

 end;

Автор: Akina 1.2.2011, 14:04
Посмотри на алголисте сортировку подсчётом. Возьми только прямой ход. А потом тупо проверяй полученный массив количеств.

Автор: kovalenko123 1.2.2011, 15:12
НЕ разобрался я с той сортировкой вот такую нашел 
Код

procedure TForm1.Button3Click(Sender: TObject);
const
  SIZE = 5;
var

  k: integer;
  i: integer;
  changed: boolean;
  buf: integer;
  t:integer;
begin
  for i := 1 to SIZE do begin
    t:= Random(3);
    if (t = 1) then continue;
     a[i] := t;
    memo1.Lines.Add(inttostr(a[i]));
    end;
  repeat
    Changed := FALSE;
    for k := 1 to Length(a) - 1 do
      if a[k] > a[k + 1] then
      begin
        buf := a[k]; a[k] := a[k + 1]; a[k + 1] := buf;
        changed := TRUE;
      end;
    for i := 1 to Length(a) do
    memo2.Lines.Add(inttostr(a[i]));
  until
    not changed;
end;


Она упорядочивает символы типо ASC ) от 0 до ... вот потом подумал упорядочу да не буду записывать символ замены тоесть 1 и сравню все  ключи массива но чтото и это не получается

Автор: kovalenko123 2.2.2011, 09:25
Ребята натолкните более детально на мысль плиз

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)