powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
111 сообщений из 111, показаны все 5 страниц
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38677987
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Сегодня нашёл интересный код, сейчас разбираю его.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
a[900];		b;c;d=1		;e=1;f;		g;h;O;		main(k,
l)char*		*l;{g=		atoi(*		++l);		for(k=
0;k*k<		g;b=k		++>>1)		;for(h=		0;h*h<=
g;++h);		--h;c=(		(h+=g>h		*(h+1))		-1)>>1;
while(d		<=g){		++O;for		(f=0;f<		O&&d<=g
;++f)a[		b<<5|c]		=d++,b+=	e;for(		f=0;f<O
&&d<=g;		++f)a[b		<<5|c]=		d++,c+=		e;e= -e
;}for(c		=0;c<h;		++c){		for(b=0		;b<k;++
b){if(b		<k/2)a[		b<<5|c]		^=a[(k		-(b+1))
<<5|c]^=	a[b<<5		|c]^=a[		(k-(b+1		))<<5|c]
;printf(	a[b<<5|c	]?"%-4d"	:"    "		,a[b<<5
|c]);}		putchar(	'\n');}}	/*Mike		Laman*/



Собственно процитировал. Синтаксис и форматирование сохранены.

Начал разбирать, привожу свою часть кода
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
a[900];//тут компилятор сразу ругается, предполагаю что в 1984 если не указывалчся тип данных, по умолчанию был
//например char. Хотя Си обладал явной типзацией ? Или нет.
b;
c;
e = 1;
f;
g;
h;
O;


int main(k,char** l)
{
	{
		g = atoi(*++l); //второй параметр(после имени программы) на входе увеличенный на 1. Целое число
		for (k = 0; k*k < g; b = k++ >> 1);
	}
}



1. Какой тип данных у тех переменных у которых не был указан тип данных ? Ранее такое действительно возможно ?
2.
Код: plaintext
1.
b = k++ >> 1

равносильно
Код: plaintext
1.
(k>>1)+1

? На всякий случай спросил.

Не говорите мне пожалуйста что делает этот код, если вам сразу всё понятно.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38677989
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и с переменной " к ", тут видимо побочный эффект, то есть идёт изменение самой переменной, и ещё присваивание.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38677990
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3. Далее идёт
Код: plaintext
1.
for (h = g; ++h);



Не хватает оператора ; в for. Или так тоже ранее можно было ?
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38677992
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSна входе увеличенный на 1. Целое число


Это бред. Это ведь указатель сдвигается с имени программы. Я это в принципе написал сразу, а затем бред приписал.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38677995
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury3. Далее идёт
Код: plaintext
1.
for (h = g; ++h);




Не хватает оператора ; в for. Или так тоже ранее можно было ?
Такого там нет.
Есть такое "for(h= 0;h*h<= g;++h)"

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

Это как в футболе. Если играть со слабыми соперниками и всегда на идеальном газоне никогда не научишься играть хорошо.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38678000
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 вопрос, сам ответил. Не равносильно относительно переменной b
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38678001
Фотография 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.
#include <stdlib.h>
#include <stdio.h>

int a[900];//тут компилятор сразу ругается, предполагаю что в 1984 если не указывалчся тип данных, по умолчанию был
//например char. Хотя Си обладал явной типзацией ? Или нет.
int b;
int c;
int d = 1;
int e = 1;
int f;
int g;
int h;
int O;


int main(int k, char** l)
{
	g = atoi(*++l);		
	for (k =0; k*k<	g; b = k++ >> 1); 
	for (h = 0; h*h <=g; ++h);		
	--h; 
	c = ((h += g>h*(h + 1)) - 1) >> 1;
	
	while (d <= g)
	{
		++O; 
		for (f = 0; f<O&&d <= g; ++f)
			a[b << 5 | c] = d++,b += e; 
		for (f = 0; f<O&&d <= g;++f)
			a[b << 5 | c] = d++, c += e; 
		e = -e;
	}

	for (c = 0; c<h; ++c)
	{
		for (b = 0; b<k; ++b)
		{
			if (b<k/2) a[b << 5 | c] ^= a[(k - (b + 1))<< 5 | c] ^= a[b << 5 | c] ^= a[(k - (b + 1)) << 5 | c]; 
			printf(a[b << 5 | c] ? "%-4d" : "    ", a[b <<5|c]);
		}		
		putchar('\n');
	}
}
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38678026
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рефакторинг первых строк в первом приближении,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	g = atoi(*++l);//считываем в второй параметр из строки аргументов (1 параметр - имя программы)		
	for (k = 0; k*k< g; b = k++ >> 1);//k ближайший целый корень из числа на входе программы. b=(k-1-(k-1)%2)/2 
	//Две строчки ниже можно заменить на h=k-1
	//h=k-1
	for (h = 0; h*h <=g; ++h);		
	--h;

	//(g>h*(h + 1)) ? h++ : false;
	//c = (h - 1) >> 1;
	c = ((h += g>h*(h + 1)) - 1) >> 1;//Корректировки над h, инициализация с. Я бы заменил эту строчку двумя строчками выше



Хотя тут ещё можно упростить всё что касается h.

Пока те замены что я предлагаю верны ?
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38678045
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	while (d <= g)
	{
		++O; 
		for (f = 0; f < O && d <= g; ++f)
		{
			a[b << 5 | c] = d++, b += e;
		}
		for (f = 0; f<O && d<=g;++f)
			a[b << 5 | c] = d++, c += e; 
		e = -e;
		printf("O=%i \n", O);
	}



В этом участке кода
Код: plaintext
1.
a[b << 5 | c] = d++, b += e;


1.В элемент массива записывается d
2. Происходит инкримент d
3. К b добавляется e

Так ?
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38678102
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryAnatoly Moskovsky Какой смысл разбирать такие программы?

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

Это абсолютный бред. И это высказывание, и такие состязания.
Кроме как для развлечения они ни для чего не нужны.
Я уверен, что только для этого эти соревнования и были придуманы.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38678104
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
int a[900];//тут компилятор сразу ругается, предполагаю что в 1984 если не указывалчся тип данных, по умолчанию был
//например char. Хотя Си обладал явной типзацией ? Или нет.


int был, а не char.

Это в классическом K&R C было. Если сейчас включить такой режим, напр. в GCC, думаю, скомпилируется.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38678156
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да написал бы Достоевский Идиота если бы он не читал Гете, Бальзака и Гофмана ? Там похлеще чем этот код.
Неужели все считают что такой код не нужен и не полезен ???
Я считаю крайне полезен.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38678161
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ считаю крайне полезен.Чем? Возможностью "залезть на шкаф"?
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38678309
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНеужели все считают что такой код не нужен и не полезен ???куда полезней было бы ознакомиться вот с чем: тынц
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38678399
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 24.06.2014 11:31, SashaMercury wrote:

> Неужели все считают что такой код не нужен и не полезен ???
> Я считаю крайне полезен.

Да, не нужен и не очень полезен.
Читать и разбирать такой код отчасти конечно полезно, чтобы возможно
уточнить какие-то аспекты языка, которые в реальной жизни никогда и не
используются. Но польза в итоге весьма мала.



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38678408
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДа написал бы Достоевский Идиота если бы он не читал Гете, Бальзака и Гофмана ? Там похлеще чем этот код.
Неужели все считают что такой код не нужен и не полезен ???
Я считаю крайне полезен.
Саш, тебя хочется кинуть на какой-то полезный проект. А то зря киловатты и лошадиные
силы тратишь.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38678623
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov Чем? Возможностью "залезть на шкаф"?
если человек будет ориентироваться в таком коде, то насколько легко ему будет читать обычный код, находить в нём ошибки ? Прекрасная разминка для головы. Я понимаю что такое рефакторинг, но не знаю наверняка насколько это актуально. Думаю что актуально, читая такой код, и транслируя его в аналогичный, на том-же языке, человек улучшает свои способности в этом разделе программирования. Да и вообще, этот код очень красивый. Его просто приятно разбирать. Мне приятно.

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

Код, чужой, разный, хороший, плохой, читать нужно.

Вы говорите развлечения ? А как-же без этого ;) Я не сомневаюсь что в глубине души вам такой код тоже нравится, и вам самим может быть и хочется поразвлечься и понять что он делает ;)

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

mayton, с большой радостью участвовал бы в каком-нибудь проекте. Только моих знаний скорее всего слишком мало, пока что.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38678655
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryесли человек будет ориентироваться в таком коде, то насколько легко ему будет читать обычный код, находить в нём ошибки ? Прекрасная разминка для головы.

Это не плохой код.
Это код специально написанный чтобы запутать. Чем запутаннее тем лучше.

А плохой код, это код написан плохо неспециально, и чаще всего его автор и не подозревает что код плохой.

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

Это примерно как тренироваться жонглировать тенисным мячем чтобы хорошо играть теннис :)
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679156
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
	while (d <= g)
	{
		++O;
		for (f = 0; f < O && d <= g; ++f)
		{
			a[b << 5 | c] = d++;
			b += e;
		}
		for (f = 0; f < O && d <= g; ++f)
		{
			a[b << 5 | c] = d++;
			c += e;
		}
		e = -e;
		//printf("O=%i b=%i c=%i e=%i\n", O,b,c,e);
	}



можно ли упростить этот участок кода ? Как я понял, тут происходит какой-то алгоритм сохранения всех чисел до g включительно. Обращение к элементу идёт через "маску" a[b << 5 | c]. b и с принимают значение от 0 до до h. Где h это целая часть корня g(округление в меньшую сторону).
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679157
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, а сколько времени потребуется хорошему разработчику(не K&R конечно, но очень хорошему) чтобы разобраться в том что делает этот код и сказать что делает эта программа ?
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679161
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот исправленная первая треть кода с правильными комментариями

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	g = atoi(*++l); 		
	//k = sqrt(g) в большую сторону. b=(k-1-(k-1)%2)/2 
	for (k = 0; k*k< g; k++);//количество столбцов
	b = (k - 1) >> 1;

	(g>(k - 1)*k) ? h = k : h = k - 1;//количество строк
	c = (h - 1) >> 1;
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679167
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вторая часть кода. Вот как с ней лучше работать. Я создал функцию отображения

Код: plaintext
1.
2.
3.
4.
int tr1(int x, int y)
{
	return (x << 5 | y);
}



Вот так теперь выглядит вторая часть кода

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
	while (d <= g)
	{
		++O;
		for (f = 0; f < O && d <= g; ++f)
		{
			a[tr1(b, c)] = d++;
			b += e;
		}
		for (f = 0; f < O && d <= g; ++f)
		{
			a[tr1(b,c)] = d++;
			c += e;
		}
		e = -e;
	}



А если нарисовать в каком порядке она заполняет массив всеми числами до g включительно, относительно параметров b and c , и классической матрицы a_00-верхлево, a_hk-низправо, вот что мы увидим
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679169
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Остался вопрос только по этой сточке:
Код: plaintext
1.
if (b<k/2) a[b << 5 | c] ^= a[(k - (b + 1))<< 5 | c] ^= a[b << 5 | c] ^= a[(k - (b + 1)) << 5 | c]; 



все операции делать слева направо ?
сначала
Код: plaintext
1.
a[b << 5 | c] ^= a[(k - (b + 1))<< 5 | c]



затем результат побитово на
Код: plaintext
1.
a[b << 5 | c] 



и тд ?
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679171
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryAnatoly Moskovsky, а сколько времени потребуется хорошему разработчику(не K&R конечно, но очень хорошему) чтобы разобраться в том что делает этот код и сказать что делает эта программа ?
Я могу только сказать, сколько времени потребуется чтобы убедить разработчика разбираться в таком.
Много. :)
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679172
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, я ведь по-моему могу побитовые исключающие или ставить в любом порядке, результат не изменится ? Так ведь ? Значит это выражение можно упростить !
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679173
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или нельзя..тогда всё в нулях будет. Слишком просто. Видимо я неправильно понимаю эту строчку. Подскажите пожалуйста
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679180
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего, такой код

Код: plaintext
1.
2.
3.
4.
	int x = 100;
	int y = 21;
	x ^= y ^= x ^= y;
	printf("%i %i \n", x, y);



будет менять местами значения любых двух элементов, этакий swap. А почему ? Не очень понимаю очередность действий в данном случае
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679181
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
int x = 100;
	int y = 21;
	x ^= y ^= x ^= y;
	printf("%i %i \n", x, y);



Я кажется понял!! Код нужно читать с конца, для этой строки:
1. x set x^y//new_x
2. y set y^new_x=y^x^y=x//new_y
3. x set new_x^new_y//x^y^y^x^y=x^y^x=y//new_x

раскладка тупит на клавиатуре.

Так ??А почему так ?
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679186
Фотография 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.
#include <stdlib.h>
#include <stdio.h>

int a[900];
int b;
int c;
int d = 1;
int e = 1;
int f;
int g;
int h;
int O;

int tr(int x, int y)
{
	return (x << 5 | y);
}


int main(int k, char** l)
{
	//считываем в второй параметр из строки аргументов
	g = atoi(*++l); 		
	//k = sqrt(g) в большую сторону. b=(k-1-(k-1)%2)/2 
	for (k = 0; k*k< g; k++);//количество столбцов
	b = (k - 1) >> 1;

	(g>(k - 1)*k) ? h = k : h = k - 1;//количество строк
	c = (h - 1) >> 1;
	
        //Заполняем массив
	while (d <= g)
	{
		++O;
		for (f = 0; f < O && d <= g; ++f)
		{
			a[tr(b, c)] = d++;
			b += e;
		}
		for (f = 0; f < O && d <= g; ++f)
		{
			a[tr(b,c)] = d++;
			c += e;
		}
		e = -e;
	}


	for (c = 0; c<h; ++c)
	{
		for (b = 0; b<k; ++b)
		{
			if (b < k / 2)
			{
				//Зеркальное отражение левой и правой половины
				int temp = a[tr(k - (b + 1), c)];
				a[tr(k - (b + 1), c)] = a[tr(b, c)];
				a[tr(b, c)] = temp;
			}
			printf(a[b << 5 | c] ? "%-4d" : "    ", a[b <<5|c]);
		}
		putc('\n',stdout);
	}
}
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679188
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryТак ??А почему так ?Потому, что "исключающее или": (x XOR y) XOR y == x при любом y.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679189
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovПотому, что "исключающее или": (x XOR y) XOR y == x при любом y.

Это очевидно.

Вопрос был:
SSЯ кажется понял!! Код нужно читать с конца, для этой строки:
1. x set x^y//new_x
2. y set y^new_x=y^x^y=x//new_y
3. x set new_x^new_y//x^y^y^x^y=x^y^x=y//new

Так ??А почему так ?

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


Пока те замены что я предлагаю верны ?

Я не знаю, верны ли замены, не смотрел, но ты должен учитывать и то, что в таких программах немаловажным является эстетический эффект (или антиэффект), который возникает у читателя при чтении текста программы. Этот эффект твои "рефакторинги" могут нарушить.

Т.е. я это к тому, что там именно так было, возможно, написано именно для внешнего эффекта. А ты всё сломал.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679546
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саша, ты ГЛУБОКО НЕПРАВ.

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


Такой код никто никогда не напишет в боевых условиях.


авторПрекрасная разминка для головы.

Т.е. тебе голову больше нечем занять...
Ну, изучай С++, GoF, UML, -- полезнее будет в 1000 раз.

авторКод, чужой, разный, хороший, плохой, читать нужно.


Это --очень специальный вид кода, чтение которого может принести только ограниченную пользу и специфическое наслаждение.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38679899
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryРазбор строки я начал с конца, я не уверен что это так в данном конкретном случае, потому и спрашиваю, так ? ассоциативность операции присваивания .
Это если учебники/справочники не читать.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38680404
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Учебники читаю вроде. Только я почему-то искал операцию ^=. В том же K&R в таблице на странице 55
K&R= += -= ETC. RIGHTTOLEFT

А, я на "ETC" не обратил внимание. Теперь понятно

Re: Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
MasterZiv Ну, изучай С++, GoF, UML, -- полезнее будет в 1000 раз
Сделаю что-нибудь интересное на Си, и начну С++
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38680405
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я бы я не разобрал бы этот пример, разве узнал бы я такой красивой конструкции для свопа:

Код: plaintext
1.
x ^= y ^= x ^= y;



Ну разве она не красивая ?;)
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38680406
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И она, кстати, выполняется также за три действия, и может быть даже быстрее чем классика:
Код: plaintext
1.
2.
3.
4.
5.
6.
void swap(int* a,int* b)
{
   int t=*a;
   *a=*b;
   *b=t;
}
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38680409
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНу разве она не красивая ?;)красивая, но бессмысленная, инты обменивать редко когда требуется, да и читается плохо, по этой же причине. Редко - читай никогда ))
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38680411
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСделаю что-нибудь интересное на Си, и начну С++
Напишите парсер С.
Заодно и С выучите :)
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38680441
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercuryСделаю что-нибудь интересное на Си, и начну С++
Напишите парсер С.
Заодно и С выучите :)
Хорошая идея кстати. Одна из моих первых поделок на Си была прога по форматированию кода. Очень помогала в поиске непарных скобок.

SashaMercury, попробуй написать парсер, который превратит фарш из первого поста в более читаемый код с отступами, пробелами после разделителей и знаков и т.п. Т.е. прогу которая из 16209640 сделает 16209666 .
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38680446
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, Dima T
Спасибо за советы C:
Если честно, я сам об этом подсознательно думал. Вчера перед сном. Но я не был уверен что стоит, но раз вы оба советуете, то и правда стоит.
Сначала я сделаю то что предложил Дмитрий, а затем то что предложил Anatoly Moskovsky.

ps Только добью restrict и fopen, и начну.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38680845
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Я если чо пошутил. Если только у вас нет несколько месяцев свободного времени :)
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38680854
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сашик. Вот тебе пыщ по Хорьку
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38680945
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mayton, спасибо за ссылку )) я так понял вы шутите ;)

Анатолий(с телефона я замучаюсь вас на транслите называть, потому извините если вас зовут не так), на Си я найду время. Должен же я что-нибудь уже сделать. Только с fopen разберусь
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38680954
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет не шучу. Кст. многие разработчики слабо используют возможности хоря.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38681765
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 26.06.2014 02:50, SashaMercury wrote:

> Если я бы я не разобрал бы этот пример, разве узнал бы я такой красивой
> конструкции для свопа:
>
> x ^= y ^= x ^= y;
>
>
>
> Ну разве она не красивая ?;)


Красивая.

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

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

Кстати, о производительности.


auto other = y;
y = x;
x = other;

-- тут три операции. Точнее, три чтения и три записи.

в твоём 3 * 3 + 1 = 10 операций.
При этом одна из этих трёх операций ( одно чтение, XOR и одна запись )
ещё и задействует АЛУ. А при обычном swap оно может быть и без АЛУ.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38681768
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 26.06.2014 03:14, egorych wrote:

> красивая, но бессмысленная, инты обменивать редко когда требуется, да и
> читается плохо, по этой же причине. Редко - читай никогда ))

Ну ладно, не так уж и редко.
Любая сортировка.
А сортировка -- основа многих алгоритмов, да и сама часто используется.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38681770
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Спасибо за советы C:
> Если честно, я сам об этом подсознательно думал. Вчера перед сном. Но я
> не был уверен что стоит, но раз вы оба советуете, то и правда стоит.
> Сначала я сделаю то что предложил Дмитрий, а затем то что предложил
> Anatoly Moskovsky.


Я бы лучше сделал парсер другого языка сначала, попроще.
Типа XML-я или ещё более простое.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38681787
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сашок хочешь задачку подкину?
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38681840
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivКстати, о производительности.

auto other = y;
y = x;
x = other;

-- тут три операции. Точнее, три чтения и три записи.

в твоём 3 * 3 + 1 = 10 операций.
При этом одна из этих трёх операций ( одно чтение, XOR и одна запись )
ещё и задействует АЛУ. А при обычном swap оно может быть и без АЛУ.

Как вы умудрились насчитать десять операций???
Код: sql
1.
x ^= y ^= x ^= y;

эквивалентно
Код: sql
1.
2.
3.
x ^= y;
y ^= x; // y стало равным x-старое
x ^= y; // x стало равным y-старое

"Вычисление с присваиванием" - одна (логическая) операция.
"Физически" будет, скорее, всего, два чтения, две записи и три логические операции (в регистрах).
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38681876
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСашок хочешь задачку подкину?
Конечно :)
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38681924
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 27.06.2014 14:38, Basil A. Sidorov wrote:
> Автор: Basil A. Sidorov. MasterZiv
> Кстати, о производительности.
>
> auto other = y;
> y = x;
> x = other;
>
> -- тут три операции. Точнее, три чтения и три записи.
>
> в твоём 3 * 3 + 1 = 10 операций.
> При этом одна из этих трёх операций ( одно чтение, XOR и одна запись )
> ещё и задействует АЛУ. А при обычном swap оно может быть и без АЛУ.
>
> Как вы умудрились насчитать десять операций???
>
> x^= y^= x^= y;
>
> эквивалентно


x^= y -- читать x, читать y и выполнить XOR, результат записать в x.

И так три раза. Результат предыдущего вычисления (x в данном случае)
можно , конечно, не читатЬ, тогда следующие операции -- по 3 , а не по
4. А первая -- +1 даёт.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38681937
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это всё замечательно, но применительно к реальной жизни ваш пример - ничем не лучше цепочки xor-ов.
Если компилятор предоставляет swap(x, y) - именно эта функция и должна использоваться.
А превратит ли её компилятор в две пары push/pop или в загрузку/сохранение пары регистров - забота разработчиков этого компилятора.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38681963
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymaytonСашок хочешь задачку подкину?
Конечно :)
Вот тебе задача.

Есть игровой мир. В трёхмерных координатах. X,Y,Z.
Состоит из кирпичиков. Каждый кирпичик имеет координаты соотв от (0,0,0) до (1024,1024,1024).
Состояние кирпичика определяется 16-битным целым (shot). Кирпичик может быть:
- установлен/убран
- иметь повреждение от 0 до 15.
- иметь тип материала (256 типов в том числе стекло, дерево, бетон)

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

Необходима имплементация следующего интерфейса.
Код: plaintext
1.
2.
3.
4.
5.
6.
interface BrickWorld{

  void setBrick(int x,int y,int z,short value);
  short getBrick(int x,int y,int z);

}



Спецификация кирпичика
Код: plaintext
1.
2.
3.
4.
5.
struct Brick {
   unsigned short isSet: 3;    
   unsigned short Damage:4;    
   unsigned short Matherial:8;    
};


При этом надо помнить что память ограничена и по возможности не делать 3-d матриц.
Этот код должен работать на сервере где память - ограничена.

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

А почему "isSet: 3" когда всего 2 состояния "установлен/убран"?
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682029
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, да верно. Поправил.

Код: plaintext
1.
2.
3.
4.
5.
struct Brick {
   unsigned short isSet: 1;    
   unsigned short Damage:4;    
   unsigned short Matherial:8;    
};
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682031
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы хотите решить эту задачу не тратив 2^31 байт ? Я правильно понял ?
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682071
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, да. Не создавая 3-д матрицу. Исходим из предположения
что игровой мир будет заполнен не полностью.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682094
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я могу хранить в одномерном, размерностью 2^31. Но это не то, как я понял. То есть мы хотим хранить элементов столько, сколько есть непустых. Где isSet true. Уже гонят спать..подумаю, мне кажется это вполне реализуемо.
Спасибо за задачу :)
Ps
Я могу применить malloc дважды к одному указателю ? " Довыделить память "
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682095
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Размерностью 2^30
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682096
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ могу применить malloc дважды к одному указателю ? " Довыделить память "
realloc()
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682208
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 26.06.2014 03:14, egorych wrote:

> красивая, но бессмысленная, инты обменивать редко когда требуется, да и
> читается плохо, по этой же причине. Редко - читай никогда ))

Ну ладно, не так уж и редко.
Любая сортировка.
А сортировка -- основа многих алгоритмов, да и сама часто используется.
и часто ты сам сортировку пишешь? std::sort - и вуаля )))
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682247
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВот тебе задача...
Не издевайся, неподъемная задача. Он алгоритмы не изучил. Тут сортировки как минимум надо освоить.
Да и задача неполноценная, надо какую-то статистику по однотипным элементам ввести в условие, например сколько неиспользуемых элементов и т.д.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682332
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

А по мне - слишком простая (для Саши) :)
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682500
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как работать с value понятно, тут проблем нет. Нужно решить проблему с однозначно адресуемым расширяемым массивов, либо с тем как хранить эти кирпичи чтобы однозначно адресовать по xyz. Спецификацию кирпича расширять нельзя ?
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682501
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще подумать, и возможно как то использовать коды Грея или кривую Гильберта. Но вы не подсказывайте. Я только начал думать.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682574
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думай. Спецификацию кирпича я расширять не планирую. Ну даже если расширять то в крайнем случае
заменить short на int. Это не влияет принципально.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682634
Фотография 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.
#include <stdio.h>
#include <stdlib.h>

struct Brick {
   unsigned short isSet: 3;    
   unsigned short Damage:4;    
   unsigned short Matherial:8;    
};


int* buf;
int* c_buf=buf;

void setBrick(int x,int y,int z,int value)
{
	//выделяю память на value
	c_buf=(int*)realloc(buf,sizeof(buf)+sizeof(int));
	//записываем значение value
	*c_buf++=value;
	//выделяю память на координаты 
	c_buf=(int*)realloc(buf,sizeof(buf)+sizeof(int));
	*c_buf++=x+(y<<10)+(z<<20);
}

int getBrick(int x,int y,int z)
{
	for(int i=1;i<sizeof(buf)/sizeof(int);i+=2)//иду по чётным элементам(по адресам)
	{
		if(*(buf+i)==x+(y<<10)+(z<<20))
		{
			return *(buf+i);
		}
	}
	return -1;//в случае неудачи
}


int main(int argc, char** argv)
{
	printf("%i \n",sizeof(buf));
	setBrick(0,0,0,124);
	setBrick(1023,1024,1023,5675);
	printf("%i\n",sizeof(buf));
	return 0;
}



Очевидный минус(после исправления ошибки с выделением памяти), время доступа к элементу ~O(n). И второй минус, трачу в два раза больше памяти чем элементов.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682649
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но это конечно не то. Нужно(и скорее всего можно) по-другому решить эту задачу
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38682723
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваши sizeof(buf) возвращают размер указателя. Это, как максимум, восемь байт.
Хотите выделить память для массива элементов - определяетесь с размером и выделяете "размер * sizeof(тип)" байт.
Дополнительно определяетесь со способом определения размера массива. Чтобы использовать одно и ту же логику во всех частях программы.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38683093
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНо это конечно не то. Нужно(и скорее всего можно) по-другому решить эту задачу
Эту задачу можно решить тысячами способов. Код твой я еще не смотрел.
Но сходу предложу использовать Stdint.h для фиксации
типов данных. А такой фокус как sizeof(int) лучше вообще не использовать. Никогда.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38683130
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут как раз таки в первую очередь "никогда" - это к sizeof(buf), который типа int*. Это даже если вдруг забыть, что значение buf изначально используется не инициализированным. Да и O(n) на доступ к записям по координатам как-то слишком много.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38683274
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я только код исправлю. Пока что не проверяйте.

wstДа и O(n) на доступ к записям по координатам как-то слишком много.

Ну это предел сверху. Вот если бы я мог записывать в те адреса памяти что я хочу (в пределах той памяти что выделена), это было бы хорошо. Хотя что хорошего, вся программа была бы разбросана кусками. Пока что я не вижу другого варианта. Мне приходится хранить пару, значение и код координаты. И когда я хочу получить значение, очевидно что у меня происходит запрос
select value from table t where ID=' '. И потом max это количество строк
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38683276
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wstна доступ к записям по координатам как-то слишком много.

и не к записям, а к чтению!
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38683278
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНу это предел сверхуЭто не предел сверху. Это именно что оценка времени доступа при линейном поиске.Мне приходится хранить пару, значение и код координаты. И когда я хочу получить значение... то хранение в упорядоченном списке позволяет использовать двоичный поиск.
Правда, возникает задача обеспечения и поддержания этой самой упорядоченности.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38683286
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Re: Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
Basil A. Sidorov

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

Вы думали что мне это не пришло в голову после комментария от Дмитрия про сортировку ?
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38683288
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не думал. Я как чукча - что вижу, то и пою
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38683289
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryИ когда я хочу получить значение, очевидно что у меня происходит запрос
select value from table t where ID=' '. И потом max это количество строк
Ну раз вы привели аналогию с запросом к СУБД, то вам наверно не должно составить труда вспомнить, каким образом подобные запросы там оптимизируются до O(log n), а то и O(1) :)
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38683292
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov Я не думал. Я как чукча - что вижу, то и пою
я на вас не обзывался, извините если вы подумали что я критикую вас. Это был не ответ в стиле-отвалите, мне и так всё понятно, а ответ спокойным тоном- я это понимаю.

Anatoly Moskovsky, да я тут с памятью ещё разбираюсь. Что-то не так делаю.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38683293
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно выделять память в конец текущего массива ?
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38683300
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Она(среда выполнения) хотела чтобы я сразу выделил память на указатель
Код: plaintext
1.
int* buf=(int*)malloc(4);
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38683305
Фотография 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.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

struct Brick {
	unsigned short isSet : 3;
	unsigned short Damage : 4;
	unsigned short Matherial : 8;
};


int* buf=(int*)malloc(8);//сразу выделил память на два элемента: 1.value 2.Код координаты
int* c_buf = buf;
unsigned long int pow_buf = 2;

void setBrick(int x, int y, int z, int value)
{
	//записываем значения
	*c_buf++ = value;
	*c_buf++ = x + (y << 10) + (z << 20);//код координаты
	//выделяю память на следующий элемент
	pow_buf += 2;
	buf = (int*)realloc(buf, 2 + (pow_buf)* 4);
}

int getBrick(int x, int y, int z)
{
	for (int i = 1; i<pow_buf-2; i += 2)//иду по чётным элементам(по кодам координат)
	{
		if (*(buf + i) == x + (y << 10) + (z << 20))
		{
			return *(buf + i-1);
		}
	}
	return -1;//в случае неудачи
}


int main(int argc, char** argv)
{
	printf("Test setBrick()\n");
	setBrick(0, 0, 0, 125);
	setBrick(1023, 1024, 1023, 5678);
	setBrick(125, 512, 512, 10678);
	setBrick(125, 512, 512, 12678);
	for (int i = 0; i < pow_buf-2; i++)
	{
		printf("%i\n", *(buf+i));
	}
	printf("\nTest getBrick()");
	printf("\n%i ", getBrick(125, 125, 125));
	printf("\n%i \n", getBrick(125, 512, 512));
	
	free(buf);
}



Осталось разобраться с sizeof(), и оптимизировать поиск элемента
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38683665
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryРазобрался с памятью.
Код: plaintext
1.
int* buf=(int*)malloc(8);//сразу выделил память на два элемента: 1.value 2.Код координаты



Единственная проблема - это не С, а С++, потому что С не позволяет инициализировать глобальные переменные неконстантами

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

Этого я не знал. Спасибо.

Добавляю простую индексацию. Пришёл к выводу что функция SetBrick() должна возвращать что-то, вдруг мы добавляем два одинаковых кирпича. Да и вообще, теперь мне кажется что любая функция должна возвращать свой код, чтобы знать, успешно ли она выполнилась или нет. Может и ошибаюсь, но почему-то мне кажется что где-нибудь в канонах программирования написано-"каждая функция должна возвращать что-то"(-1 неудача, 1 всё ок) :D
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38684316
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Формирую блок таким образом:
1int - value
1int - код координаты
3int - номер по возрастранию
Потратил час на функцию, не продумав поиск. Таким образом в этом же блоке хранить номер (по возрастанию) нет смысла. Нужно выделять для этого отдельную область памяти. Вот функция, но сейчас буду переделывать её


Код: 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.
int* buf=(int*)malloc(12);//сразу выделил память на два элемента: 1.value 2.Код координаты
int* c_buf = buf;
unsigned long int pow_buf = 3;
unsigned int pow_block = 3;


int setBrick(int x, int y, int z, int value)
{
	//Проверка на то что такой элемент с такими координатами уже существует
	for (int i = 0; i < pow_buf - pow_block; i += pow_block)//иду по блокам
	{
		if (*(buf + i + 1) == x + (y << 10) + (z << 20))//сравниваю координаты
		{
			printf("\n(%i  %i  %i)This item already exists \n",x,y,z);
			return -1;
		}
	}

	//Индексация
	int new_index = (pow_buf-pow_block)/pow_block;//максимальный текущий индекс
	for (int i = 0; i < pow_buf - pow_block; i += pow_block)//иду по блокам
	{
		if (*(buf + i)>value)
		{
			if (*(buf + i + 2) < new_index)
			{
				new_index = *(buf + i + 2);
			}
			*(buf + i + 2)+=1;//перестраиваю индекс элемента
		}
	}
	*(c_buf + 2) = (new_index == (pow_buf - pow_block) / pow_block) ? new_index + 1 : new_index;//индекс нового элемента

	*c_buf = value;
	*(c_buf+1) = x + (y << 10) + (z << 20);//код координаты
	//выделяю память на следующий элемент
	pow_buf += pow_block;
	c_buf += 3;
	buf = (int*)realloc(buf, pow_buf* 4);
	return 1;
}
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38684328
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, тут плохой код. Мне уже даже циклы не нравятся тут. Не смотрите. В общем выложу как будет готово и проверено. А то выкладываешь, и видишь потом что можно сделать лучше.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38684347
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky Единственная проблема - это не С, а С++, потому что С не позволяет инициализировать глобальные переменные неконстантами

Если уж изучать С, так и компилировать наверно нужно компилятором С, а не С++.
А то такого наизучаете ...

Всё таки это проблема. Я думал что можно решить её позже, но мне не нравится что мне приходится выделять память сразу. Из-за этого приходится поддерживать две переменные up_block, count_block. Они несут одинаковый смысл практически, различие между ними как между де-юре и де-факто. Там две переменных с одной смысловой нагрузкой, тут две переменных, получите распишитесь плохой код:
Код: 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.
//Выделяю память на два элемента: 1.value 2.код координаты
unsigned long int count_block = 1;//количество блоков в основном массиве с парами значение-код координаты
unsigned long int up_block = count_block - 1;
unsigned int pow_block = 2;//мощность одного блока основго массива
int* buf=(int*)malloc(count_block*pow_block*4);



int setBrick(int x, int y, int z, int value)
{
	//Проверка на то что такой элемент с такими координатами уже существует
	for (int i = 0; i < up_block; i ++)
	{
		if (*(buf + i*pow_block + 1) == x + (y << 10) + (z << 20))
		{
			printf("\n(%i  %i  %i)This item already exists \n",x,y,z);
			return -1;
		}
	}
	//Запись блока нового элемента
	*(buf + up_block*pow_block) = value;
	*(buf + up_block*pow_block + 1) = x + (y << 10) + (z << 20);//код координаты
	//Выделяю память на следующий элемент
	count_block++;
	up_block++;
	buf = (int*)realloc(buf, count_block*pow_block* 4);
	return 1;
}


Не могу нормально индексацией заняться, пока не решу проблему с памятью, либо не решу что это невозможно сделать. Подскажите пожалуйста, как поступить чтобы не выделять лишнюю память ?
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38685106
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНе могу нормально индексацией заняться, пока не решу проблему с памятью, либо не решу что это невозможно сделать. Подскажите пожалуйста, как поступить чтобы не выделять лишнюю память ?
Я пока не ставлю задачи "уплотнения" памяти. Аллоцируй как удобно - потом попробуем
оценить потери на аллокациях.

Кстати нашёл статью. Самому интересно.
http://www.gamedev.net/page/resources/_/technical/general-programming/c-custom-memory-allocation-r3010
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38685297
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, спасибо, статью попозже посмотрю, вдруг там какая подсказка, хочу сам сделать так, как я пока могу, и только из своих размышлений, а потом почитаю как это делается правильно.


SSНе могу нормально индексацией заняться, пока не решу проблему с памятью, либо не решу что это невозможно сделать. Подскажите пожалуйста, как поступить чтобы не выделять лишнюю память ?

Вчера пока играл в футбол решил эту проблему частично. Мысль неожиданно пришла в голову.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38685302
Фотография 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.
//Описание основного массива
unsigned long int count_block = 0;//количество блоков в основном массиве с парами "значение(value)-код координаты" 
unsigned int pow_block = 2;//мощность одного блока основного массива
int* buf = (int*)malloc((count_block + 1)*pow_block * 4);//Основной массив. Какую-то память нужно сразу выделить, потому сразу выделяю

//Вспомогательный массив. В нём по возрастанию координат отсортированы блоки основного участка памяти buf
int* sorted_array = (int*)malloc((count_block + 1) * 4);//Какую-то память нужно сразу выделить, потому сразу выделяю


int setBrick(int x, int y, int z, int value)
{
	//Проверка на то что такой элемент с такими координатами уже существует
	for (int i = 0; i < count_block; i ++)
	{
		if (*(buf + i*pow_block + 1) == x + (y << 10) + (z << 20))
		{
			printf("\n(%i  %i  %i)This item already exists \n",x,y,z);
			return -1;
		}
	}//если совпаданий не найдёно, то функция продолжает работу
	
	//Выделение памяти на новый элемент
	count_block++;
	buf = (int*)realloc(buf, count_block*pow_block * 4);
	//Запись блока нового элемента в выделенную память
	*(buf + (count_block-1)*pow_block) = value;
	*(buf + (count_block-1)*pow_block + 1) = x + (y << 10) + (z << 20);//код координаты

	//Переиндексация вспомогательного массива sorted_array
	//Именование переменных ниже, а именно то что я придумал (хотя наверняка уже используют) назвать переменные в цикле r и l нравится мне настолько,
	//что я даже не вижу смысла делать тут комментарии. Код ниже очень красивый.
	sorted_array = (int*)realloc(sorted_array, count_block * 4);
	int r = count_block - 1;
	for (int l = 0; l < count_block-1; l++)
	{
		int num_block = *(sorted_array + l);
		if (*(buf + num_block*pow_block + 1)>x + (y << 10) + (z << 20))
		{
			for (; r > l; r--)
			{
				*(sorted_array + r) = *(sorted_array + r - 1);
			}
		}
	}
	*(sorted_array + r) = count_block - 1;

	return 1;
}




В этом куске кода
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
	//Переиндексация вспомогательного массива sorted_array
	//Именование переменных ниже, а именно то что я придумал (хотя наверняка уже используют) назвать переменные в цикле r и l нравится мне настолько,
	//что я даже не вижу смысла делать тут комментарии. Код ниже очень красивый.
	sorted_array = (int*)realloc(sorted_array, count_block * 4);
	int r = count_block - 1;
	for (int l = 0; l < count_block-1; l++)
	{
		int num_block = *(sorted_array + l);
		if (*(buf + num_block*pow_block + 1)>x + (y << 10) + (z << 20))
		{
			for (; r > l; r--)
			{
				*(sorted_array + r) = *(sorted_array + r - 1);
			}
		}
	}
	*(sorted_array + r) = count_block - 1;


, первоначально именовал переменные по которым бежит цикл как i и j. Но очень быстро догадался их назвать по нормальному. Чудесный кусок кода C: В кои века мне что-то понравилось у себя.

PS хотя сейчас я понял что l похожа на 1 (
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38685303
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и я подумал ещё. Мне кажется нужно по аналогии с СУБД реализовать все CRUD операции, и назвать их как :
createBrick(),readBrick(),updateBrick(),deleteBrick(). Или ошибаюсь ?
Но сначала нужно убедить что setBrick()(createBrick()), похожа на правду, и исходя из её работы дальше можно плясать
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38685306
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВчера пока играл в футбол решил эту проблему частично. Мысль неожиданно пришла в голову.Вот когда эта мысль тебе приснится, тогда можешь считать себя настоящим программистом. А футбол .... ну почти не считается, хотя и близко.


А пока подсказка: почитай о хеш функциях и хешированием с хвостами (не помню как это правильно называется).
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38685310
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl А пока подсказка: почитай о хеш функциях и хешированием с хвостами (не помню как это правильно называется).

спасибо. Только сначала сделаю как я могу сам, найду скорость на каждую операцию, а потом почитаю как это правильно делается.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38685366
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДа, и я подумал ещё. Мне кажется нужно по аналогии с СУБД реализовать все CRUD операции, и назвать их как :
createBrick(),readBrick(),updateBrick(),deleteBrick(). Или ошибаюсь ?
Но сначала нужно убедить что setBrick()(createBrick()), похожа на правду, и исходя из её работы дальше можно плясать
Для данной задачи - непринципиально будет ли setBrick или CRUD с кирпичами. И сама
постановка с СУБД - избыточна. Но дам подсказку. Кирпичи обычно стоят блоками или группами.

На этом можно соптимизировать хранение.
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38685369
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой кусок кода

Код: plaintext
1.
2.
3.
//Запись блока нового элемента в выделенную память
	*(buf + (count_block-1)*pow_block) = value;
	*(buf + (count_block-1)*pow_block + 1) = x + (y << 10) + (z << 20);//код координаты



я обычно записываю так

Код: plaintext
1.
2.
3.
        int *p = *(buf + (count_block-1)*pow_block);
        *p = value;
        *(p+1) = x + (y << 10) + (z << 20);
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38685910
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКирпичи обычно стоят блоками или группами.

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

Да и вообще, стреляет танк(не знаю откуда ассоциации с танками) в здание, верхний слой повреждён, а внутреннего значение value то-же. Нужно снова перестраивать массив. Нужно будет ввести норму для сортировки кубиков, но это в принципе не сложно, но всё-таки. Куча нюансов.
Код: plaintext
1.
2.
3.
int *p = *(buf + (count_block-1)*pow_block);
        *p = value;
        *(p+1) = x + (y << 10) + (z << 20);



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

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

По управлению памятью.
Отделите задачу по расширению массива (включая такую абстракцию как блоки) от собственно алгоритма использующего массив как контейнер.
Алгоритму вовсе не зачем оперировать таким понятием как блок из нескольких элементов массива, если он работает с одним элементом.
Поэтому рекомендую сделать такие функции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
struct Item {
  int x, y, z;
  int value;
};

// не нужно тут выделять память (тем более что в С это невозможно). 
// выделяйте либо при первом обращении, либо сделайте отдельную функцию инициализации
struct Item* array = NULL; 
int array_size = 0; // сколько логически выделено элементов
int array_mem_size = 0; //сколько физически выделено элементов (растет поблочно)

/** Возвращает указатель на элемент с указанным индексом или NULL если индекс за границами массива */
struct Item* get_item(int index);
/** Устанавливает значение элемента с указанным индексом. Расширяет массив если индекс за границами массива*/
void set_item(int index, struct Item* value);
/** Возвращает количество элементов */
int get_size();



А уже в вашем алгоритме работать с массивом только через эти функции.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
int setBrick(int x, int y, int z, int value)
{
	//Проверка на то что такой элемент с такими координатами уже существует
	for (int i = 0; i < get_size(); i ++)
	{
		struct Item* item = get_item(i);
		if (item->x == x && item->y == y ...) 
		{
			printf("\n(%i  %i  %i)This item already exists \n",x,y,z);
			return -1;
		}
	}
	
	//если совпаданий не найдёно, то добавляем в конец
	struct Item item = {x, y, z, value};
	set_item(get_size(), &item);
}


Обратите внимание, как резко упрощается код.

ЗЫ. Кстати а с чего вы решили, что если кирпич уже существует то set должно вернуть ошибку? Надо просто заменить старое значение новым :)
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38687398
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, спасибо. Кое что сейчас использую. А зачем хранить каждую координату отдельно ? Ведь хватит 4 байт для хранения всех координат
...
Рейтинг: 0 / 0
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
    #38687399
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже их хотел хранить в структуре, и спрашивал про это у mayton_a, но огн сказал что не предполагает менять структуру хранения данных. Потому не стал добавлять координаты в структуру.

SSКак работать с value понятно, тут проблем нет. Нужно решить проблему с однозначно адресуемым расширяемым массивов, либо с тем как хранить эти кирпичи чтобы однозначно адресовать по xyz. Спецификацию кирпича расширять нельзя ?


maytonСпецификацию кирпича я расширять не планирую. Ну даже если расширять то в крайнем случае
заменить short на int. Это не влияет принципально.
...
Рейтинг: 0 / 0
Анализ программного кода. 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
111 сообщений из 111, показаны все 5 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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