Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 26.10.2024
Сообщений: 8

Доработка кода игры "Жизнь"

05.01.2025, 15:41. Показов 5389. Ответов 31

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

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

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

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

Пример получившегося файла приложил.
20 30
2 3
2 4
3 4
3 5
3 6
3 7
5 0
5 1
5 2
6 2

Как доп вариант, хотелось бы сделать чтобы консоль очищалась после показа поколения через функцию
C++
1
std::system("clear");
используя библиотеку
C++
1
<cstdlib>
И была задержка
C++
1
sleep(время задержки в сек);
из библиотеки
C++
1
<unistd.h>
Просьба помочь, кто чем может. Буду благодарен. Преподаватели ссылаются на то, что студенты САМИ должны искать информацию в интернете. Надеюсь с вашей помощью и пояснениями у меня получится сделать то, что требуется


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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#include <iostream>
#include <fstream>
#include <thread>
 
 
 
#define FILL_CHAR 219
#define EMPTY_CHAR 255
 
void print(unsigned int generation, char* print_arr) {
    printf("Generation:%i\n%s\n", generation, print_arr);
}
 
bool equals(bool* array1, bool* array2, unsigned int n, unsigned int m) {
    for (unsigned int i = 0; i < n; i++)
        for (unsigned int j = 0; j < m; j++)
            if (array1[i * m + j] != array2[i * m + j])
                return false;
    return true;
}
unsigned short inline get(bool* array, unsigned int n, unsigned int m, unsigned int x, unsigned int y) {
    if (x < 1 || y < 1 || x > m || y > n) return 0;
    return array[(y - 1) * m + (x - 1)];
}
 
void process_output(bool* array1, bool* array2, char* print_arr, unsigned int n, unsigned int m) {
#pragma omp parallel for
    for (__int64 i = 0; i < (__int64)n; i++)
    {
        for (unsigned int j = 0; j < m; j++) {
            unsigned short alive_near = get(array1, n, m, j, i) +
                get(array1, n, m, j, i + 1) +
                get(array1, n, m, j, i + 2) +
                get(array1, n, m, j + 1, i) +
                get(array1, n, m, j + 1, i + 2) +
                get(array1, n, m, j + 2, i) +
                get(array1, n, m, j + 2, i + 1) +
                get(array1, n, m, j + 2, i + 2);
 
            if (alive_near > 3)
            {
                array2[i * m + j] = false;
                print_arr[i * (m + 1) + j] = EMPTY_CHAR;
            }
            else if (alive_near > 2)
            {
                array2[i * m + j] = true;
                print_arr[i * (m + 1) + j] = FILL_CHAR;
            }
            else if (alive_near > 1)
            {
                array2[i * m + j] = array1[i * m + j];
                print_arr[i * (m + 1) + j] = array1[i * m + j] ? FILL_CHAR : EMPTY_CHAR;
            }
            else {
                array2[i * m + j] = false;
                print_arr[i * (m + 1) + j] = EMPTY_CHAR;
            }
        }
        print_arr[m + i * (m + 1)] = '\n';
    }
    print_arr[n * (m + 1) - 1] = '\0';
}
 
void process_no_output(bool* array1, bool* array2, unsigned int n, unsigned int m) {
#pragma omp parallel for
    for (__int64 i = 0; i < (__int64)n; i++)
    {
        for (unsigned int j = 0; j < m; j++) {
            unsigned short alive_near = get(array1, n, m, j, i) +
                get(array1, n, m, j, i + 1) +
                get(array1, n, m, j, i + 2) +
                get(array1, n, m, j + 1, i) +
                get(array1, n, m, j + 1, i + 2) +
                get(array1, n, m, j + 2, i) +
                get(array1, n, m, j + 2, i + 1) +
                get(array1, n, m, j + 2, i + 2);
 
            if (alive_near > 3)
            {
                array2[i * m + j] = false;
            }
            else if (alive_near > 2)
            {
                array2[i * m + j] = true;
            }
            else if (alive_near > 1)
            {
                array2[i * m + j] = array1[i * m + j];
            }
            else {
                array2[i * m + j] = false;
            }
        }
    }
}
 
int main(int argc, char* argv[]) {
    std::ifstream in("in.txt");
    unsigned int n;
    unsigned int m;
    unsigned int delay;
    unsigned int max_iterations;
    bool output;
    in >> n >> m >> delay >> max_iterations >> output;
    //unsigned int n{ 100 };
    //unsigned int m{ 100 };
    //unsigned int delay{ 1 };
    //unsigned int max_iterations{ 915 };
    //bool output{ true };
    //in >> n >> m >> delay >> max_iterations >> output;
 
 
    bool* array1 = new bool[n * m];
    bool* array2 = new bool[n * m];
 
 
    if (output)
    {
        char* print_arr = new char[n * (m + 1)];
        for (unsigned int i = 0; i < n; i++)
        {
            for (unsigned int j = 0; j < m; j++)
            {
                in >> array1[i * m + j];
                print_arr[i * (m + 1) + j] = array1[i * m + j] ? FILL_CHAR : EMPTY_CHAR;
            }
            print_arr[m + i * (m + 1)] = '\n';
        }
        printf_s("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
        print_arr[n * (m + 1) - 1] = '\0';
 
        print(0, print_arr);
        std::this_thread::sleep_for(std::chrono::milliseconds(delay));
 
        unsigned int generation = 0;
 
        while (true) {
 
            std::chrono::steady_clock::time_point start, end;
            start = std::chrono::steady_clock::now();
 
            process_output(array1, array2, print_arr, n, m);
            print(++generation, print_arr);
 
            if (equals(array1, array2, n, m) || max_iterations != 0 && generation >= max_iterations)
                break;
 
            end = std::chrono::steady_clock::now();
 
            __int64 time = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
            if (time < delay)
            {
                std::this_thread::sleep_for(
                    std::chrono::milliseconds(delay - time));
            }
            bool* temp = array1;
            array1 = array2;
            array2 = temp;
        }
    }
 
 
    else {
        std::chrono::steady_clock::time_point start, end;
        start = std::chrono::steady_clock::now();
        for (unsigned int i = 0; i < n; i++)
        {
            for (unsigned int j = 0; j < m; j++)
            {
                in >> array1[i * m + j];
            }
        }
        unsigned int generation = 0;
        while (true) {
            process_no_output(array1, array2, n, m);
            generation++;
            if (equals(array1, array2, n, m) || max_iterations != 0 && generation >= max_iterations)
                break;
 
            bool* temp = array1;
            array1 = array2;
            array2 = temp;
        }
        end = std::chrono::steady_clock::now();
        __int64 time = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
        std::ofstream out("out.txt");
        out << "Time, milliseconds: " << time;
    }
    return 0;
}
Добавлено через 3 минуты
Дополню, живые клетки должны помечаться * а мертвые -
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.01.2025, 15:41
Ответы с готовыми решениями:

Рулетка - доработка кода
Я только недавно начал программировать на С++ и решил написать консольную программу типа рулетки. Вот код #include &lt;iostream&gt; ...

Проверка и доработка кода.
Написал программу попробовал откомпилировать в Visual Studio 2010. Стало выдавать разнообразные ошибки. Помогите пожалуйста исправить...

Придумать фигуру для игры "Жизнь" Джона Конвея
Задание: &quot;Продемонстрируйте работу клеточного автомата на примере «сорняка» («паразита») (фигуры, которая при столкновении с некоторыми...

31
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,246
Записей в блоге: 3
08.01.2025, 10:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alexu_007 Посмотреть сообщение
Нафига в игре жизнь структуры?
а нафига нужна сама Игра Жизнь?
[тут ответ--->...]

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

Цитата Сообщение от alexu_007 Посмотреть сообщение
два 2-мерных массива
я вас уверяю, что не нужны - нужны два одномерных.
два индекса потреблят больше цпу-ресов, чем один.
1
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,362
08.01.2025, 22:03
Цитата Сообщение от XLAT Посмотреть сообщение
возможно вы сможете написать эту прогу и в машинных кодах,
так зачем вам ваще массивы нужны? брынкайте по памяти голым указателем да и усё.
Повторю вопрос - нафига в игре жизнь структуры? Какие туда разные типы данных класть?
0
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,246
Записей в блоге: 3
09.01.2025, 09:49
Цитата Сообщение от alexu_007 Посмотреть сообщение
Повторю вопрос - нафига в игре жизнь структуры?
я нахожу ваш вопрос связанным с вашим неответом на мой вопрос.

связь тут четкая и хорошо видимая моими глазами.

а вы видите связь?

ваше непонимание важности структур приводит вас к мысли о невозможности создания точного ползунка.

Цитата Сообщение от alexu_007 Посмотреть сообщение
нафига
чтобы получить ответ вам нужно просто посмотреть мой код открытыми глазами.

Цитата Сообщение от alexu_007 Посмотреть сообщение
Повторю вопрос
если мой ответ вас не удовлетворил, то тогда нужно его повторить еще 42 раза,
но обязательно между повторами обдумайте ваш вопрос как можно более тщательно.

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


Добавлено через 3 минуты
чуток разбавлю троллинг,

Цитата Сообщение от GRAGGA Посмотреть сообщение
C++
1
2
3
4
5
6
7
void copy(Board src, Board dst) {
    for (int i = 0; i < width; ++i) {
        for (int j = 0; j < height; ++j) {
            dst[i][j] = src[i][j];  // копия прошлого поколения 
        }
    }
}
это ненужное копирование - пустая трата цпу-ресурсов.

профитно заменить на:
C++
1
void swap(Board& visual, Board& calc){ std::swap(visual, calc); }
полный тест, как оно работает:
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
///----------------------------------------------------------------------------|
/// C++17
///----------------------------------------------------------------------------:
#include <iostream>
 
///----------------|
/// Тестируемое.   |
///----------------:
const int W = 3; // параметр ширины поля
const int H = 2; // параметр высоты поля
 
using Board = int[H][W];
 
void swap(Board& visual, Board& calc){ std::swap(visual, calc); }
 
///----------------|
/// Логирование.   |
///----------------:
std::ostream& operator<<(std::ostream& o, const Board& b)
{
    for    (const auto&  r : b)
    {   for(const auto   e : r)
        {   std::cout << e << ' ' ;
        }   std::cout      << '\n';
    }
    return o;
}
 
#define log(a) std::cout << #a << ": \n" << (a) << '\n';
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{   std::cout << "Hello world!" << std::endl;
 
    Board visual{{1,2,3},{4,5,6}}; /// отображаемая на дисплей плоскость.
    Board calc  {{8,8,8},{9,9,9}}; /// вспомогательная плоскость для расчета.
 
    log(visual)
    log(calc)
 
    swap(visual, calc);
 
    log(visual)
    log(calc)
}
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6701 / 3120 / 1064
Регистрация: 01.06.2021
Сообщений: 12,056
09.01.2025, 21:03
XLAT, кстати, у Microsoft хорошо получилось возродить популярность сапёра. Они придумали новую игру Microsoft Treasure Hunt, которая доступна как отдельная игра или как режим приключения в Microsoft Minesweeper.
0
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,246
Записей в блоге: 3
10.01.2025, 01:07
Цитата Сообщение от Royal_X Посмотреть сообщение
кстати
кстати, как в task.json скомпилить в РЕЛИЗЕ ?

походу, у визуалкодерщиков на дебагинге крыша съехала - два вечера гуглю - не могу найти - как в таск-жсоне скомпилить РЕЛИЗ...

компилятор mingw.

кстати, я не юзаю дебаг - я пишу тесты.
0
49 / 39 / 11
Регистрация: 24.07.2022
Сообщений: 117
10.01.2025, 05:13
Цитата Сообщение от XLAT Посмотреть сообщение
как в task.json скомпилить в РЕЛИЗЕ ?
так же как и в дебаге только в args указать параметры для компилирования в релизной версии, или что имеется в виду?
1
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,246
Записей в блоге: 3
10.01.2025, 05:21
Цитата Сообщение от dmiteri Посмотреть сообщение
так же как и в дебаге только в args указать параметры для компилирования в релизной версии, или что имеется в виду?
верно, это рассуждение здравого человека и я так рассуждаю...

вот таск.жсон, который компилит мне .exe дебаг версию:
Code
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
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe build active file",
            "command": "C:\\msys64\\ucrt64\\bin\\g++.exe",
            "args": [
                //"-fdiagnostics-color=always",
                //"-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "C:\\msys64\\ucrt64\\bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build",
            "detail": "compiler: C:\\msys64\\ucrt64\\bin\\g++.exe"
        }
    ]
}
Цитата Сообщение от dmiteri Посмотреть сообщение
только в args указать параметры
какие параметры указать?
0
49 / 39 / 11
Регистрация: 24.07.2022
Сообщений: 117
10.01.2025, 08:15
Цитата Сообщение от XLAT Посмотреть сообщение
какие параметры указать?
-О2 или -O3

Code
1
2
3
4
5
6
7
"args": [
                "-std=c++14",
                "-O2",
                "-Wall",
                "-o",
                ""${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
1
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6701 / 3120 / 1064
Регистрация: 01.06.2021
Сообщений: 12,056
10.01.2025, 09:17
XLAT, вот как мое релизное задание выглядит. Вообще, для релиза прописываешь релизные аргументы

JSON
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
{
            "type": "cppbuild",
            "label": "g++.exe BUILD RELEASE",
            "command": "C:\\msys64\\ucrt64\\bin\\g++.exe",
            "args": [
                "${workspaceFolder}\\main.cpp",
                "-o",
                "${workspaceFolder}\\a.exe",
                "-fdiagnostics-color=always",
                "-Wall",
                "-Wextra",
                "-pedantic-errors",
                // "-std=c++98",
                // "-std=c++11",
                // "-std=c++14",
                // "-std=c++17", // default since GCC 11
                // "-std=c++20",
                "-std=c++23",
                "-O2",
                "-s",
                "-static"
            ],
            "options": {
                "cwd": "C:\\msys64\\ucrt64\\bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "revealProblems": "never",
                "focus": true,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": false,
                "close": false
            },
            "detail": "compiler: C:\\msys64\\ucrt64\\bin\\g++.exe"
        }
настройка presentation необязательна. Это я просто прописал все опции, чтобы в случае необходимости быстро менять. focus настроил на true, чтобы после компиляции нажимать на Enter и панель вывода автоматически закрывалась, учитывая, что окно уже сфокусировано.

А вот аргументы можешь свои передавать. "-fdiagnostics-color=always" для цветных предупреждений в консоли, "-Wall", "-Wextra", это предупреждения, "-pedantic-errors" - это чтобы несоответствия стандарту считались ошибками, "-std=c++23" версия, "-O2" - уровень оптимизации, "-s" обрезка лишних символов, чтобы уменьшить размер экзешника, "-static" - это чтобы была статическая сборка, не люблю кишки таскать с экзешником

Добавлено через 57 минут
XLAT, еще забыл предупредить, что для релизной компиляции нужно нажать Ctrl+Shift+B или Terminal/Run Build Task
Не нажимай на кнопку Run C/C++ File. Она все равно запустит отладчик. Это специфика работы расширения С++. И разрабы не собираются менять это недоразумение.
1
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,246
Записей в блоге: 3
10.01.2025, 10:02
Цитата Сообщение от Royal_X Посмотреть сообщение
"-s",
из всех опций сработала эта - удаление отладочной инфы,
но, вроде, эта инфа возможна и для релизной сборки,
что, походу, в этом случае нет.

добавив её я наконец то получил ексешник, который побайтно идентичен ексешнику моей сборке через makefile.

Цитата Сообщение от Royal_X Посмотреть сообщение
нужно нажать Ctrl+Shift+B или Terminal/Run Build Task
первым что я увидел, это опции предложенные мне по умолчанию:

я подумал "ок, щас добавлю себе РЕЛИЗ сборку ..."

НО - не тут то было ...

захотелось спросить у разрабов VC и его юзеров:
Code
1
2
3
4
5
6
чуваки, у вас до релизов хоть что-нить доходит?
или у вас бесструктурное мышление, только для того, чтобы бесконечнот дебажить?
у меня мышление структурное - мне НЕ нужно дебажить - мои проги работают сразу безглючно!
и мне нужно сразу видеть РЕЛИЗ! 
Где он у вас тут, ёшкинкот, находится?
ага, его нет...
))

Royal_X,
все эти мейкфайлы кроме всего прочего придумывались для ИНКРЕМЕНТАЛЬНОЙ сборки и
далее вопрос:

ГДЕ ОБЪЕКТНИКИ?

так как при нормальной сборке их не нужно собирать все с нуля,
а можно частично использовать уже собранные в предыдущих билдах ...
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6701 / 3120 / 1064
Регистрация: 01.06.2021
Сообщений: 12,056
10.01.2025, 10:36
XLAT, для получения объектников нужно использовать -c, что останавливает линковку. Есесена, файл после команды -o должен иметь расширение .o вместо .exe

Добавлено через 1 минуту
XLAT, и я знал, что ты нажмешь на эти кнопки, поэтому сразу предупредил, чтобы ты не нажимал

Добавлено через 4 минуты
Я тут GCC - компиляция C/C++ программ описывал некоторые аргументы gcc, возможно, тебе будет интересно
1
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
10.01.2025, 13:06
Цитата Сообщение от alexu_007 Посмотреть сообщение
если две контрольные суммы меняют друг друга - зацикливание.
зацикливание может быть шире чем два соседних кадра, например Glider Gun дающий бесконечные глайдеры на пути которых квадрат об который они разбиваются оставляя квадрат на том же месте. Для поля 60х40 клеток мне попадались циклы порядка трехсот кадров, так что для обнаружения зацикливания нужен массив и не контрольных сумм, а хэшей кадров.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.01.2025, 13:06

никто не сталкивался с распараллеливанием игры "Жизнь".
Всем приветики=**** Ребята, очень хотелось поинтересоваться, никто не сталкивался с распараллеливанием игры &quot;Жизнь&quot;. Очень...

Исправить ошибку в коде игры "Жизнь"
Суть задания в том чтобы дописать игру в жизнь в файле game, в определенном поле. Собственно в чем проблема код я дописал, но не знаю в чем...

Игра "Борьба за жизнь". Цель игры – убрать с доски все шашки противника
Здравствуйте! Помогите пожалуйста написать программу на с++. Два игрока имеют по n шашек и играют в поле m m клеток, делая ходы по...

Поиск повторяющихся слов в тексте (доработка кода)
Дан текст, содержащий n строк. Для каждого слова указать, сколько раз оно встречается в тексте. Я тут кое-что попробовала сделать (с++),...

Метод Зейделя для решения СЛАУ [Доработка кода]
Доброе утро народ. Мне нужна программа которая реализует Метод Зейделя для решения СЛАУ. Покопавшись в интернете нашел неплохой вариант. Но...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru