Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 12.10.2021
Сообщений: 38
1

Сжатие строк

31.05.2022, 21:36. Показов 909. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть строка aabcccccaaa. Как сделать так чтобы выводилось не:
abca
2153
а чтобы цифры шли после каждой буквы a2b1c5a3
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var s:string;
    a:array[byte] of byte;
    n,i,j:byte;
begin
writeln('Введите строку с одинаковыми символами рядом');
readln(s);
s:=s+' ';
i:=1;
n:=0;
while i<length(s) do
 begin
  inc(n);
  a[n]:=1;
  j:=i+1;
  while(j<=length(s))and(s[j]=s[i]) do
   begin
    inc(a[n]);
    delete(s,j,1);
   end;
  inc(i);
 end;  
writeln(s);
for i:=1 to n do
write(a[i],' ')
end.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.05.2022, 21:36
Ответы с готовыми решениями:

Сжатие изображения с потерями
Здравствуйте, можете подсказать какие алгоритмы используются при сжатии изображения с потерями?

Сжатие масива / проверка строк
Задача #1 Дан массив(одномерный). Сжать его, путем удоления из него &quot;0&quot;. Задача #2 ...

Сжатие массива
Помогите плиз,а то чет никак не получается,надо сжать массив,удалив из него все элементы.модуль...

Сжатие массива
Сожмите заданный массив A(N) отбрасыванием нулевых элементов. Выполнить вывод на печать полученного...

10
400 / 276 / 119
Регистрация: 09.07.2021
Сообщений: 996
31.05.2022, 22:37 2
Лучший ответ Сообщение было отмечено Pahan228 как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
##
var cur, prev: char;
var count:= 1;
cur:= ReadChar;
prev:= cur;
repeat
  cur:= ReadChar;
  
  if cur = prev then
    count+= 1
  else begin
    write(prev, count);
    count:= 1;
    prev:= cur;
  end;
until cur = #13;
1
400 / 276 / 119
Регистрация: 09.07.2021
Сообщений: 996
01.06.2022, 09:22 3
Ну или с помощью LINQ. Хотя это менее эффективно
Pascal
1
2
3
4
5
##
ReadLnString
.AdjacentGroup
.Select(s-> $'{s[0]}{s.length}')
.Print('');
0
0 / 0 / 0
Регистрация: 12.10.2021
Сообщений: 38
02.06.2022, 18:19  [ТС] 4
А как сделать так, чтобы ещё, если сжатый массив окажется длиннее исходного, то он выводил исходный массив ещё.
Ну как бы если я вожу там целое предложение, он же будет длиннее, чем исходный.
Например: Вожу слово "Привет"
Cжатый будет П1р1и1в1е1т1.
И исходное слово
0
2309 / 1420 / 516
Регистрация: 07.04.2017
Сообщений: 4,723
02.06.2022, 19:03 5
Pascal
1
2
3
4
5
6
7
## ReadString
.AdjacentGroup
.Select(a->
begin
  Result := a[0].ToString;
  if a.Length<>1 then Result += a.Length.ToString;
end).Print('');
Добавлено через 1 минуту
А вообще так и проще и эффективнее:
Pascal
1
2
3
4
5
6
7
##
foreach var a in ReadString.AdjacentGroup do
begin
  Write(a[0]);
  if a.Length<>1 then
    Write(a.Length);
end;
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
02.06.2022, 19:05 6
Pahan228, если единицу не выводить, это позволит заведомо неотрицательные сжатие.

Разуме2шь?
0
0 / 0 / 0
Регистрация: 12.10.2021
Сообщений: 38
02.06.2022, 20:07  [ТС] 7
Да понял. Мне так и надо, чтоб и единицы выводились

Добавлено через 27 минут
А как исходный текст вывести? Если сжатый окажется длиннее?
Pascal
1
2
3
4
5
6
7
8
begin
foreach var a in ReadString.AdjacentGroup do
begin
  Write(a[0]);
  if a.Length<>0 then
    Write(a.Length);
end;
end.
0
2309 / 1420 / 516
Регистрация: 07.04.2017
Сообщений: 4,723
02.06.2022, 22:26 8
Pahan228, зачем вы в мой код вставили begin-end.??? ## это часть кода. Если не компилируется - обновитесь.
И зачем эта проверка <>0? На какой случай она должна срабатывать?

В любом случае, ни один из кодов в этой теме не создаёт новую строку. Вместо этого шифровка каждого символа выводится подряд в одну строку окна вывода. А значит сравнивать исходную строку не с чем.
Но это ограничение (что единицы надо выводить, но только если с ними получается не хуже) выглядит как надуманная вами глупость. Исходное задание, как его дали вам, в студию.
0
259 / 205 / 60
Регистрация: 25.05.2022
Сообщений: 879
03.06.2022, 01:44 9
Не-буквенные символы допустимы? Большие буквы отличаются от маленьких?
Pascal
1
2
3
4
5
6
begin
var (s,s1):=(ReadString('Введите строку: '),'');  
  foreach var v in s do s1+=v+s.Countof(v).ToString;
  Println(s1);
  if s.Length<s1.Length then Println(s)
end.
0
0 / 0 / 0
Регистрация: 12.10.2021
Сообщений: 38
07.06.2022, 00:21  [ТС] 10
реализуйте метод сжатия строки на основе счетчика повторяющихся символов. Например, строка aabcccccaaa должна превратиться в а2b1с5аЗ. Если «сжатая» строка оказывается длиннее исходной, метод должен вернуть исходную строку
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
07.06.2022, 01:08 11
Pahan228, очень своевременно
0
07.06.2022, 01:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2022, 01:08
Помогаю со студенческими работами здесь

Сжатие массива
Люди добрые!!! помогите решить задачку.... Составить блок-схему и программу.... Разработка в среде...

Сжатие программы
есть программный код. Нужно просто пояснить что делает каждая строчка(для контрольной работы). Код...

Сжатие массива
Нужно сжать массив, удалив из него элементы, величина которых находится в интервале ....

Сжатие массива
Помогите пожалуйста. Дан вещественный массив A и натуральное число k≥2. Сжать массив А, удалив из...

Хитрое сжатие
Хитрое сжатие У Сергея есть строка текста, которая состоит из маленьких латинских букв('a' -...

Сжатие списка
Дан список целых чисел. Требуется “сжать” его, переместив все ненулевые элементы в левую часть...

Сжатие массива
Привет всем! Необходимо сжать массив, удалив все отрицательные элементы. Вот есть попытка сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru