Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman / 25 сообщений из 111, страница 1 из 5
24.06.2014, 03:55
    #38677987
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
Здравствуйте.
Сегодня нашёл интересный код, сейчас разбираю его.
Код: 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
24.06.2014, 03:57
    #38677989
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
Да, и с переменной " к ", тут видимо побочный эффект, то есть идёт изменение самой переменной, и ещё присваивание.
...
Рейтинг: 0 / 0
24.06.2014, 04:02
    #38677990
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
3. Далее идёт
Код: plaintext
1.
for (h = g; ++h);



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


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




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

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

Это как в футболе. Если играть со слабыми соперниками и всегда на идеальном газоне никогда не научишься играть хорошо.
...
Рейтинг: 0 / 0
24.06.2014, 04:40
    #38678000
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
2 вопрос, сам ответил. Не равносильно относительно переменной b
...
Рейтинг: 0 / 0
24.06.2014, 04:57
    #38678001
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
Отформатировал.
Код: 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
24.06.2014, 07:16
    #38678026
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
Рефакторинг первых строк в первом приближении,
Код: 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
24.06.2014, 08:22
    #38678045
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
Код: 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
24.06.2014, 09:37
    #38678102
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
SashaMercuryAnatoly Moskovsky Какой смысл разбирать такие программы?

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

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


int был, а не char.

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

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

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



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

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

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

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

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

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

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

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

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

Это примерно как тренироваться жонглировать тенисным мячем чтобы хорошо играть теннис :)
...
Рейтинг: 0 / 0
25.06.2014, 02:38
    #38679156
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
Код: 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
25.06.2014, 02:44
    #38679157
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
Anatoly Moskovsky, а сколько времени потребуется хорошему разработчику(не K&R конечно, но очень хорошему) чтобы разобраться в том что делает этот код и сказать что делает эта программа ?
...
Рейтинг: 0 / 0
25.06.2014, 03:30
    #38679161
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
Вот исправленная первая треть кода с правильными комментариями

Код: 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
25.06.2014, 04:12
    #38679167
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
Вторая часть кода. Вот как с ней лучше работать. Я создал функцию отображения

Код: 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
25.06.2014, 04:29
    #38679169
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
Остался вопрос только по этой сточке:
Код: 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
25.06.2014, 04:37
    #38679171
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman
SashaMercuryAnatoly Moskovsky, а сколько времени потребуется хорошему разработчику(не K&R конечно, но очень хорошему) чтобы разобраться в том что делает этот код и сказать что делает эта программа ?
Я могу только сказать, сколько времени потребуется чтобы убедить разработчика разбираться в таком.
Много. :)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анализ программного кода. International Obfucated C Code Contest. 1984. By Mike Laman / 25 сообщений из 111, страница 1 из 5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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