1

Тема: Random

Як вилучити номер елемента масиву після його використання?
Допоможіть, будь ласка! Є текстовий масив. Треба розтавити символи в ньому довільним порядком і аби жоден елемент не повторювався більше разів, ніж його вже є в тексті. Приклади правильного та неправильного виконання програми я навів у зображенні.

2

Re: Random

Зображення відклеїлося. Текстовий приклад:

input: snigurochka
output: gronsiakhcu - правильно
        sssnnniiigg - ні


input: invincible
output: cbliinvnei - правильно
    nnlvinbven - ні

3

Re: Random

Наприклад можна зробити цикл від першого елемента до останнього
де (псевдо код)

for(i = 0; i < lengthText; i++)// цикл від першого символу до останього
r = random // змінній 'r' задаємо якесь випадкове число
copyText = text[i] // змінній 'copyText' задаємо поточний символ
text[i] = text[r]// заміняємо поточний символ на випадковий
text[r] = copyText// а потім навпаки, випадковий символ міняємо на поточний
Подякували: voland1

4 Востаннє редагувалося voland (10.11.2016 13:37:24)

Re: Random

Дуже проста задача, якщо ви почнете використовувати TList. Вам треба сформувати TList, (TStrings пiдiйде), в якому кожен елемент буде кожною лiтерою з тексту. А потiм ви просто добавляете у вихiдний текст по однiй лiтерi, рандомно, з початкового перелiку i кожен раз видалаете те, що вже вставили. Таким чином, TList.Count буде кожен раз зменшуватись, до нуля.

var
  src : string;
  srcs: TStrings;
  out : string;
  i:integer;
begin
  srcs := TStringList.Create;
  for i:=1 to length(src) do // copy data from array to List
    srcs.Add(src[i]);
  out:='';
  while (srcs.Count>0) do
  begin
     i := random(srcs.Count-1); // Choose the next element from the rest
     out := out + srcs[i];
     srcs.Delete(i); // remove added element from the source List.
  end;
  srcs.Free;
end;

(писав без редактора, тому, вибачаюсь, якщо е якiсь помилки).

5

Re: Random

Не вистачає ще якихось колбеків. Ну, з колбеками ж легше, ніж просто з TList-ом, так?

function shuffle( src : string ) : string; 
var
  r : integer;
begin
  shuffle := '';
  while length(src) > 0 do begin
    r := random( length( src ) + 1 );
    shuffle := shuffle + src[ r ];
    delete( src, r, 1 );
  end;
end;

Оскільки пасквільський string зберігає довжину, можна обійтися без додаткових змінних.

6

Re: Random

delete( src, r, 1 );

Щось новеньке. Я довго празював з Delphi 7, тому, мабуть не бачив 'delete' з боку користування його зi строками. Завжди ранiше користувався двома Copy... для такого. Але, тут Copy буде працювати набагато довше з великим набором даних, тому що це "текст". А "текст" може бути i книгою.