powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
11 сообщений из 111, страница 5 из 5
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38687401
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА зачем хранить каждую координату отдельно ? Ведь хватит 4 байт для хранения всех координат
это уже ваши заботы, я писал как мне проще - мне некогда тут оптимизировать, проект горит :)
SashaMercuryЯ тоже их хотел хранить в структуре, и спрашивал про это у mayton_a, но огн сказал что не предполагает менять структуру хранения данных. Потому не стал добавлять координаты в структуру.
Так то данные. А координаты они снаружи данных.
Никакого противоречия тут нет. О том как хранить координаты никаких требований не было.
А если буквально воспринимать что надо хранить только полезные данные и ничего более, то вам останется только в 3-мерном массиве все размещать. Т.е. потребление памяти будет максимальным. А это вовсе не то что требуется.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38687404
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercuryА зачем хранить каждую координату отдельно ? Ведь хватит 4 байт для хранения всех координат
это уже ваши заботы, я писал как мне проще - мне некогда тут оптимизировать, проект горит :)
Кстати, вовсе и не нужно с битами возиться чтобы упаковать координаты в int.
Код: plaintext
1.
2.
3.
4.
5.
6.
struct Item {
  unsigned x:10;
  unsigned y:10;
  unsigned z:10;
  unsigned short value;
} __attribute__((packed));


packed нужен, чтобы убрать после value 2 заполняющих байта из-за выравнивания .
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38687408
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал так, но почему-то не добавляется второй элемент. Не стал делать функцию для возврата количества элементов. Мне показалось что достаточно глобальной переменной.
Код: plaintext
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.
struct Brick {
	int value;//(Damage,Matherial)
	int coord;//(x,y,z)
};

unsigned buf_pow = 0;
unsigned int Brick_pow = sizeof(struct Brick);
struct Brick* buf_b = NULL;

struct Brick* create_brick(unsigned short Damage, unsigned short Matherial, unsigned int x, unsigned int y, unsigned int z)
{
	struct Brick* b = (struct Brick*)malloc(sizeof(struct Brick));
	b->value = Damage + (Matherial << 5);
	b->coord = x + (y << 10) + (z << 20);
	return b;
}

int insert_brick(unsigned short Damage, unsigned short Matherial, unsigned int x, unsigned int y, unsigned int z)
{
	struct Brick* b = create_brick(Damage, Matherial, x, y, z);
	buf_pow++;
	buf_b = (struct Brick*)realloc(buf_b, buf_pow*Brick_pow);
	*(buf_b+buf_pow-1) = *b;
	free(b);
	return 1;
}

....

	insert_brick(10, 0, 356, 0, 0);
	insert_brick(1, 10, 12, 145, 235);
	printf("%i %i \n", *buf_b,*(buf_b+1));//ок
	printf("%i %i", *(buf_b+2), *(buf_b + 3));//bug
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38687409
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже так можно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
struct Brick* create_brick(unsigned short Damage, unsigned short Matherial, unsigned int x, unsigned int y, unsigned int z)
{
	struct Brick* b = (struct Brick*)malloc(sizeof(struct Brick));
	b->value = Damage + (Matherial << 5);
	b->coord = x + (y << 10) + (z << 20);
	return b;
}

int insert_brick(unsigned short Damage, unsigned short Matherial, unsigned int x, unsigned int y, unsigned int z)
{
	buf_pow++;
	buf_b = (struct Brick*)realloc(buf_b, buf_pow*Brick_pow);
	*(buf_b + buf_pow - 1) = *create_brick(Damage, Matherial, x, y, z);
	return 1;
}
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38687458
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
malloc() вижу, а вот где free к нему? Все-таки стандартная куча вряд ли хорошо перенесет одновременно столько утечек и realloc-ов. И это если забыть обо всей остальной программе, которая тоже может кучей пользоваться.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38687472
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wstmalloc() вижу, а вот где free к нему? Все-таки стандартная куча вряд ли хорошо перенесет одновременно столько утечек и realloc-ов. И это если забыть обо всей остальной программе, которая тоже может кучей пользоваться.

Это часть программы, не волнуйтесь, дальше он есть. Лучше подскажите почему не добавляется второй элемент )
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38687939
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЛучше подскажите почему не добавляется второй элемент )

Что еще за "buf_b + 3" когда в buf_b всего 2 элемента? Тут может быть индекс только 0 и 1
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38688121
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дурной совсем. Верно ведь. Я и записываю неправильно.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38690036
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Мне думается процедуру поиска можно немного оптимизировать.

Код: plaintext
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.
struct Brick {
	int value;//(Damage,Matherial)
	int coord;//(x,y,z)
};


static struct Brick* buf = NULL;
static unsigned buf_pow = 0;
static unsigned int Brick_pow = sizeof(struct Brick);
//Вспомогательный массив. В нём по возрастанию координат отсортированы блоки основного участка памяти buf
static int* sorted_array = NULL;

int view_Brick(struct Brick* b)
{
	if (!b)
	{
		//printf("\nItem not exist ");
		return -1;
	}
	int index = b - buf;
	int Damage = ((b->value) << 27) >> 27;
	int Matherial = (b->value) >> 5;
	int x = ((b->coord) << 22) >> 22;
	int y = ((b->coord) << 12) >> 22;
	int z = (b->coord) >> 20;
	printf("\nBrick %i has Damage = %i Matherial = %i ; COORDINATE = (%i, %i, %i)", index, Damage, Matherial, x, y, z);
	return 1;
}

//Если ничего не найдено функция возвращает NULL
struct Brick* searchBrick(struct Brick* buf_s,unsigned int buf_pow, int x,int y,int z)
{
	int search_coord = x + (y << 10) + (z << 20);
	if (buf_pow == 0 || (buf_s+sorted_array[0])->coord > search_coord || (buf_s + sorted_array[buf_pow - 1])->coord < search_coord)
	{
		printf("\nItem not found ");
		return NULL;
	}
	unsigned int s = 0;
	unsigned int e = buf_pow - 1;
	unsigned int m = (buf_pow - 1) / 2;
	while (e>s)
	{
		if (search_coord < (buf_s+sorted_array[m])->coord)
		{
			e = m - 1;
		}
		else if (search_coord >(buf_s + sorted_array[m])->coord)
		{
			s = m+1;
		}
		else
		{
			view_Brick(buf_s + sorted_array[m]);
			return (buf_s + sorted_array[m]);//возвращаю указатель на искомый элемент
		}
		m = s + (e - s) / 2;
	}
	if (search_coord == (buf_s + sorted_array[m])->coord)
	{
		view_Brick(buf_s + sorted_array[m]);
		return (buf_s + sorted_array[m]);//возвращаю указатель на искомый элемент
	}
	printf("\nItem not found ");
	return NULL;
}

struct Brick* create_brick(unsigned short Damage, unsigned short Matherial, unsigned int x, unsigned int y, unsigned int z)
{
	struct Brick* b = (struct Brick*)malloc(sizeof(struct Brick));
	b->value = Damage + (Matherial << 5);
	b->coord = x + (y << 10) + (z << 20);
	return b;
}

int insert_brick(unsigned short Damage, unsigned short Matherial, unsigned int x, unsigned int y, unsigned int z)
{
	//Проверка на то, что элемент с такими координатами уже существует
	if (searchBrick(buf, buf_pow, x, y, z)!=NULL)
	{
		printf("\n(%i  %i  %i)This item already exists \n", x, y, z);
		return -1;
	}

	//Добавление элемента
	buf_pow++;
	buf = (struct Brick*)realloc(buf, buf_pow*Brick_pow);
	*(buf + buf_pow - 1) = *create_brick(Damage, Matherial, x, y, z);

	//Переиндексация вспомогательного массива
	sorted_array = (int*)realloc(sorted_array,buf_pow*4);
	int right = buf_pow - 1;
	for (int left = 0; left < buf_pow - 1; left++)
	{
		unsigned int cur_index = *(sorted_array + left);
		if ((buf + cur_index)->coord > x + (y << 10) + (z << 20))
		{
			for (; right > left; right--)
			{
				*(sorted_array + right) = *(sorted_array + right - 1);
			}
		}
	}
	*(sorted_array + right) = buf_pow - 1;
	return 1;
}



PS Вчера начал читать первый том Кнута. Товарищ принес, прочитал уже 50 страниц, и выполнил часть упражнений. Очень здорово написано с юмором и вообще теперь она мне нравится больше остальных книг по программированию C:
Изначально математика, потому читать и делать упражнения пока просто. Понравилось что уже на 30 странице вроде я встретил словосочетание неподвижная точка, этого достаточно чтобы понять что книга не дерьмо, и её mast have прочитать . 2,56 за ошибку тоже здорово, я кстати первые 10 секунд не мог понять почему такая сумма :D А над упражнением доказать теорему Ферма, я смеялся минут 10 ахахахах. Впрочем кому я рассказываю, думаю среди нас нет таких ужс
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38691298
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя лучше разделить функции search и read.

Код: plaintext
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.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

struct Brick {
	int value;//(Damage,Matherial)
	int coord;//(x,y,z)
};


static struct Brick* buf = NULL;
static unsigned buf_pow = 0;
static unsigned int Brick_pow = sizeof(struct Brick);
//Вспомогательный массив. В нём по возрастанию координат отсортированы блоки основного участка памяти buf
static int* sorted_array = NULL;

int view_Brick(struct Brick* b)
{
	if (!b)
	{
		printf("\nItem not exist ");
		return -1;
	}
	int index = b - buf;
	int Damage = ((b->value) << 27) >> 27;
	int Matherial = (b->value) >> 5;
	int x = ((b->coord) << 22) >> 22;
	int y = ((b->coord) << 12) >> 22;
	int z = (b->coord) >> 20;
	printf("\nBrick %i has Damage = %i Matherial = %i ; COORDINATE = (%i, %i, %i)", index, Damage, Matherial, x, y, z);
	return 1;
}

//Если ничего не найдено функция возвращает NULL
struct Brick* searchBrick(struct Brick* buf_s,unsigned int buf_pow, int x,int y,int z)
{
	int search_coord = x + (y << 10) + (z << 20);
	if (buf_pow == 0 || (buf_s+sorted_array[0])->coord > search_coord || (buf_s + sorted_array[buf_pow - 1])->coord < search_coord)
	{
		return NULL;
	}
	unsigned int s = 0;
	unsigned int e = buf_pow - 1;
	unsigned int m = (buf_pow - 1) / 2;
	while (e>s)
	{
		if (search_coord < (buf_s+sorted_array[m])->coord)
		{
			e = m - 1;
		}
		else if (search_coord >(buf_s + sorted_array[m])->coord)
		{
			s = m+1;
		}
		else
		{
			return (buf_s + sorted_array[m]);//возвращаю указатель на искомый элемент
		}
		m = s + (e - s) / 2;
	}
	if (search_coord == (buf_s + sorted_array[m])->coord)
	{
		return (buf_s + sorted_array[m]);//возвращаю указатель на искомый элемент
	}
	return NULL;
}

struct Brick* create_brick(unsigned short Damage, unsigned short Matherial, unsigned int x, unsigned int y, unsigned int z)
{
	struct Brick* b = (struct Brick*)malloc(sizeof(struct Brick));
	b->value = Damage + (Matherial << 5);
	b->coord = x + (y << 10) + (z << 20);
	return b;
}

int insert_brick(unsigned short Damage, unsigned short Matherial, unsigned int x, unsigned int y, unsigned int z)
{
	//Проверка на то, что элемент с такими координатами уже существует
	if (searchBrick(buf, buf_pow, x, y, z)!=NULL)
	{
		printf("\n(%i  %i  %i)This item already exists \n", x, y, z);
		return -1;
	}

	//Добавление элемента
	buf_pow++;
	buf = (struct Brick*)realloc(buf, buf_pow*Brick_pow);
	*(buf + buf_pow - 1) = *create_brick(Damage, Matherial, x, y, z);

	//Переиндексация вспомогательного массива
	sorted_array = (int*)realloc(sorted_array,buf_pow*4);
	int right = buf_pow - 1;
	for (int left = 0; left < buf_pow - 1; left++)
	{
		unsigned int cur_index = *(sorted_array + left);
		if ((buf + cur_index)->coord > x + (y << 10) + (z << 20))
		{
			for (; right > left; right--)
			{
				*(sorted_array + right) = *(sorted_array + right - 1);
			}
		}
	}
	*(sorted_array + right) = buf_pow - 1;
	return 1;
}

int read_brick(struct Brick* buf_s, unsigned int buf_pow, unsigned int x, unsigned int y, unsigned int z)
{
	struct Brick* b = searchBrick(buf, buf_pow, x, y, z);
	view_Brick(b);
	return 1;
}


int main(int argc, char** argv)
{
	printf("\nTest INSERT \n");
	insert_brick(10, 90, 356, 12, 1010);
	insert_brick(1, 5, 12,189 , 981);
	insert_brick(15, 50, 12, 189, 982);
	insert_brick(12, 32, 0, 189, 32);
	insert_brick(12, 32, 0, 0, 1);
	insert_brick(12, 32, 0, 0, 1);
	for (int i = 0; i < buf_pow; i++)
	{
		view_Brick(buf + i);
	}

	printf("\n\nTest sort() \n");
	for (int i = 0; i < buf_pow; i++)
	{
		printf("%i\n", *(sorted_array + i));
	}

	printf("\n\nTest READ \n");
	read_brick(buf, buf_pow, 0, 0, 0);
	read_brick(buf, buf_pow, 356, 12, 1010);
	read_brick(buf, buf_pow, 12, 189, 981);
	read_brick(buf, buf_pow, 12, 189, 982);
	read_brick(buf, buf_pow, 0, 189, 32);
	read_brick(buf, buf_pow, 0, 0, 1);
	read_brick(buf, buf_pow, 300, 300, 300);

	free(buf);
}
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38847521
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги. Я решил обобщить SWAP(...) на базе xor.

Только добавил своё условие. Для более чем 2 аргументов
SWAP должен выполнять ротацию (вращение) всех аргументов.
Вот что получилось.

Код: plaintext
1.
2.
3.
4.
5.
6.
void rotateBack(int& i1,int& i2,int& i3,int& i4){
        i1^=i2;
        i2^=i3;
        i3^=i4;
        i4^=i1;
}



Nx1x2x3x4Comment11234OK!23177326054465152343OK! but, x4=x1^x461772760548651293431 OK! But.... e.t.c.107726 110546125123134317 147260155465161234OK!

За 16 итераций вектор из 4 элемнетов полностью делает поворот.

При этом.

- В некоторых фазах можно угадать фрагменты повёрнутого
неполного вектора.

- В методе есть некая определённая криптографическая
самодостаточность. Вектор сам является ключом шифрования
по отношению к самому себе. Если вектор из 1 млн элементов
будет развёрнут 500 тыс раз то для его восстановления в любом
случае нужно будет провести еще 500 тыс разворотов. Либо
поискать более быстрый способ возврата вектора в начальное
стартовое состояние.
...
Рейтинг: 0 / 0
11 сообщений из 111, страница 5 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]