Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2022, 18:34   #1
Shazam21
 
Регистрация: 22.12.2021
Сообщений: 9
По умолчанию Сжатие строк

Реализуйте метод сжатия массива на основе счетчика повторяющихся символов.
Например, массив aabcccccaaa должен превратиться в а2b1с5аЗ. Если «сжатый»
массив окажется длиннее исходного, то метод должен вернуть исходный массив.
Shazam21 вне форума Ответить с цитированием
Старый 04.12.2022, 18:40   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

И? Что не получается? Или вы просто задачей для задачнка делитесь?
p51x вне форума Ответить с цитированием
Старый 04.12.2022, 19:04   #3
Shazam21
 
Регистрация: 22.12.2021
Сообщений: 9
По умолчанию

p51x, не получается.
Код:
begin
var (s,s1):=(ReadString('Введите строку: '),'');  
  foreach var n in s do s1+=n+s.ForEach(n).ToString;
  Println(s1);
  if s.Length<s1.Length then Println(s)
end.
Почему он считает все одинаковые символы в строке? Выводит a7a7b1c3c3c3a7a7a7a7a7
Shazam21 вне форума Ответить с цитированием
Старый 05.12.2022, 17:32   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Думаю, что не тот алгоритм реализуете.
Код:
1. Берём символ из строки  ch := s[1].
2. n - счётчик числа символов = 1
3. В цикле по i от 2 до конца строки делаем:
4.     Если следующий символ равен ch: s[i] = ch
5.          n := n + 1
6.     Иначе
            символ ch и n, преобразованное в string, добавляем в новую строку.
            ch := s[i]; n := 1 - новый эталон
7. Вышли из цикла и добавили в новую строку ch и n полученные на последнем шаге
8. Проверяем длину новой строки и выводим сообщение
PS: На Python получилось так:
Код:
def compr(s):
    sout = ''
    ch = s[0]
    n = 1
    for i in range(1, len(s)):
        if ch == s[i]:
            n += 1
        else:
            sout += ch + str(n)
            ch = s[i]
            n = 1
    sout += ch + str(n)
    return sout

s =  'aabcccccaaa'
sout = compr(s)

if len(sout) > len(s):
    print(s)
else:
    print(sout)
Вывод:
s = 'aabcccccaaa' --> a2b1c5a3
Как-то так, ...

Последний раз редактировалось ViktorR; 05.12.2022 в 22:05.
ViktorR вне форума Ответить с цитированием
Старый 06.12.2022, 00:21   #5
Shazam21
 
Регистрация: 22.12.2021
Сообщений: 9
По умолчанию

ViktorR, Ну я в паскале пишу. Зачем в разделе Pascal коды для Питона
Shazam21 вне форума Ответить с цитированием
Старый 06.12.2022, 14:15   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
program aabcccccaaa;

uses SysUtils;

function compr(s: String): String;
var
  i, n: Integer;
  sout: String;
  ch: Char;
begin
  sout := '';
  ch := s[Low(s)];
  n := 1;
  for i := Low(s) + 1 to High(s) do
    if ch = s[i] then
      inc(n)
    else begin
      sout := sout + ch + inttostr(n);
      ch := s[i];
      n := 1;
    end;
  sout := sout + ch + inttostr(n);
  if Length(sout) > Length(s) then sout := s;
  compr := sout;
end;

BEGIN
  WriteLn(compr('aabcccccaaa'));
END.

Последний раз редактировалось macomics; 06.12.2022 в 14:17.
macomics вне форума Ответить с цитированием
Старый 07.12.2022, 15:08   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Цитата:
ViktorR, Ну я в паскале пишу. Зачем в разделе Pascal коды для Питона
Это не вопрос языка, это алгоритм.

Жаль что напрячься не смог, а напряг уважаемого мною форумчанина.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для матрицы из 3 столбцов и 7 строк отпечатать номера тех строк, в которых третий элемент больше суммы двух других элементов строк abramov Помощь студентам 2 03.12.2013 10:15
Сжатие изображений brain22 Мультимедиа в Delphi 1 06.06.2012 20:25
LZW сжатие. SrgGld Общие вопросы C/C++ 1 19.12.2010 21:39
Сжатие картинок MOROZILnic Помощь студентам 0 02.06.2010 20:04
Сжатие строК! prizrak1390 Общие вопросы Delphi 16 02.01.2008 17:15