Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.98/43: Рейтинг темы: голосов - 43, средняя оценка - 4.98
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676

Ботлнек String/StringBuilder

22.11.2020, 08:42. Показов 11561. Ответов 220
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
обсуждение, начавшееся в другой теме переношу сюда. Самой тяжёлой является операция:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string source = File.ReadAllText(@"d:\work\words\source.txt", Encoding.GetEncoding(1251));
var sb_source = new StringBuilder(source, Source.Length);
Dictionary<string, int> F = new Dictionary<string, int>();
// ---
// тут вставляем код заполнения F, у меня получается около 70000 пар
// заполнение происходит очень быстро
// ---
foreach (var elem in F)
{
    // а вот тут был string и работало это, как мы все понимаем 200 лет
    // теперь тут StringBuilder, работает быстрее, но не слишком
    // можно сделать Parallels.ForEach, для моего i5 ускорится в ~4 раза
    sb_source = sb_source.Replace(elem.Key, "\0\0\0");
};
Нолики "\0" - это классификатор отсутствия информации, то есть после нескольких итераций на выходе будет файл полностью забитый нулями. Это один из показателей верности работы алгоритма.
Получается для файла в 4 мб (гигабайты я пока использовать не стал) это 4*70000=280000 Мбайт чтения и поменьше записи в памяти. Возможно стоит перевести на массив byte[] или ulong[] и делать замену вручную.

Добавлено через 10 минут
Цитата Сообщение от belalugoci Посмотреть сообщение
можно сделать Parallels.ForEach, для моего i5 ускорится в ~4 раза
StringBuilder также не является потокобезопасным, поэтому его работа с параллельными потоками недопустима.
Видимо нельзя
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2020, 08:42
Ответы с готовыми решениями:

List<string, string, string> есть ли в C# что-то подобное?
Мне надо добавить в List не только имя файла, но и некоторые строки из этого файла. Т.е. например, у меня есть в определенном директории...

StringBuilder и регулярки
Подскажите, можно ли на StringBuilder использовать RegEx.Replace? Если да, то как?

Подскажите как дешифровать текст с использованием StringBuilder
Дана строка, содержащая зашифрованный русский текст. Каждая буква заменяется на следующую за ней (буква я заменяется на а). Получить новую...

220
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 14:41  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от belalugoci Посмотреть сообщение
результаты выложу позже, но стало медленнее
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
String+StringBuilder    String+StringBuilder    byte[]+byte[]
Core i5-3570            Core i5-4470            Core i5-4470
[00:00.0000]            [00:00.0000]            [00:00.0000]    BEGIN
[00:00.0008]            [00:00.0007]            [00:00.5937]    Freq3: считаем частоты
[00:04.9290]            [00:10.0209]            [00:18.6181]    Частот пройдено: 0 : 1000000000
[00:09.2775]            [00:12.8250]            [00:21.7448]    Частот пройдено: 10000000 : 1000000000
[00:13.5592]            [00:15.7296]            [00:24.5689]    Частот пройдено: 20000000 : 1000000000
...
[07:03.6675]            [05:18.7391]            [05:54.0502]    Частот пройдено: 980000000 : 1000000000
[07:07.9217]            [05:21.9179]            [05:57.2668]    Частот пройдено: 990000000 : 1000000000
[07:12.1775]            [05:25.1216]            [06:00.4947]    Freq3: сортируем частоты
[07:12.1810]            [05:25.3944]            [06:00.9330]    Freq3: заменяем нулями текст вывода
[08:07.3789]            [06:49.8608]            [07:29.1648]    Freq3: сериализуем DAT
[08:07.4586]            [06:51.1780]            [07:31.1395]    Объект FreqOrdered3 сериализован
[08:07.4739]            [06:51.1843]            [07:31.6249]    Freq3: формируем текстовый вариант
[08:07.4743]            [06:51.3398]            [07:31.9029]    Freq3: сохраняем частоты
[08:07.5544]            [06:51.6656]            [07:34.1037]    Freq3: очищаем память
Так как на мелком файле разница малозаметна, то зарядил 1 Гб файл. Время в минутах. Первый столбец это мой домашний, потом два столбца с работы, средний это Dictionary<string, int> в качестве ключей и StringBuilder хранит сам 1 Гб файл.
А правый это Dictionary<byte[], int> и byte[].
0
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
23.11.2020, 14:48
belalugoci, на самом деле для нас эти замеры не особо важны. Важен код.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 14:56  [ТС]
Скажете если что-то нужно объяснить. Это код из таблицы для столбцов String+StringBuilder, сейчас вариант с байтами оформлю.
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
string source = File.ReadAllText(@"d:\work\words\a.txt", Encoding.GetEncoding(1251));
int len = source.Length;
var sb_source = new StringBuilder(source, len);
byte[] byte_source = System.Text.Encoding.GetEncoding(1251).GetBytes(source);
Dictionary<string, int> Freq3 = new Dictionary<string, int>();
Dictionary<string, int> FreqOrdered3 = new Dictionary<string, int>();
int totalbyte = 3;
for (int i = 0; i < len - 2; i++)
{
    string codesym = "";
    var iii = totalbyte;
    int dx = 0;
    while (iii > 0)
    {
        codesym += sb_source[i + dx++].ToString();
        iii--;
    }
    if (!Freq3.ContainsKey(codesym))
        Freq3.Add(codesym, 1);
    else
        Freq3[codesym]++;
}
FreqOrdered3 = Freq3.OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value);
byte[] codesym_byte = new byte[3];
int i2 = 0;
while (i2 < (len - 2))
{
    codesym_byte[0] = byte_source[i2];
    codesym_byte[1] = byte_source[i2 + 1];
    codesym_byte[2] = byte_source[i2 + 2];
    if (FreqOrdered3.ContainsKey(Encoding.GetEncoding(1251).GetString(codesym_byte)))
    {
        byte_source[i2] = 0;
        byte_source[i2 + 1] = 0;
        byte_source[i2 + 2] = 0;
        i2 += 2;
    }
    i2++;
}
Добавлено через 43 секунды
Цитата Сообщение от Usaga Посмотреть сообщение
на самом деле для нас эти замеры не особо важны. Важен код.
Согласен, это для истории )
0
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
23.11.2020, 15:00
Цитата Сообщение от belalugoci Посмотреть сообщение
string source = File.ReadAllText(@"d:\work\words\a.txt", Encoding.GetEncoding(1251));
int len = source.Length;
var sb_source = new StringBuilder(source, len);
byte[] byte_source = System.Text.Encoding.GetEncoding(1251).G etBytes(source);
Уже жесткач. Первая строка выгружает в ОЗУ файл целиком. Третья строка снимает с этих данных копию. Последняя строка делает ещё копию. Если файл размером с гигабайт, то представляю расход оперативной памяти.
1
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 15:00  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Дефолтный Dictionary так же поддерживает получение компаратора в конструкторе
Так сделал, выше показали как нужно.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если у вас не предусматривается длина ключей более 8 байт, то возможно более оптимальным будет использовать long и небезопасный код.
вполне может быть, посмотрите код выше, возможно получится что-то с ним сделать.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Из этого следует, что нет необходимости совершать для каждого ключа отдельный проход по потоку. Всё можно сделать в одном проходе но несколько более сложным алгоритмом.
Сомневаюсь. Сбор информации происходит за 1 проход, только после этого есть возможность совершить второй проход с другим алгоритмом, при этом словарь изменится. И так нужно делать пока словарь не перестанет меняться. Поэтому я и написал что в лучшем варианте это O(n!).
0
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
23.11.2020, 15:02
Цитата Сообщение от belalugoci Посмотреть сообщение
while (iii > 0)
    {
        codesym += sb_source[i + dx++].ToString();
        iii--;
    }
Конкатенация в цикле. Это - тонны мусора и работы для GC. Ещё и бесполезное преобразование отдельных символов в строку. Дополнительный мусор.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 15:04  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Уже жесткач. Первая строка выгружает в ОЗУ файл целиком. Третья строка снимает с этих данных копию. Последняя строка делает ещё копию. Если файл размером с гигабайт, то представляю расход оперативной памяти.
вижу это, в 5 гб укладывается. Если свести до 2 гб то ровным счетом ничего не изменится кроме факта использования меньшего объема памяти, а сейчас это не важно.

Добавлено через 57 секунд
Цитата Сообщение от Usaga Посмотреть сообщение
Конкатенация в цикле. Это - тонны мусора и работы для GC. Ещё и бесполезное преобразование отдельных символов в строку. Дополнительный мусор.
я не смогу оформить лучше.
0
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
23.11.2020, 15:05
Цитата Сообщение от belalugoci Посмотреть сообщение
вижу это, в 5 гб укладывается. Если свести до 2 гб то ровным счетом ничего не изменится кроме факта использования меньшего объема памяти, а сейчас это не важно.
Это уже супернеэффектиный код. На эти переливания данных в оперативке уже время уходит и память. Этого не должно быть.

Добавлено через 24 секунды
Цитата Сообщение от belalugoci Посмотреть сообщение
я не смогу оформить лучше.
Вы знаете про StringBuilder. Вы можете оформить лучше.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 15:07  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Это уже супернеэффектиный код
ну я такое не учитываю, это в самом начале происходит и занимает всегда неизменное время в 5-6 секунд. Я не спорю с вами, просто считаю что это легко устраняется и недостойно внимания.

Цитата Сообщение от Usaga Посмотреть сообщение
Вы знаете про StringBuilder. Вы можете оформить лучше.
Так, идею понял. Сейчас переделаю.
0
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
23.11.2020, 15:14
while (i2 < (len - 2))
{
codesym_byte[0] = byte_source[i2];
codesym_byte[1] = byte_source[i2 + 1];
codesym_byte[2] = byte_source[i2 + 2];
if (FreqOrdered3.ContainsKey(Encoding.GetEn coding(1251).GetString(codesym_byte)))
Вот тут тоже малый мусор создаётся.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
23.11.2020, 15:30
Цитата Сообщение от belalugoci Посмотреть сообщение
Так, идею понял. Сейчас переделаю.
У вас StringBuilder используется ровно 1 раз и то это можно заменить...
Удалить
C#
1
var sb_source = new StringBuilder(source, len);
Заменить
C#
1
codesym += sb_source[i + dx++].ToString();
на
C#
1
codesym += source[i + dx++].ToString();
Это тоже непонятно зачем нужно:
C#
1
byte[] byte_source = System.Text.Encoding.GetEncoding(1251).GetBytes(source);
Можно удалить, оставить код со StringBuilder и заменять символы в нем:
C#
1
2
3
        sb_source[i2] = '\0';
        sb_source[i2 + 1] = '\0';
        sb_source[i2 + 2] = '\0';
Не до конца исправленный код из поста выше
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
string source = File.ReadAllText(@"d:\work\words\a.txt", Encoding.GetEncoding(1251));
int len = source.Length;
var sb_source = new StringBuilder(source, len);
//byte[] byte_source = System.Text.Encoding.GetEncoding(1251).GetBytes(source);
Dictionary<string, int> Freq3 = new Dictionary<string, int>(); // заменить на Dictionary<char[], int> с соответствующим компаратором
Dictionary<string, int> FreqOrdered3 = new Dictionary<string, int>(); // заменить на Dictionary<char[], int> с соответствующим компаратором
int totalbyte = 3;
char[] codesum = new char[totalbyte];
for (int i = 0; i < len - 2; i++)
{
    //string codesym = "";
    var iii = totalbyte;
    int dx = 0;
    while (iii > 0)
    {
        codesym[dx++] = sb_source[i + dx++];
        iii--;
    }
    if (!Freq3.ContainsKey(new string(codesym))) // тут можно было бы использовать словать Dictionary<char[], int> с соотвествующим компаратором чтобы не плодить строки...
        Freq3.Add(codesym, 1);
    else
        Freq3[codesym]++;
}
FreqOrdered3 = Freq3.OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value);
char[] codesym_byte = new char[3];
int i2 = 0;
while (i2 < (len - 2))
{
    codesym_byte[0] = sb_source[i2];
    codesym_byte[1] = sb_source[i2 + 1];
    codesym_byte[2] = sb_source[i2 + 2];
    if (FreqOrdered3.ContainsKey(new string(codesym_byte))) // тут можно было бы использовать словать Dictionary<char[], int> с соотвествующим компаратором чтобы не плодить строки...
    {
        sb_source[i2] = '\0';
        sb_source[i2 + 1] = '\0';
        sb_source[i2 + 2] = '\0';
        i2 += 2;
    }
    i2++;
}
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 15:37  [ТС]
Сейчас переделаю.
было
C#
1
2
3
4
5
6
7
var iii = totalbyte;
int dx = 0;
while (iii > 0)
{
    codesym += sb_source[i + dx++].ToString();
    iii--;
}
время выполнения [07:12.1775]
стало
C#
1
string codesym = sb_source.ToString(i, 3);
время выполнения [04:04.5412]
0
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
23.11.2020, 15:42
Цитата Сообщение от Someone007 Посмотреть сообщение
// тут можно было бы использовать словать Dictionary<char[], int> с соотвествующим компаратором чтобы не плодить строки...
А лучше ArraySegment<char> или Span<char>
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 16:31  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
codesym[dx++] = sb_source[i + dx++];
тут ошибка будет, итераций в 2 раза больше. полагаю что в codesym[dx++] нужно заменить на dx.

Цитата Сообщение от Someone007 Посмотреть сообщение
Не до конца исправленный код из поста выше
В таком виде исполнялось практически идентично с вариантом byte[].
0
Just Do It!
 Аватар для XLAT
4220 / 2684 / 656
Регистрация: 23.09.2014
Сообщений: 9,240
Записей в блоге: 3
23.11.2020, 17:50
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не читал все посты.
и я тоже не читал, но осуждаю:
Цитата Сообщение от belalugoci Посмотреть сообщение
sb_source.Replace(...
Replace, как никудышний по скорости алгоритм для множественной замены.

тут пруф:
https://www.cyberforum.ru/post14441679.html
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 18:05  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
Replace, как никудышний по скорости алгоритм для множественной замены.
почитаю, но такой команды уже нет в коде, оптимизируем потихоньку.
0
Just Do It!
 Аватар для XLAT
4220 / 2684 / 656
Регистрация: 23.09.2014
Сообщений: 9,240
Записей в блоге: 3
23.11.2020, 18:37
Цитата Сообщение от belalugoci Посмотреть сообщение
почитаю, но такой команды уже нет в коде, оптимизируем потихоньку.
самое главное понять почему он медленный.
а то можно и своё наворотить в таком же реплейснутом духе
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
23.11.2020, 18:44
Цитата Сообщение от belalugoci Посмотреть сообщение
вполне может быть, посмотрите код выше, возможно получится что-то с ним сделать.
Я не совсем понимаю, что делает ваш код.
В первом цикле вроде просто собирает статистику для заданной длины ключа.
Если правильно понял, то что-то подобное:
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
    public class FreqPair
    {
        public ulong Key { get; }
        public int Count { get; set; }
 
        public FreqPair(ulong key) => Key = key;
 
        public FreqPair(ulong key, int count)
            : this(key)
            => Count = count;
    }
    public class FreqTextAscii
    {
        public unsafe static IDictionary<ulong, FreqPair> GetFreqs(string fileName, int keyLength)
        {
            if (keyLength < 1 || keyLength > 8)
                throw new ArgumentOutOfRangeException(nameof(keyLength));
 
            byte[] source = File.ReadAllBytes(fileName);
 
            Dictionary<ulong, FreqPair> freqs = new Dictionary<ulong, FreqPair>();
            ulong key = 0;
            byte* keyBytes = (byte*)&key;
 
            // Формирование первого ключа
            for (int i = 0; i < keyLength; i++)
            {
                *(keyBytes + i) = source[i];
            }
            freqs.Add(key, new FreqPair(key, 1));
 
            for (int i = keyLength; i < source.Length; i++)
            {
                *(keyBytes + keyLength - 1) = 0;
                key <<= 8;
                *keyBytes = source[i];
 
                if (freqs.TryGetValue(key, out FreqPair pair))
                    pair.Count++;
                else
                    freqs.Add(key, new FreqPair(key, 1));
 
            }
 
            return freqs;
        }
    }
Но вот, что делать дальше с этими ключами - не понимаю.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.11.2020, 18:53  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
Replace, как никудышний по скорости алгоритм для множественной замены.
думаете Replace в C# такой же как и в C++?
0
Just Do It!
 Аватар для XLAT
4220 / 2684 / 656
Регистрация: 23.09.2014
Сообщений: 9,240
Записей в блоге: 3
23.11.2020, 18:59
Цитата Сообщение от belalugoci Посмотреть сообщение
думаете Replace в C# такой же как и в C++?
алгоритмы - они и в африке алгоритмы!

хотите быстро?
и не боитесь использовать в вашем C# динамические библы, тогда вот вам в помощь:
https://habr.com/ru/post/347352/

ну это просто вариант,
так как я плохо знаю андеграунд шарпа, то мне бы подошёл, тем более когда всё критично...
а ваще на будущее этот вариант, если вы его обкатаете, то может даже очень и очень пригодиться!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2020, 18:59

Невозможно очистить StringBuilder после исключения OutOfMemoryException
Привет всем. Делаю небольшой текстовый редактор и натолкнулся на следующую проблему: при загрузке достаточно большого файла через...

StringBuilder: Строка не корректно создается, перемешиваются все поля
приложение клиент-сервер. клиент создает запрос на сервер, сервер с помощью StringBuilder из словаря формирует строку для передачи по...

В чем разница между StringWriter и StringBuilder и когда нужно использовать эти классы?
Подскажите, пожалуйста, в чем разница между StringWriter и StringBuilder и когда нужно использовать эти классы? То, что есть в этих...

Несколько вопросов по примеру из книги по C# про строки (string и String.Format)
Я нашел такой пример кода: private void butFormatStr_Click(object sender, EventArgs e { string AutoName; AutoName =...

Реализация интерфейса IEqualityComparer для HashSet<Dictionary<string, string>>
Код выдает &quot;2&quot;, что, логично, а хотелось бы, чтобы выдавал &quot;1&quot;, так как содержание словарей одинаковое. Подскажите, пожалуйста,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть не большие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru