Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/37: Рейтинг темы: голосов - 37, средняя оценка - 4.73
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
.NET 4.x

Быстрейший способ отделить число от букв

13.09.2024, 13:11. Показов 9609. Ответов 117
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Есть строки такого вида:
Code
1
2
3
4
1.5224V
1.5225mV
1.526 mV
1.527 V
Соответственно, число - это значение (всегда double!), а буквы - ед. измерения.
Необходимо наиболее быстро распарсить их.

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

Сначала первый вариант (без пробела) я парсил так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if (RegexPattern.IsFiltered(message))
{
    const string numbers = "0123456789.";
    var numberBuilder = new StringBuilder();
    var unitBuilder = new StringBuilder();
 
    foreach (char c in message)
    {
        if (numbers.IndexOf(c) > -1)
            numberBuilder.Append(c);
        else
            unitBuilder.Append(c);
    }
 
    double.TryParse(numberBuilder.ToString(), out double value);
    rawVoltage = value;
    Mv = unitBuilder.ToString() == "mV";
}
а второй просто Regex'ом: @"^\d+\.\d+\s{1}m?V$"

Затем сделал "общий" Regex для обоих этих случаев: @"^\d+\.\d+\s?m?V$"
и теперь их значения достаю вот так:
C#
1
2
3
4
5
6
if (IsVoltage(s))
{
    Console.Write($"Voltage: {RegexVoltageValue().Match(s).Value}\t");
    Console.Write($"Unit: {RegexUnitValue().Match(s).Value}");
    Console.WriteLine();
}
где сами регулярки такие:
C#
1
2
3
4
5
[GeneratedRegex(@"\d+\.\d+")]
private static partial Regex RegexVoltageValue();
 
[GeneratedRegex(@"(m?V)$")]
private static partial Regex RegexUnitValue();
По скорости работы StringBuilder VS Regex, вроде бы, немного выигрывает Regex, однако где-то я читал, что они медленнее, чем выборка нужного из цикла..
На простом коде сложно определить, т.к. разница незначительна, но вдруг случится "что-то", что намного затормозит этот процесс с Regex'ом?
Т.е. не поменял ли я шило на мыло?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.09.2024, 13:11
Ответы с готовыми решениями:

Отделить цифры от букв и найти сумму цифр
Есть массив,N размера.В массиве присутствуют буквы и цифры.Нужно отделить цифры от букв и найти сумму цифр: отделяем буквы от цифр: ...

Автомобильные номера состоят из 1,2, или 3 букв и 4 цифр. используется 30 букв, найти число таких букв
Автомобильные номера состоят из 1,2, или 3 букв и 4 цифр. используется 30 букв, найти число таких букв. помогите решить, или объясните...

отделить крупное число от мелкого
например ввожу 4530 результат 4500 и 30 3456 3400 и 56 и т. д.

117
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
13.09.2024, 19:24  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от mashmed135 Посмотреть сообщение
на шарпе.
это не скриптовый язык, на всякий случай...
Цитата Сообщение от mashmed135 Посмотреть сообщение
ты ничего на паре строк не замериешь в принципе
с этим согласен, тут лишь, скажем так, определение "на глаз". Тем не менее, замеры на сколь-угодно больших входных данных не дадут объективной оценки в срезе при этих же данных, но поступающих частично.
Иными словами: если метод уже "приготовился" что-то делать, то он "на горячую" будет делать это быстро.
А если этот же метод по каждой строке вызывать и инициировать снова, то будут совсем другие результаты.
Цитата Сообщение от mashmed135 Посмотреть сообщение
если бэнч адекватный надумаешь писать
да, надо бы написать. Для полноты картины.
Но я уже на реальной установке проверил - VB-шный метод Conversion.Val(s) выстегивает все предыдущие. 0мс в среднем из 1к переданных строк..
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
13.09.2024, 19:46
Цитата Сообщение от wizard41 Посмотреть сообщение
определение "на глаз"
ну это слабо работает.
Цитата Сообщение от wizard41 Посмотреть сообщение
Тем не менее, замеры на сколь-угодно больших входных данных не дадут объективной оценки в срезе при этих же данных, но поступающих частично.
дадут. разве что у тебя там прям сильно редкий случай, когда нужна минимальная задержка даже в ущерб остальному, в том числе трупуту - 99.9% что это не тот случай. но даже при измерении задержки бэнчить надо повторами(многократными) - иначе ничего понять попросту невозможно и начинается гадание "на глаз". смысл сравнения уже потерялся, ведь гадать можно и не запуская даже на паре значений.
Цитата Сообщение от wizard41 Посмотреть сообщение
VB-шный метод Conversion.Val(s) выстегивает все предыдущие
ну да - потому как это один вызов в сишный код стдлибы. я писал об этом выше. попробуй победить на шарпе - маловероятно, но мало ли. я загуглил один раз - оно мне выдало базворд "native aot". не вчитывался, что там и почём, но если это то, о чём я подумал(и ежели язык не скриптовый) - должно быть можно догнать/сравняться. это как минимум.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
13.09.2024, 19:54  [ТС]
Цитата Сообщение от mashmed135 Посмотреть сообщение
попробуй победить на шарпе - маловероятно, но мало ли
хм... Но тут как раз, как бы "победил" VB. И я пока не знаю, можно ли это как-то превзойти именно шарпом.
Переходить на тесты в тиках ЦП смысла особого нет, т.к. 0,1,2...10 мс уже отличный результат.
Вообще, я сперва решал вопрос Regex VS StringBuilder, и как бы ответил сам себе - они практически равны (оказались).

Добавлено через 1 минуту
mashmed135, еще стоит учитывать то, что само определение входного шаблона вычитывает шарповый Regex. А на это тоже время тратится, хоть и довольно малое.
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
13.09.2024, 20:09
Цитата Сообщение от wizard41 Посмотреть сообщение
хм... Но тут как раз, как бы "победил" VB. И я пока не знаю, можно ли это как-то превзойти именно шарпом.
не, от vb там только вызов, всю работу делает рантайм на сишке. у тебя в шарпе вроде как ровно такой же должен быть. разве что каких-то биндингов не будет - но это сомнительно.
Цитата Сообщение от wizard41 Посмотреть сообщение
Переходить на тесты в тиках ЦП смысла особого нет, т.к. 0,1,2...10 мс уже отличный результат.
ну тут уже как знаешь. как нормально забэнчить я обзорно рассказал - дальше дело твоё.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
13.09.2024, 20:09  [ТС]
mashmed135, вместе со всеми определениями -> 7мс стабильно.

Это достаточно приемлемо для текущих целей.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
13.09.2024, 20:14  [ТС]
Ха, на реальном процессе, все же, мой первый примененный метод (StringBuilder):

Ну и кому и где верить?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
13.09.2024, 20:24  [ТС]
StringBuilder vs VB:
Название: stringbuilder.png
Просмотров: 156

Размер: 2.0 Кб Название: vba.png
Просмотров: 159

Размер: 1.8 Кб
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
13.09.2024, 20:25  [ТС]
А в тестовом проекте наоборот... Причем этот net4.8, а тестовый 8.0
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
14.09.2024, 00:08  [ТС]

что, в общем то и было видно ранее... StringBuilder лидирует.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
14.09.2024, 00:10  [ТС]
Regex, даже компилированный - позади всех.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
14.09.2024, 10:04
Лучший ответ Сообщение было отмечено wizard41 как решение

Решение

Цитата Сообщение от wizard41 Посмотреть сообщение
Необходимо наиболее быстро распарсить их.
Как я понял этот код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void stringBuilder(string s)
{
    const string numbers = "0123456789.";
    var numberBuilder = new StringBuilder();
    var unitBuilder = new StringBuilder();
 
    foreach (char c in s)
    {
        if (numbers.IndexOf(c) > -1)
            numberBuilder.Append(c);
        else
            unitBuilder.Append(c);
    }
 
    Console.Write(double.Parse(numberBuilder.ToString()) + "\t");
    Console.Write(unitBuilder.ToString());
    Console.WriteLine();
}
вам нужна строка с единицей измерения и double значение.

Получается вот так:
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
using System;
using System.Diagnostics;
using System.Text;
 
string[] msg =
{
    "1,5224V", "1,5225mV", "1,526 mV", "1,527 V"
};
Stopwatch sw = Stopwatch.StartNew();
 
sw.Restart();
foreach (string s in msg)
{
    string[] volts_units = { "V", "mV" };
    int selected_unit = 0; // здесь выбираете то значение которое бывает чаще всего и меняете следующий if
    int string_pos = 2;
    if ((int)s[^string_pos] == 109)
    {
        selected_unit = 1; // так как вольты у нас есть всегда, то проверяем на милливольты
        string_pos++;
    }
    //while ((int)s[^string_pos] == 32) string_pos++; // убираем пробелы, если double.Parse() сам умеет их чистить, то строку можно выкинуть
 
    Console.WriteLine("{0}\t{1}", double.Parse(s.Substring(0, s.Length - string_pos + 1)), volts_units[selected_unit]);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
В итоге весь парсинг, это проверка на наличие латинской буквы "m" во второй позиции справа и передача парсеру double куска строки. Индекс куска строка всегда или на 1 или на 2 меньше размера строки.
Я проверил, double.Parse() сам кушает пробелы, так что selected_unit и string_pos можно убрать и сделать только одну переменную, которая и позицию в строке укажет и индекс в массиве volts_units:
C#
1
2
3
4
5
6
7
8
foreach (string s in msg)
{
    string[] volts_units = { "V", "mV" };
    int selected_unit = 0;
    if ((int)s[^(selected_unit + 2)] == 109) selected_unit++;
 
    Console.WriteLine("{0}\t{1}", double.Parse(s.Substring(0, s.Length - (selected_unit + 2) + 1)), volts_units[selected_unit]);
}
Скобки можно раскрыть и получим
C#
1
s.Length - selected_unit - 1
Да, еще, парсер дабла не кушал точки, я исправил на запятые, если у вас в исходных данных точки, то нужно посмотреть как там завязано на национальных параметрах всё и переключить в программе ну или придется while искать точку и клеить строку. Я в этом никогда не копался, надеюсь без меня.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
14.09.2024, 12:07  [ТС]
belalugoci, ни чего так:


Benchmark
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
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System.Text;
using benchtest;
 
 
BenchmarkRunner.Run<BMTest>();
Console.ReadLine();
 
 
namespace benchtest
{
    public class BMTest
    {
        readonly static string[] source = { "1.5224V", "1.5225mV", "1.526 mV", "1.527 V" };
        const string numbers = "0123456789.";
 
        [Benchmark]
        public (double v, string u)[] StringBuilderMethod()
        {
            (double v, string u)[] result = new (double v, string u)[source.Length];
 
            int i = 0;
            foreach (string s in source)
            {
                var numberBuilder = new StringBuilder();
                var unitBuilder = new StringBuilder();
 
                foreach (char c in s)
                {
                    if (numbers.IndexOf(c) > -1)
                        numberBuilder.Append(c);
                    else
                        unitBuilder.Append(c);
                }
                result[i++] = (double.Parse(numberBuilder.ToString()), unitBuilder.ToString());
            }
            return result;
        }
 
        [Benchmark]
        public (double v, string u)[] belalugociMethod()
        {
            (double v, string u)[] result = new (double v, string u)[source.Length];
 
            string[] volts_units = { "V", "mV" };
 
            int i = 0;
            foreach (string s in source)
            {
                int selected_unit = 0;
                if (s[^(selected_unit + 2)] == 109)
                    selected_unit++;
                result[i++] = (double.Parse(s.Substring(0, s.Length - (selected_unit + 2) + 1)), volts_units[selected_unit]);
            }
            return result;
        }
    }
}
0
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
14.09.2024, 13:06
Цитата Сообщение от wizard41 Посмотреть сообщение
golosalex, кстати, по поводу HashSet - он для отсеивания дублей хорош, а в данном случае его примение под вопросом. Например, на строке 1.99 V он вторую девятку "забракует" и она не войдет в результат.
По поводу статистики на больших входных коллекциях - ну тоже не особый вариант, ведь здесь важна именно единичная обработка, т.к. входные данные приходят не кучей, а по отдельности. Т.е. важно время обработки одной строчки.
имел ввиду что хешсет будет уже наполнен всеми вариантами цифр, а проверять что очередной символ есть в хешсете. тогда будет не линейный поиск по стоке символов а константный в хешсет
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
14.09.2024, 13:29  [ТС]
Цитата Сообщение от golosalex Посмотреть сообщение
а проверять что очередной символ есть в хешсете
А, ну если так.
Правда особого сокращения времени не произошло: все так же ~500 нс.

Добавлено через 14 минут
я б даже сказал - разницы нет. Исходную строку все равно перебирать посимвольно. Ну, в хэшсете поиск немногим быстрее, конечно.
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
14.09.2024, 14:09
Лучший ответ Сообщение было отмечено wizard41 как решение

Решение

wizard41, на своем железе проверьте вот этот метод:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(double Value, string Unit) ParseToPair(ReadOnlySpan<char> message)
    {
        int errorCounter = 0;
        int vlen = 0;
        for (int i = 0; i < message.Length; i++)
        {
            if (!char.IsDigit(message[i]))
                errorCounter++;
 
            if (errorCounter == 2)
            {
                vlen = i;
                break;
            }
        }
 
        return (double.Parse(message[..vlen]), new string(message[vlen..].Trim()));
    }
На моем выдает вот такое:
Bash
1
2
3
4
5
6
| Method        | message  | Mean     | Error    | StdDev   |
|-------------- |--------- |---------:|---------:|---------:|
| ParsingOfPair | 1.5224V  | 68.64 ns | 0.716 ns | 0.670 ns |
| ParsingOfPair | 1.5225mV | 76.33 ns | 0.458 ns | 0.383 ns |
| ParsingOfPair | 1.526 mV | 68.93 ns | 0.481 ns | 0.450 ns |
| ParsingOfPair | 1.527 V  | 68.47 ns | 0.774 ns | 0.686 ns |
Добавлено через 13 минут
Можно пропускать пробел (если он есть) и избавиться от метода Trim().
Хотя возможно он инлайнится, кто знает.

Добавлено через 1 минуту
Интуитивно кажется, что на части инструкций можно сэкономить, избавившись от Trim().
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
14.09.2024, 14:17  [ТС]
IamRain, ну по одной отдельной строке время в среднем такое же.
У меня то идет "прогон" по всему массиву, а там 4 входных строки. Надо переписать немного код бенча..

Добавлено через 1 минуту
Цитата Сообщение от IamRain Посмотреть сообщение
избавившись от Trim()
Trim тут для того, чтобы в VM ед. изм. шла без лишних пробелов. А так, по факту он погоды конечно не делает.

Добавлено через 5 минут
IamRain, если брать на круг, то:
Code
1
2
3
4
| Method              | Mean     | Error   | StdDev  |
|-------------------- |---------:|--------:|--------:|
| StringBuilderMethod | 593.5 ns | 6.28 ns | 5.88 ns |
| ParseToPairTest     | 331.4 ns | 0.78 ns | 0.73 ns |
Добавлено через 47 секунд
Результаты улучшились.. )
Явно за счет ReadOnlySpan<char>
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
14.09.2024, 14:30
Вот эти два:
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
public (double Value, string Unit) ParseToPair(ReadOnlySpan<char> message)
    {
        var errorCounter = 0;
        var vlen = 0;
        for (var i = 0; i < message.Length; i++)
        {
            if (!char.IsDigit(message[i]))
                errorCounter++;
 
            if (errorCounter == 2)
            {
                vlen = i;
                break;
            }
        }
 
        return (double.Parse(message[..vlen]), new string(message[vlen..].Trim()));
    }
    
    
    public (double Value, string Unit) ParseToPair2(ReadOnlySpan<char> message)
    {
        var errorCounter = 0;
        var vlen = 0;
        var unitIndex = 0;
        for (var i = 0; i < message.Length; i++)
        {
            if (!char.IsDigit(message[i]))
                errorCounter++;
 
            if (errorCounter == 2)
            {
                if (char.IsWhiteSpace(message[i]))
                    unitIndex = i + 1;
                else unitIndex = i;
                
                vlen = i;
                break;
            }
        }
        return (double.Parse(message[..vlen]), new string(message[unitIndex..]));
    }
Дают такой результат (перебор массива из 4-х элементов):
Bash
1
2
3
4
| Method         | Mean     | Error   | StdDev  |
|--------------- |---------:|--------:|--------:|
| ParsingOfPair  | 335.2 ns | 1.81 ns | 1.60 ns |
| ParsingOfPair2 | 338.7 ns | 2.04 ns | 1.91 ns |
Добавлено через 3 минуты
У belalugoci пока быстрее всего.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
14.09.2024, 14:34  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
У belalugoci пока быстрее всего.
Да.
Цитата Сообщение от IamRain Посмотреть сообщение
Дают такой результат
Такой же как у меня, да.
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
14.09.2024, 14:45
Хм, думал, если строки передавать как строки, а не как span-ы, то будет быстрее (избавляемся от копирования структуры), однако получилось дольше на четверть.

За последний прогон ParseToPair2 оказался самый быстрый (из моих вариантов).
Кликните здесь для просмотра всего текста

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
public class Benchmarks
{
    string[] array = ["1,5224V", "1,5225mV", "1,526 mV", "1,527 V"];
    
    [Benchmark]
    public void ParsingOfPair()
    {
        for (int i = 0; i < array.Length; i++)
        {
            _ = ParseToPair(array[i]);
        }
    }
    
    [Benchmark]
    public void ParsingOfPair2()
    {
        for (int i = 0; i < array.Length; i++)
        {
            _ = ParseToPair2(array[i]);
        }
    }
 
 
    public (double Value, string Unit) ParseToPair(ReadOnlySpan<char> message)
    {
        var errorCounter = 0;
        var vlen = 0;
        for (var i = 0; i < message.Length; i++)
        {
            if (char.IsDigit(message[i]))
                continue;
 
            if (++errorCounter == 2)
            {
                vlen = i;
                break;
            }
        }
 
        return (double.Parse(message[..vlen]), new string(message[vlen..].Trim()));
    }
    
    
    public (double Value, string Unit) ParseToPair2(ReadOnlySpan<char> message)
    {
        var errorCounter = 0;
        var vlen = 0;
        var unitIndex = 0;
        for (var i = 0; i < message.Length; i++)
        {
            if (char.IsDigit(message[i]))
                continue;
            
            if (++errorCounter == 2)
            {
                if (char.IsWhiteSpace(message[i]))
                    unitIndex = i + 1;
                else unitIndex = i;
                
                vlen = i;
                break;
            }
        }
        return (double.Parse(message[..vlen]), new string(message[unitIndex..]));
    }
}

Bash
1
2
3
4
| Method         | Mean     | Error   | StdDev  |
|--------------- |---------:|--------:|--------:|
| ParsingOfPair  | 316.6 ns | 3.81 ns | 3.57 ns |
| ParsingOfPair2 | 288.7 ns | 2.72 ns | 2.41 ns |
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
14.09.2024, 15:12  [ТС]
IamRain, да все, хорош "ускорений". Были сомнения, что первый метод излишне напрягается, но по факту оказалось что он работает всего 0,04% времени от всего выделенного окна.
Дольше ожидается другой await, вслед за ним..
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.09.2024, 15:12

Строка: Есть ли способ одной строкой менять несколько букв?
var a, b : string; begin a := 'ПРИВЕТ'; b := StringReplace(a, 'П', 'В', ); b := StringReplace(a, 'Р', 'О', ); b :=...

Как преобразовать строку, удалив в ней группы цифр, а группы букв отделить пробелами. Упорядочить полученную последовательность слов
Дана текстовая строка, состоящая из букв и цифр. Преобразовать строку, удалив в ней группы цифр, а группы букв отделить пробелами....

Сумма кодов первой и последней букв: способ разрешения коллизий Бинарное дерево
Привет. Помогите, пожалуйста, с написанием программы: Тип хеш-функции (таблицы)-Сумма кодов первой и последней букв Способ разрешения...

Подсчитать число гласных и согласных букв в множестве и определить, каких букв больше
Подсчитать число гласных и согласных букв в множестве и определить, каких букв больше. Учесть, что в строке могут быть другие символы,...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru