Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 21.10.2021
Сообщений: 46

Кодирование серий

23.12.2021, 13:22. Показов 1835. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кодирование длин серий (RLE) — алгоритм сжатия данных, заменяющий повторяющиеся символы на один символ и число его повторов. Серией называется последовательность, состоящая из нескольких одинаковых символов (более одного). При кодировании строка одинаковых символов, составляющих серию, заменяется строкой, содержащей сам повторяющийся символ и количество его повторов.
Например, строка AAAABBB будет сжата в строку A4B3, а строка AAAAAAAAAAAAAAABAAAAA — в строку A15BA5.
Вам дана сжатая строка, найдите длину исходной строки. Длина исходной строки не превосходит 1000 символов, все символы исходной строки — заглавные большие буквы латинского алфавита.
Пример ввода:
A15BA5
Пример вывода:
21
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.12.2021, 13:22
Ответы с готовыми решениями:

Удаление серий из массива
Помогите, пожалуйста, с задачкой. Без понятия, как удалять из массива серии. Текст гласит: дано число k и целочисленный массив размера N....

Найти количество содержащихся в файле серий
Дан файл целых чисел. Найти количество содержащихся в нем се- рий (то есть наборов последовательно расположенных одинаковых эле- ...

Вывести массив, содержащий длины всех серий исходного массива
Доброго времени суток. Помогите в решении задачи. Дан целочисленный массив размера N. Назовем серией группу подряд идущих одинаковых...

14
 Аватар для Voronkin
469 / 296 / 166
Регистрация: 18.03.2018
Сообщений: 960
23.12.2021, 14:00
Лучший ответ Сообщение было отмечено PIRAK как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void Main(string[] args)
        {
            string s = "A15BA5";
            int count = 0;
            for (int i = 0; i < s.Length-1; i++)
            {
                if(Char.IsDigit(s[i]))
                {
                    if (Char.IsDigit(s[i+1]))
                    {
                        count += Convert.ToInt32(s[i] - '0') * 10;
                        count += Convert.ToInt32(s[i+1] - '0');
                        i++;
                    }
                    else count += Convert.ToInt32(s[i] - '0');
                }
                if (!Char.IsDigit(s[i])&& !Char.IsDigit(s[i+1])) count++;
            }
            if(Char.IsDigit(s[s.Length-1])) count +=Convert.ToInt32(s[s.Length-1] - '0');
            Console.WriteLine($"В сжатой строке {s} закодировано {count} символ(ов)");
            Console.ReadKey();
        }
Добавлено через 2 минуты
Но этот код подойдет, если символ не повторяется более 99 раз подряд. Если это не так - то код нужно еще немного допилить
1
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
23.12.2021, 14:41
Voronkin, "A15B11" - 27 ?
0
 Аватар для Voronkin
469 / 296 / 166
Регистрация: 18.03.2018
Сообщений: 960
23.12.2021, 15:02
Цитата Сообщение от zhunshun Посмотреть сообщение
"A15B11" - 27 ?
Не учел момент

19 строка:
C#
1
            if(Char.IsDigit(s[s.Length-1])&& !Char.IsDigit(s[s.Length - 2])) count +=Convert.ToInt32(s[s.Length-1] - '0');
1
2810 / 1679 / 885
Регистрация: 14.04.2015
Сообщений: 5,723
23.12.2021, 15:12
Я бы делал этот как-то так. И никаких ограничений на повторение символов, только надо проверки на длину строки, на содержание сделать, но мне лень
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
string s = "A12BC23";
int sum = 1;
for (int i = 0; i < s.Length-1; i++)
{
    if(char.IsLetter(s[i]) && char.IsLetter(s[i + 1]))
    {
        sum++;
    }
}
Regex regex = new Regex(@"\d+");
MatchCollection matches = regex.Matches(s);
if(matches.Count > 0)
{
    foreach (Match match in matches)
    {
        sum += Convert.ToInt32(match.Value);
    }
}
Console.WriteLine(sum);
1
 Аватар для Voronkin
469 / 296 / 166
Регистрация: 18.03.2018
Сообщений: 960
23.12.2021, 16:40
Цитата Сообщение от AndreyVorobey Посмотреть сообщение
Я бы делал этот как-то так.
Цитата Сообщение от AndreyVorobey Посмотреть сообщение
int sum = 1;
тут, наверное 0, Вы получите на 1 больше в результате, проверьте.

Тоже хороший вариант.
0
2810 / 1679 / 885
Регистрация: 14.04.2015
Сообщений: 5,723
23.12.2021, 16:44
Voronkin, все нормально, ожидаем хотя бы 1 букву в строке, иначе не будет рассчитываться, посколько 2 условия
0
 Аватар для Voronkin
469 / 296 / 166
Регистрация: 18.03.2018
Сообщений: 960
23.12.2021, 16:47
AndreyVorobey, Нет сейчас студии под рукой, но вот на вскидку:

C#
1
2
3
4
5
6
7
8
string s = "A12BC23";
int sum = 1;
for (int i = 0; i < s.Length-1; i++)
{
    if(char.IsLetter(s[i]) && char.IsLetter(s[i + 1]))
    {
        sum++;
    }
После выполнения этой части sum будет равна 2, так как условие выполнится один раз.

Дальше Вы выдергиваете из строки числа и добавляете их к сумме, получаем 2+12+23 = 37

а должно быть 12+1+23 = 36

Или я ошибаюсь?
0
2810 / 1679 / 885
Регистрация: 14.04.2015
Сообщений: 5,723
23.12.2021, 16:56
Voronkin, надо переделывать, значит, так как такую строку A12BC23S уже неверно считает, потому что цикл заканчивается до последнего символа. Но мне лень)

Добавлено через 16 секунд
И так с телефона сижу, пишу
0
 Аватар для Voronkin
469 / 296 / 166
Регистрация: 18.03.2018
Сообщений: 960
23.12.2021, 17:29
AndreyVorobey, C Вашего позволения доделаю Ваш вариант:

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
        static void Main(string[] args)
        {
            Console.WriteLine(Schet("A12BC23S"));
            Console.WriteLine(Schet("A12BC23"));
            Console.WriteLine(Schet("A15BA5"));
            Console.WriteLine(Schet("A4B3"));    
            Console.ReadKey();
        }
 
 
        static int Schet (string s)
        {
            string s2 = Regex.Replace(s, @"[^A-Z]+", String.Empty);
            int sum = s2.Length;
 
            Regex regex = new Regex(@"\d+");
            MatchCollection matches = regex.Matches(s);
            if (matches.Count > 0)
            {
                foreach (Match match in matches)
                {
                    sum += Convert.ToInt32(match.Value)-1;
                }
            }
            return sum;
        }
Вот так должно правильно работать
0
2810 / 1679 / 885
Регистрация: 14.04.2015
Сообщений: 5,723
23.12.2021, 17:36
Voronkin, вот тут какой рез? "A4B3"
0
 Аватар для Voronkin
469 / 296 / 166
Регистрация: 18.03.2018
Сообщений: 960
23.12.2021, 17:39
Цитата Сообщение от AndreyVorobey Посмотреть сообщение
вот тут какой рез? "A4B3"
Смотрим: После этого
C#
1
2
       string s2 = Regex.Replace(s, @"[^A-Z]+", String.Empty);
            int sum = s2.Length;
sum = 2 (2 буквы посчитаны)

После этого:
C#
1
2
3
4
foreach (Match match in matches)
                {
                    sum += Convert.ToInt32(match.Value)-1;
                }
Получаем 2 итерации - 4-1 (3) и 3-1 (2)
В итоге - 2+3+2 = 7
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
23.12.2021, 20:48
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
public class Program
{
    public static void Main()
    {
        string m = "A999B521C517";
        List<Score> list = new List<Score>();
        
        for(var i = 0; i < m.Length; i++){
            if(char.IsLetter(m[i]))list.Add(new Score{Simbol = m[i], Count = 1}); 
            for(var j = i + 1; j < m.Length; j++){
                if(char.IsDigit(m[i]) && char.IsDigit(m[j])){
                    list[list.Count - 1].Count =  10 * (int)(m[i]-'0')  + (int)(m[j]-'0');
                    if(char.IsDigit(m[i]) && char.IsDigit(m[j]) && char.IsDigit(m[i-1])){
                        list[list.Count - 1].Count += (int)(m[i-1]-'0')*100;
                    }
                    break;
                }else if(char.IsLetter(m[i]) && char.IsDigit(m[j])){
                    list[list.Count - 1].Simbol = m[i];
                    list[list.Count - 1].Count = (int)(m[j-1]-'0');//-1
                    break;
                }else if(char.IsDigit(m[i]) && char.IsLetter(m[j])){
                    break;
                }
            }
        }
        Console.WriteLine(string.Join(",   ", list));
    }
}
class Score{
    public char Simbol{get;set;}
    public int Count{get;set;}
    public override string ToString(){
        return String.Format("{0} - {1} штук", Simbol, Count);
    }
}
0
 Аватар для Voronkin
469 / 296 / 166
Регистрация: 18.03.2018
Сообщений: 960
24.12.2021, 09:47
zhunshun,

C#
1
string m = "A999BX521C517";
A - 999 штук, B - 40 штук, X - 521 штук, C - 517 штук
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
24.12.2021, 12:41
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
using System;
using System.Collections.Generic;                   
public class Program
{
    public static void Main()
    {
        string m = "A999BX521C517";
        List<Score> list = new List<Score>();
        
        for(var i = 0; i < m.Length; i++){
            if(char.IsLetter(m[i]))list.Add(new Score{Simbol = m[i], Count = 1}); 
            for(var j = i + 1; j < m.Length; j++){
                if(char.IsDigit(m[i]) && char.IsDigit(m[j])){
                    list[list.Count - 1].Count =  10 * (int)(m[i]-'0')  + (int)(m[j]-'0');
                    if(char.IsDigit(m[i]) && char.IsDigit(m[j]) && char.IsDigit(m[i-1])){
                        list[list.Count - 1].Count += (int)(m[i-1]-'0')*100;
                    }
                    break;
                }else if(char.IsDigit(m[i]) && char.IsLetter(m[j])){
                    break;
                }
            }
        }
        Console.WriteLine(string.Join(",   ", list));
    }
}
class Score{
    public char Simbol{get;set;}
    public int Count{get;set;}
    public override string ToString(){
        return String.Format("{0} - {1} штук", Simbol, Count);
    }
}
Нет проблем

Добавлено через 4 минуты
вчера хотел исправить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.12.2021, 12:41
Помогаю со студенческими работами здесь

В массиве найдите количество серий из четверок подряд идущих попарно различных элементов
В массиве найдите количество серий из четверок подряд идущих попарно различных элементов.

Дан целочисленный массив размера N. Вывести строку, содержащую длины всех серий исходного массива
Условие: Дан целочисленный массив размера N. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии — количество этих...

Помехоустойчивое кодирование и т.п
Программирование помехоустойчивых кодеров/декодеров и прочих устройств на C#

Кодирование и парсер
Ниже есть код, но он не правильно отображает текст. Как исправить это? static void Main(string args) { var...

Кодирование строк
Всем добрый день! Есть такая функция: public static string encode(String pText, String pKey) { byte txt =...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru