Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
6 / 4 / 2
Регистрация: 10.12.2017
Сообщений: 81
.NET 4.x

Упаковка заданной строки

10.04.2022, 15:10. Показов 1809. Ответов 8

Студворк — интернет-сервис помощи студентам
Привет всем! Дана следующая задача: дана текстовая строка вида: “XXXZZRRVBVVVVVWW…” (не содержащая символа @). Упаковать ее, заменив группы одинаковых символов: VVVVV => @5V. Затем после упаковки -- распаковать и получить исходную строку.

Требуется решить задачу, используя только методы и консольный вывод (без классов и структур). По возможности оставьте комментарии к решению. Спасибо!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.04.2022, 15:10
Ответы с готовыми решениями:

Упаковка массива данных float с заданной точностью
Есть интересная задачка, если она не подходит для начинающих пересоздам тему у экспертов. Задача вроде бы типовая на вид, но ничего...

Упаковка строки
Есть следующее задание: Первый наиболее часто встречающийся символ кодируется битом 0. Бит 1 кодирует группу из всех остальных...

Упаковка строки
Доброго времени суток всем. Прошу помощи в решении задачи: Будем рассматривать только строки, состоящие из латинских букв и арабских...

8
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
10.04.2022, 15:46
Pavel_RAM,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string input = "XXXZZRRVBVVVVVWW";
 
// Упаковка
string compressed = Regex.Replace(input, @"(\w)\1+", m =>
{
    string replacement = "@" + m.Groups[1].Value + m.Value.Length;
    //return replacement; // Обычный вариант, который может удлинить строку вместо сжатия
    return replacement.Length < m.Value.Length ? replacement : m.Value; // Оптимизированный вариант
});
 
// Распаковка
string decompressed = Regex.Replace(
    compressed, @"@(\w)(\d+)",
    m => new string(m.Groups[1].Value[0], int.Parse(m.Groups[2].Value))
);
0
6 / 4 / 2
Регистрация: 10.12.2017
Сообщений: 81
09.05.2022, 14:21  [ТС]
Привет всем! Дана следующая задача: дана текстовая строка вида: “XXXZZRRVBVVVVVWW…” (не содержащая символа @). Упаковать ее, заменив группы одинаковых символов: VVVVV => @5V. Затем после упаковки -- распаковать и получить исходную строку.

Требуется решить задачу, используя только методы и консольный вывод (без классов и структур), при помощи простых операторов и конструкций. По возможности оставьте комментарии к решению. Спасибо!
0
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
09.05.2022, 17:07
Pavel_RAM
Посмотри RLE алгоритм кодирования, максимально прост в работе и отвечает требованиям задачи.
Только не особо понял про знак "@"
0
6 / 4 / 2
Регистрация: 10.12.2017
Сообщений: 81
09.05.2022, 17:25  [ТС]
Цитата Сообщение от Leooos Посмотреть сообщение
Посмотри RLE алгоритм кодирования, максимально прост в работе и отвечает требованиям задачи.
Только не особо понял про знак "@"
Можете описать решение этой задачи кодом, пожалуйста?
0
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
09.05.2022, 17:58
Pavel_RAM

Здесь работа с текстом из файла
cut для отрезания расширения файла
Если будут вопросы,как заменить что-либо,спрашивайте

Код не то чтобы крутой какой-то, работал с хабром

C#
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
 public void CompactTxt(string s)
        {
                s = cut(s);
                string q = File.ReadAllText(s + ".txt");
                StringBuilder str1 = new StringBuilder(q);
                StringBuilder str = new StringBuilder();
                char ch;
                int i, k, j;
                for (i = 0; i < str1.Length;) // from 0 to length of unpackedtext
                {
                    ch = str1[i]; // get current char from str1
                    k = 0; //count the number of repeated characters
                    if (i == str1.Length - 1) // If this is the last character
                    {
                        str.Append(ch);
                        break; //exit the loop
                    }
 
                    if (str1[i + 1] == ch) //if current symbol is next
                    {
                        for (j = i; j < str1.Length; j++) //packing the characters
                        {
                            if (str1[j] == ch) //if current symbol is next
                            {
                                if (k == 9) break; //the maximum number of characters packed 9, 
                                                   //or there might be problems with unpacking is not packed numeric characters
                                k++;
 
                            }
                            else break;
                        }
                        i = j;
                    }
                    else if ("0123456789".Contains(ch)) //if this digit and it is not repeated, then it must be escaped,
                                                        //so when unpacking to understand that this is not the number of repeated characters
                    {
                        k = 1;
                        i++;
                    }
                    else i++;
 
 
                    if (k != 0)
                        str.AppendFormat("{0}{1}", k, ch); //forming packed string
                    else
                        str.Append(ch);
 
                }
                File.WriteAllText("2" + s + ".rle", str.ToString());
                          
        }
 
        public string UnpackText(string z)
        {
           z= cut(z);
                string q = File.ReadAllText(z + ".rle");
                StringBuilder str1 = new StringBuilder(q);
                StringBuilder str = new StringBuilder();
 
                char ch;
                char symb = 'a';
                int s = 0;
                int i, j;
                for (i = 0; i < str1.Length;) // from 0 to length of packedtext
                {
                    ch = str1[i]; // get current char from str1
                    s = 0;
                    if ("0123456789".Contains(ch)) //if this digit
                    {
                        if (i == str1.Length - 1) // If this is the last character
                        {
                            symb = ch;
                            s = 1;
                            i++;
                        }
                        else
                        {
                            symb = str1[i + 1]; // get packed symbol
                            i += 2;
                            s = Convert.ToInt32(ch) - 48; //get the number of repetitions
                        }
                    }
                    else
                    {
                        s = 0;
                        i++;
                    }
                    if (s > 0)
                    {
                        for (j = 0; j < s; j++) // write the decompressed symbol
                            str.Append(symb);
                    }
                    else
                        str.Append(ch);
                }
 
                File.WriteAllText("2new" + z + ".txt", str.ToString());
                return str.ToString();
           
 
        }
        public string cut(string s)
        {
            return s = new string(s.TakeWhile(x => x != '.').ToArray());
        }
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
09.05.2022, 21:46
Лучший ответ Сообщение было отмечено Pavel_RAM как решение

Решение

Leooos, думаю вы перемудрили
C#
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
static string Compress(string s)
{
    if (s.Length == 0) return "";
    
    var sbResult = new StringBuilder(s.Length);
    char ch = s[0];
    int count=1;
    for (int i = 1; i < s.Length; i++)
    {
        if (s[i] == ch)
        {
            count++;
        }
        else
        {
            Append(sbResult, ch, count);
            count = 1;
        }
        
        ch = s[i];
    }
    Append(sbResult, ch, count);
    
    return sbResult.ToString();
}
 
static void Append(StringBuilder sb, char ch, int count)
{
    int replacementLength = 2 + (1 + (int)Math.Log10(count));
    if (replacementLength < count)
    {
        string replacement = $"@{ch}{count}";
        sb.Append(replacement);
    }
    else
    {
        sb.Append(ch, count);
    }
}
 
static string Decompress(string s)
{
    var sbResult = new StringBuilder(s.Length);
    for (int i = 0; i < s.Length; i++)
    {
        if (s[i] != '@')
        {
            sbResult.Append(s[i]);
            continue;
        }
        
        char ch = s[i+1];
        int begin = i+2;
        int end = begin;
        while (end<s.Length && char.IsDigit(s[end]))
        {
            end++;
        }
        
        int count = int.Parse(s.Substring(begin, end-begin));
        sbResult.Append(new string(ch, count));
        
        i = end-1;
    }
    
    return sbResult.ToString();
}
Pavel_RAM, метод Main с вводом, выводом добавьте самостоятельно.
1
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
09.05.2022, 23:32
OwenGlendower
Вероятно, вы правы
Так сказать алгоритм оформил, а дальше уже не думал, как можно улучшить
0
6 / 4 / 2
Регистрация: 10.12.2017
Сообщений: 81
10.05.2022, 10:51  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Pavel_RAM, метод Main с вводом, выводом добавьте самостоятельно.
Благодарю Вас за решение этой задачи!

Добавлено через 31 секунду
Цитата Сообщение от Leooos Посмотреть сообщение
Pavel_RAM
Здесь работа с текстом из файла
cut для отрезания расширения файла
Если будут вопросы,как заменить что-либо,спрашивайте
Код не то чтобы крутой какой-то, работал с хабром
В этом вся суть, что он не должен быть крутым =) Спасибо за предоставленное решение!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.05.2022, 10:51
Помогаю со студенческими работами здесь

'Упаковка' и 'Распаковка' строки
Нужно составить две функции которые будут упаковывать\распаковывать строку Упаковка 'AAAAAAAABBBBBBBBCCCCDG' = '8A8B4CDG' Распаковка...

Упаковка строки с шестнадцатиричными значениями
Доброго времени суток! Дано вот такое задание: Упакованная строка, содержащая символьное представление целых чисел. Все символы строки,...

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

Функция выделяет из заданной строки подстроку заданной длины, начиная с заданной буквы
Функция выделяет из заданной строки подстроку заданной длины, начиная с заданной буквы (символа). Если такого символа нет, то выводит...

Подсчитать количество вхождений заданной буквы в последнем слове заданной строки
помогите пожалуйста: Дана строка. Подсчитать количество вхождений заданной буквы в последнем её слове. На паскале, если что я работаю на...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru