Иногда ответ не «42»
Доброй вам пятницы, хабралюди. У меня с друзьями есть такая традиция — мы собираемся и вместе программируем. Раньше у нас такая работа была, а сейчас уже просто традиция — кодобредогенерация. Мы выбрали несложную задачку и нарисовали решений кто во что горазд. Код будет ближе к концу статьи, но не спешите листать вниз, надо же сначала объяснить, что это за код и как мы пришли к нему.
Сама задача — получить число 0×17 самым внезапным образом.
Внимание! Данный пост оскорбляет чувство прекрасного и практики программирования на C. Читайте, воспринимайте и комментируйте на свой страх и риск.
Вы любите магические числа в коде? Вот бывает смотришь какой-то код и видишь a = b ^ 7. Почему именно 7? Что это за число, откуда оно взялось, что означает? Столько много вопросов и так мало ответов, если кто-то не утрудился комментарием. Есть несколько способов разрешить неопределенность такого рода:
- Оставить комментарий. Но комменты для слабаков — не наш путь.
- Сделать переменную или макрос с говорящим именем. a = b ^ HEARTBEAT_MASK_BYTE. Уже неплохо, но можно же и лучше, не так ли?
- Показать вычислениями путь, который привел к данному числу. Вот! Это отличный способ. Но не всегда применимый, как, например, в рассматриваемом коде. В нем 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.
Упражнения, направленные на разбор тех или иных действий, я оставляю в качестве собственной деградации читателю. Но при появлении вопросов готов ответить на них в комментариях. Там же призываю всех желающих демонстрировать свои способы выстрелить себе в ногу сделать рокетжамп.
Кстати, мы ищем Питон-разработчика, который умеет программировать понятнее чем я. Присоединяйтесь!