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

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

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

3lq-0kz1g78hxn6o0hudzmw0riq.jpeg


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


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

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


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

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

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

	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<>('1'^'2');
	int Ox14 = '^'>>('<'^'>');
	int Ox15 = *"'"-(' '>>!0);
	int Ox16 = '_'>>-~1;
	int Ox17 = 010-001+010+010;


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

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

Кстати, мы ищем Питон-разработчика, который умеет программировать понятнее чем я. Присоединяйтесь!

© Habrahabr.ru