Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459

Оптимальная сортировка для средних массивов

03.11.2018, 15:57. Показов 2948. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго, к сожалению не очень шарю в разных методах сортировки, потому хочу спросить, какую сортировку лучше выбрать для массива, длина которого не превышает 500'000 элементов, а содержимое лежит в пределе [0; 500'000].
Если кратко, то https://www.cyberforum.ru/cgi-bin/latex.cgi?1 \leq n \leq 500'000 и https://www.cyberforum.ru/cgi-bin/latex.cgi?0 \leq {a}_{i} \leq n
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.11.2018, 15:57
Ответы с готовыми решениями:

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

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

Поиск и оптимальная сортировка в datagridview
имеется сортировка в datagridview но она слишком простая, может кто нибудь знает посложнее? Dim Col As...

55
44 / 20 / 14
Регистрация: 23.10.2018
Сообщений: 103
03.11.2018, 19:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Cortas Посмотреть сообщение
как я и говорил, этот код работает быстрее, но все ещё недостаточно быстро.
с чего ты взял? как самому это проверить?
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
03.11.2018, 20:24  [ТС]
Цитата Сообщение от sty4ent Посмотреть сообщение
с чего ты взял?
Проверяющая система говорит, что "Превышено максимальное время работы" (ограничение по времени в ~200 микросекунд) как с сортировкой, так и с булевым массивом, однако со вторым вариантом код прошел больше тестов, чем с первым, а время, затраченное на втором алгоритме в одинаковых тестах меньше.

Добавлено через 1 минуту
P.s. вполне вероятно, что код, написанный вчера в час ночи является ещё тем куском. Сейчас перепишу и снова отчитаюсь.

Добавлено через 21 минуту
ну вот:
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
uint mth(uint* arr, uint a, uint b)
{
  uint size = b - a + 1; //вычисляем размер
  uint *temp = new uint[size]; //выделяем память
    
  for(int i = a - 1, i_temp = 0; i < b; i++, i_temp++)
    temp[i_temp] = arr[i]; //копируем нужный участок (std::copy ругается на небезопасное копирование, потому вот-так)
 
  sort(temp, temp + size);  //сортируем std::sort'ом 
 
  if(temp[0] != 0) return 0; //если нет нуля, то возвращаем его. Возможно будет быстрей сначала пройти весь 
                                        //кусок данного массива (arr) и узнать есть ли там ноль
 
  for(int i = 1; i < size; i++) //ищем прерывания 
    if(temp[i] - temp[i - 1] > 1)
    {
      size = temp[i - 1] + 1; //в size пихаем число
      delete[] temp; //очищаем память 
      return size; //возвращаем найденное число
    }
  
  //иначе, возвращаем максимальное
  size = temp[size - 1] + 1;
  delete[] temp;
  return size;
}
Конкретно этот код, медленней предыдущего варианта - прошел меньше тестов, забрал больше времени с одинаковых
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.11.2018, 20:52
Цитата Сообщение от Cortas Посмотреть сообщение
Конкретно этот код, медленней предыдущего варианта - прошел меньше тестов, забрал больше времени с одинаковых
Может, битовые маски вместо булевых массивов попробовать? Там можно одним махом проверить целую пачку чисел на тему "присутствуют, али нет".
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
unsigned long find(const unsigned long*input,unsigned long N)
{
    const std::size_t maxN=1<<19;//чтоб не тратиться на динамическую память
    const std::size_t bitMaskSize=std::numeric_limits<unsigned long>::digits;
    const std::size_t maskArraySize=maxN/bitMaskSize;
    unsigned long maskArray[maskArraySize]={0};
    assert(N<=maxN);
 
    for(std::size_t i=0;i<N;++i)
    {
        const std::size_t maskIndex=input[i]/bitMaskSize;
        const unsigned bitNumber=input[i]%bitMaskSize;
        maskArray[maskIndex]|=1L<<bitNumber;
    }
    for(std::size_t i=0;i<maskArraySize;++i)
    {
        const unsigned long mask=maskArray[i];
        if(mask!=(unsigned long)(~0))
        {
            for(std::size_t offset=0;offset<bitMaskSize;++offset)
                if(!(mask&(1<<offset)))
                    return i*bitMaskSize+offset;
        }
    }
    return-1;
}
1
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
03.11.2018, 22:43  [ТС]
Renji, ваш алгоритм довольно шустрый, хотя в некоторых тестах проигрывает предыдущему фавориту, однако, я думаю, это погрешности. Было бы неплохо, если вы объяснили как именно он работает, т.к. мне он не очевиден.

Добавлено через 13 минут
p.s. только вот он тоже не прошел все тесты
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.11.2018, 22:51
Цитата Сообщение от Cortas Посмотреть сообщение
Renji, ваш алгоритм довольно шустрый, хотя в некоторых тестах проигрывает предыдущему фавориту, однако, я думаю, это погрешности. Было бы неплохо, если вы объяснили как именно он работает, т.к. мне он не очевиден.
Я же говорю, битовые маски. В каждом unsigned long 32 или 64 двоичных разряда (бита). Чтобы сохранить информацию "есть число, нет числа" нам достаточно одного бита. То есть, один long может хранить информацию сразу о 32 числах. Вот первый цикл именно это и делает - вместо bool использует биты. Второй цикл проверяет все long-и на предмет "все ли биты установлены в единицу?". То есть, ищет первую пачку из 32 чисел, в которой какое-то число пропущено. Так как проверяются 32 бита разом, это должно работать шустрее чем bool-массив. Ну а третий цикл проверяет какое именно число пропущено.
Цитата Сообщение от Cortas Посмотреть сообщение
p.s. только вот он тоже не прошел все тесты
Тогда, я бы присмотрелся как читается входная последовательность. Если там какие ни будь векторы с push_back, попробуйте поменять их на статический массив. Если cin>>, то замените на scanf. Сам то алгоритм поиска нужного числа и так уже имеет линейную сложность, куда уж его дальше ускорять то.
1
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
03.11.2018, 23:15  [ТС]
Renji, решение очень красивое
Что же касается остального, использую я только обычные массивы, а остальное, должно быть понятно из всей задачи:
вся задача

есть массив 1 <= size <= 500'000, с элементами 0 <= a_i <= n.
дальше происходит следующие:
вводится команды
"? l r" - делает то, что обсуждалось в этом топике (l и r - границы поиска)
"! e v" - меняет значение элемента под номером 'e' на 'v'
в самом начале, в то же время, когда вводится размер массива, вводится и кол-во этих команд, которых может быть от 1 до 250'000 включая.
Есть ограничение на вторую команду ("! e v"), их можно ввести не больше 50'000 (конечно, при условии что всего команд >= 50'000)

Что я делаю:

1. Читаю размер массива и кол-во команд через cin.
2. Выделяю память под массив и в цикле считываю все значения.
3. Вхожу в цикл while с условие пока переменная, в которой лежит кол-во операций не станет равна 0.
4. Читаю с помощью cin'а символ операции, число 'a', число 'b'.
5. Если это операция по поиску, то запускаю ваш алгоритм с параметрами find(arr + a - 1, b - a + 1); и вывожу через cout значение. (единица нужна, т.к. эти демоны начинают массив с 1, а не с 0)
6. Если это вторая команда, т.е. замена значения, то просто arr[a - 1] = b;
7. Декрементирую кол-во операций.

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

возможно стоит запоминать результат предыдущих операций по поиску, вот только массив может меняться. Так же, если новый поиск входит в старый диапазон, то тоже можно что-то по колдовать, но не усложнит ли слишком сильно программу?
0
44 / 20 / 14
Регистрация: 23.10.2018
Сообщений: 103
03.11.2018, 23:42
Цитата Сообщение от Cortas Посмотреть сообщение
ограничение по времени в ~200 микросекунд
исходя из моих тестов, придётся все ускорить > 1000 раз
покажи нам ссылку на задачу, есть подозрение, что ты неправильно её понял
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
04.11.2018, 00:16
Цитата Сообщение от Cortas Посмотреть сообщение
в самом начале, в то же время, когда вводится размер массива, вводится и кол-во этих команд, которых может быть от 1 до 250'000 включая.
Вот с этого и надо было начинать - задача не на оптимизацию однократной обработки массива, а на оптимизацию повторных проходов по тому же массиву. Ну, попробуйте как-то так (количество уровней счетчиков можно и поднять):
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
const std::size_t maxN=1<<19;
std::size_t countLevel0[maxN]={0};
std::size_t countLevel1[maxN/1024]={0};
 
//это дергать для чтения очередного значения массива
void insertValue(std::size_t value)
{
    if(!countLevel0[value]++)
        ++countLevel1[value/1024];
}
 
//для операции изменения элемента массива сначала пнуть removeValue, потом insertValue
void removeValue(std::size_t value)
{
    if(!--countLevel0[value])
        --countLevel1[value/1024];
}
 
std::size_t find(std::size_t minValue,std::size_t maxValue)
{
    const std::size_t min1=minValue/1024,max1=(maxValue+1023)/1024;
    for(std::size_t pos1=min1;pos1<max1;++pos1)
        if(countLevel1[pos1]<1024)
        {
            const std::size_t min0=std::max(minValue,min1*1024);
            const std::size_t max0=std::min(maxValue,(min1+1)*1024);
            for(std::size_t pos0=min0;pos0<max0;++pos0)
                if(!countLevel0[pos0])
                    return pos0;
        }
    return -1;
}
0
44 / 20 / 14
Регистрация: 23.10.2018
Сообщений: 103
04.11.2018, 00:37
Ничего не получится, ему надо уложиться в 200 микросекунд .
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
04.11.2018, 01:40
Cortas, а можно ссылку на контест?
Хочу проверить свою идею.

Добавлено через 43 минуты
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
#include <iostream>
#include <vector>
#include <set>
 
 
using t_positions = std::set<unsigned>;
 
std::vector<t_positions> prepare(const std::vector<unsigned> & base)
{
    std::vector<t_positions> res(base.size());
    for(size_t i = 0; i<base.size(); ++i)
        res[base[i]].insert(i);
    return res;
}
 
 
void replace(size_t pos, unsigned value, std::vector<unsigned>& arr, std::vector<t_positions>& mapper)
{
    unsigned old = arr[pos];
    arr[pos] = value;
    
    mapper[old].erase(pos);
    mapper[value].insert(pos);
}
/// Both inclusive
bool is_set_contains(const t_positions& positions, size_t left, size_t right)
{
    if(positions.size()==0)
        return false;
    auto iter = positions.lower_bound(left);
    if(iter==positions.end() || *iter>right)
        return false;
    return true;
}
 
size_t first_lost(size_t left, size_t right, const std::vector<t_positions>& mapper)
{
    for(size_t i = 0; i<mapper.size(); ++i)
        if(!is_set_contains(mapper[i], left, right))
            return i;
    return mapper.size();
}
 
int main()
{
    size_t n;
    std::cin>>n;
    std::vector<unsigned> arr(n);
    for(unsigned &v:arr)
        std::cin>>v;
    std::vector<t_positions> mapper = prepare(arr);
    size_t number_of_commands;
    std::cin>>number_of_commands;
    for(size_t i = 0; i<number_of_commands; ++i)
    {
        char cmd;
        std::cin>>cmd;
        if(cmd=='?')
        {
            size_t l,r;
            std::cin>>l>>r;
            std::cout<<first_lost(l, r, mapper);
        }
        else
        {
            unsigned value;
            size_t pos;
            std::cin>>pos>>value;
            replace(pos, value, arr, mapper);
        }
    }
}
Добавлено через 14 минут
Плюс, по-хорошему, стоит кешировать запросы.
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
04.11.2018, 10:30  [ТС]
Цитата Сообщение от sty4ent Посмотреть сообщение
Ничего не получится, ему надо уложиться в 200 микросекунд
~200 мкс нужно на одну операцию поиска, на все задачу дают 6 с половиной сек.
Цитата Сообщение от Renji Посмотреть сообщение
Ну, попробуйте как-то так
Сейчас попробую.
Цитата Сообщение от New man Посмотреть сообщение
Хочу проверить свою идею.
Ну этот код не прошел теста, поправьте его, можете протестировать на этом примере:
пример

7 9
2 7 1 0 3 4 5
? 1 7
? 2 4
! 3 3
? 1 4
? 4 7
! 4 1
? 1 7
! 4 0
? 4 7

Ответы к примеру

? 1 7 -> 6
? 2 4 -> 2
! 3 3
? 1 4 -> 1
? 4 7 -> 1
! 4 1
? 1 7 -> 0
! 4 0
? 4 7 -> 1

Только помните, что они нумеруют массив с 1.

Добавлено через 30 минут
Renji, ну, попробовал, однако, если я все сделал правильно, то этот код не прошел проверочного теста.
Т.е. что я сделал, в первую скопировал ваш код, дальше все сделал по обычному сценарию, т.е. размер массива, кол-во операций, сам массив и т.д.
При запросе на поиск в определенном участке, находил min и max значения на нем и передавал в вашу функцию
(find(min, max)). Но значения отличались от нужных.
При изменении элемента, как и написано в комментах к коду, сначала дергал removeValue(b) с аргументом значения, затем insertValue(b) с тем же аргументов.
Что я сделал не так?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
04.11.2018, 12:19
Цитата Сообщение от Cortas Посмотреть сообщение
Renji, ну, попробовал, однако, если я все сделал правильно, то этот код не прошел проверочного теста.
Пардон, попутал условия задачи - нужно было найти дырку в последовательности от array[min] до array[max], у меня ищет дырку между самими min и max. Вот для "от array[min] до array[max]" ничего с разбегу не придумывается.
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
04.11.2018, 15:53
Cortas, а так?
А можно ссылку на тесты? Скорее всего этот код не пройдёт тесты, поэтому нужно написать кеширование запросов.
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <vector>
#include <set>
 
 
using t_positions = std::set<unsigned>;
 
std::vector<t_positions> prepare(const std::vector<unsigned> & base)
{
    std::vector<t_positions> res(base.size()+1);
    for (size_t i = 0; i<base.size(); ++i)
        res[base[i]].insert(i);
    return res;
}
 
 
void replace(size_t pos, unsigned value, std::vector<unsigned>& arr, std::vector<t_positions>& mapper)
{
    unsigned old = arr[pos];
    arr[pos] = value;
 
    mapper[old].erase(pos);
    mapper[value].insert(pos);
}
/// Both inclusive
bool is_set_contains(const t_positions& positions, size_t left, size_t right)
{
    if (positions.size() == 0)
        return false;
    auto iter = positions.lower_bound(left);
    if (iter == positions.end() || *iter>right)
        return false;
    return true;
}
 
size_t first_lost(size_t left, size_t right, const std::vector<t_positions>& mapper)
{
    for (size_t i = 0; i<mapper.size(); ++i)
        if (!is_set_contains(mapper[i], left, right))
            return i;
    return mapper.size();
}
 
int main()
{
    size_t n;
    size_t number_of_commands;
    std::cin >> n;
    std::cin >> number_of_commands;
    std::vector<unsigned> arr(n);
    for (unsigned &v : arr)
        std::cin >> v;
    std::vector<t_positions> mapper = prepare(arr);
    std::vector<unsigned> prints;
    prints.reserve(number_of_commands);
    for (size_t i = 0; i<number_of_commands; ++i)
    {
        char cmd;
        std::cin >> cmd;
        if (cmd == '?')
        {
            size_t l, r;
            std::cin >> l >> r;
            prints.push_back(first_lost(l-1, r-1, mapper));
        }
        else
        {
            unsigned value;
            size_t pos;
            std::cin >> pos >> value;
            replace(pos-1, value, arr, mapper);
        }
    }
 
    for (unsigned v : prints)
        std::cout << v << '\n';
}
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
04.11.2018, 16:11  [ТС]
New man, это оош. Ваша программа прошла больше всех тестов. Вы лишь запоминали уже сделанные запросы на не измененном массиве, верно?
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
04.11.2018, 16:21
Cortas, нет.
Я сначала обработал массив, создав массив, индекс которого — число в массиве, а значение — набор точек в основном массиве, где он встречается.

Затем я просто проходился по этому массиву, проверяя, входит ли хотя бы одна из позиций каждого числа в диапазон.
То есть, сложность каждого запроса O(r-l) (так как в позициях от l до r не больше r-l чисел, проверка наличия цифры произведётся максимум r-l раз. Проверка наличия цифры в диапазоне в среднем за константу, в худшем случае за O(logN))

Общая сложность моего решения O(среднее(r-l)*k) — где n — длина базового массива, k — количество команд.
Вариант с твоими сортировками: O(n) — копирование, O(nlogn) — сортировка, O(n) проверка. Итого O(n*k*logN).
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
04.11.2018, 16:32  [ТС]
New man, ясно, но это все ещё не достаточно быстро, хоть и максимальное время, за исключением того случая, когда оно превысило 6.5 сек, равно 3.418 сек.
Кстати, а разве у вас обработанный массив не массив массивов, раз у вас набор точек. Ведь в таком случае, вы должны были пройтись по диапазону r - l + спуститься (в худшем случае) до конца set'а или я что-то путаю?
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
04.11.2018, 16:34
Cortas, Вас уже не однократно просили дать ссылку на тесты. Почему вы упорно игнорируете эти вопросы? Вам тяжело дать ссылку или ее не существует?
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
04.11.2018, 16:38  [ТС]
Manowar, я не игнорирую, я сказал, что это ООШ - открытая олимпиада школьников, прямую ссылку на тесты я дать не могу, т.к. для этого нужен аккаунт.
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
04.11.2018, 16:44
Т.е. я не могу зарегиться и выйти на это задание?
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
04.11.2018, 16:45  [ТС]
Manowar, в смысле, кто вам мешает это сделать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.11.2018, 16:45

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

Найти минимальное из средних арифметических 3 массивов.
Даны 3 массива по 28 элементов. Найти минимальное из средних арифметических для соответствующих элементов данных массивов. Напечатать...

Найти произведение средних арифметических элементов массивов X(n,m) и Y(n,m)
Найти произведение средних арифметических элементов массивов X(n,m) и Y(n,m). Pascal

Из средних значений двух массивов найти минимальное
Задание такое Определить минимальное значение Srmin = = min{Sr1, Sr2} среднего значения Sr1 массива xi и сред него значения Sr2...

Вычисление средних значений среди отрицательных чисел массивов
Даны 5 двумерных массивов A, B, C, D, E разной длины. Разработать процедуру ввода массивов и вычисления средних значений среди...


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

Или воспользуйтесь поиском по форуму:
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