Pull to refresh

Иногда ответ не «42»

Перспективный мониторинг corporate blog Abnormal programming *C++ *C *
Доброй вам пятницы, хабралюди. У меня с друзьями есть такая традиция — мы собираемся и вместе программируем. Раньше у нас такая работа была, а сейчас уже просто традиция — кодобредогенерация. Мы выбрали несложную задачку и нарисовали решений кто во что горазд. Код будет ближе к концу статьи, но не спешите листать вниз, надо же сначала объяснить, что это за код и как мы пришли к нему.

Сама задача — получить число 0x17 самым внезапным образом.


Внимание! Данный пост оскорбляет чувство прекрасного и практики программирования на C. Читайте, воспринимайте и комментируйте на свой страх и риск.


Вы любите магические числа в коде? Вот бывает смотришь какой-то код и видишь a = b ^ 7. Почему именно 7? Что это за число, откуда оно взялось, что означает? Столько много вопросов и так мало ответов, если кто-то не утрудился комментарием. Есть несколько способов разрешить неопределенность такого рода:

  1. Оставить комментарий. Но комменты для слабаков — не наш путь.
  2. Сделать переменную или макрос с говорящим именем. a = b ^ HEARTBEAT_MASK_BYTE. Уже неплохо, но можно же и лучше, не так ли?
  3. Показать вычислениями путь, который привел к данному числу. Вот! Это отличный способ. Но не всегда применимый, как, например, в рассматриваемом коде. В нем 7 — это законченный и самостоятельный элемент, который не является результатом каких-то операций.

Зачем рассматривать еще какие-то способы? Берем последний и в путь! Но, как я сказал, есть проблема — не всегда есть адекватный способ вычислениями показать путь к числу. Но задача стояла избавиться от магического числа, а не сделать это логично. Более того, доведем задачу до абсурда — будем получать числа максимально непонятным образом.

Программно-аппаратный комплекс в виде вызова функции rand() постановил, что избавляться мы будем от магического числа 0x17.

Коллектив погроммистов в составе меня, Viscount и [УДАЛЕНО] приступил к творчеству.
0х17 способов получить 0x17:

	int Ox01 = ~-~-~-~-~-~-~-~-~-' ';
	int Ox02 = ((!true)["true"]-(false)["FALSE"])>>true;
	int Ox03 = 'X'/2/2^!*"";
	int Ox04 = ('0'>>!*"")-!*"";
	int Ox05 = (~'!'-~'~')>>!*"">>(2==1==0);
	int Ox06 = ('|'||'|'|'|')["||||||||"]%*"error";
	int Ox07 = '.'>>!false;
	int Ox08 = '\\'>>('!'>>(1<<2));
	int Ox09 = '/'-'/'/'/'>>'/'/'/';
	int Ox0a = (*"")["yes"]^(*"")["no"];
	int Ox0b = *"yes"^*"no";
	int Ox0c = '0'/2-!*"";
	int Ox0d = ((!'!'+'+')>>true)+(true<<true);
	int Ox0e = (-~true^!false)*(true<<(-~true|!false))-!false;
	int Ox0f = '!'-'^'%*"*";
	int Ox10 = -~*" L"^-~*"5Z";
	int Ox11 = *"Totally" -* "not" +* "0x17" + true;
	int Ox12 = -~!*""*-~!*""*-~!*""*-~!*""*-~!*""+~!*""*-~!*""*-~!*""-true;
	int Ox13 = -compl(-compl true xor true)<<-compl true|'8'>>('1'^'2');
	int Ox14 = '^'>>('<'^'>');
	int Ox15 = *"'"-(' '>>!0);
	int Ox16 = '_'>>-~1;
	int Ox17 = 010-001+010+010;

Для сомневающихся в том, что указанная задача выполнена верно — ссылка на ideone.

Упражнения, направленные на разбор тех или иных действий, я оставляю в качестве собственной деградации читателю. Но при появлении вопросов готов ответить на них в комментариях. Там же призываю всех желающих демонстрировать свои способы выстрелить себе в ногу сделать рокетжамп.
Tags:
Hubs:
Total votes 42: ↑40 and ↓2 +38
Views 19K
Comments Comments 38

Information

Founded
Location
Россия
Website
amonitoring.ru
Employees
101–200 employees
Registered