LINUX.ORG.RU
ФорумTalks

Открывается конкурс дураков на самую нечитабельную программу

 , , ,


3

3

Привет, форумчане!

Тема конкурса навеяна этим тредом и программкой http://www.ioccc.org/1984/anonymous/anonymous.c , на которую я пару-тройку месяцев назад наткнулся в каментах к этой теме.

Итак, условия конкурса на главного дурака: написать самую дурацкую и нечитабельную программу, которая, однако, нормально компилится и желательно что-то делает. В каментах указывать язык программирования, как откомпилировать и как запускать. Ну и что она вообще делает ещё можно указать. Дополнительное условие конкурса на главного антидурака: восстановить исходный код самой дурацкой программы так, чтобы он снова стал понятен. Антидурак по определению тоже является дураком, т. к. умный человек, понятно, такой хренью заниматься не будет.

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

Призов нет. Только моральные поощрения самых фееричных дураков в каментах типа «афтар, пеши исчо!»

Я, в качестве конферансье и одновременно участника, открываю конкурс своей программой на Си your_name.c, содержащей краткий комментарий, 1 инклуд (для подавления предупреждений, а так можно было бы обойтись и без него), нескольких десятков дефайнов и далее собственно программы, состоящей исключительно из знаков подчёркивания («_»), разделённых пробелами или ньюлайнами.

/**
 * The program your_name output your name.
 *
 * Module:  your_name.c
 * Compile: gcc -o your_name your_name.c
 * Call:    ./you_name
 *       or
 *          ./you_name firstname secondname thirdname ...
 * Author:  aureliano15
 * License: GPL v.3.
 * Copyleft (Ɔ) 2017.
 */
#include <stdio.h>

#define _ (
#define __ )
#define ___ ,
#define ____ [
#define _____ ]
#define ______ ;
#define _______ {
#define ________ }
#define _________ =
#define __________ <
#define ___________ *
#define ____________ +
#define _____________ -
#define ______________ **
#define _______________(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) i##p
#define ________________(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) i##p##c
#define _________________(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) p##k##g##b
#define __________________(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) e##b##m##p##c
#define ___________________(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) h##j##a##q##c##l
#define _______________________________(x) #x
#define ____________________ _______________(+,-,+,/,?,=,~,-,+,/,~,^,?,+,-,+,=,?)
#define _____________________ _______________(+,-,+,/,?,^,~,-,=,/,~,^,?,+,-,=,/,?)
#define ______________________ ________________(z,v,t,b,j,i,x,0,i,w,u,o,9,t,a,n,f,e)
#define _______________________ _________________(m,n,o,i,x,y,i,j,k,b,a,x,y,k,l,m,n,u)
#define ________________________ _________________(s,r,q,d,c,b,a,e,f,g,h,i,j,a,b,c,d,e)
#define _________________________ _______________(a,b,c,d,e,f,g,h,i,j,a,b,c,d,e,f,g,h)
#define __________________________ _________________(f,e,d,c,b,a,s,t,u,k,l,a,b,c,d,e,f,g)
#define ___________________________ ___________________(i,s,t,u,m,n,o,p,q,r,s,f,e,d,l,m,n,o)
#define ____________________________ __________________(h,g,s,t,f,f,g,h,a,b,c,d,e,r,s,t,u,0)
#define _____________________________ ___________________(t,s,r,q,p,p,q,r,s,e,i,n,m,l,s,t,u,v)
#define ______________________________ ________________(p,q,r,s,j,i,h,g,f,e,d,k,l,m,n,o,p,q)
#define ____________________________________________________ __________________(s,t,n,m,s,t,a,b,i,j,k,c,d,e,h,i,j,m)
#define ________________________________ _______________________________(%)
#define _________________________________ _______________________________(:)
#define __________________________________ _______________________________(_)
#define ___________________________________ _______________________________(a)
#define ___________________________________________________ _______________________________(d)
#define ____________________________________ _______________________________(e)
#define _____________________________________ _______________________________(i)
#define ______________________________________ _______________________________(m)
#define _______________________________________ _______________________________(n)
#define ________________________________________ _______________________________(o)
#define _________________________________________ _______________________________(r)
#define __________________________________________ _______________________________(s)
#define ___________________________________________ _______________________________(t)
#define ____________________________________________ _______________________________(u)
#define _____________________________________________ _______________________________(y)
#define ______________________________________________ _______________________________(\n)

______________________ _______________________ _ ______________________
_______________________________________________ ___ ________________________
______________ ________________________________________________ __ _______
________________________ _________________________________________________
____ ___________ ____________________________________ _____________
___________ ________________________________ _____ ______
______________________ __________________________________________________
______ _________________________ _
_______________________________________________ _____________________
___________ _______________________________________ _____________ ___________
______________________________________ __ ___________________________ _
____________________________________ _______________________________________
___________________________________________
____________________________________ _________________________________________
__________________________________
_____________________________________________
________________________________________
____________________________________________
_________________________________________ __________________________________
_______________________________________ ___________________________________
______________________________________ ____________________________________
_________________________________ __________________________________ __ ___
____________________________ _
_________________________________________________ ___ ___________
___________________________________________________ _____________ ___________
________________________________ ___
____________________________________________________ __ ___
___________________________ _ _____________________________________________
________________________________________
____________________________________________
_________________________________________ __________________________________
_______________________________________ ___________________________________
______________________________________ ____________________________________
__________________________________ _____________________________________
__________________________________________ __________________________________
________________________________ __________________________________________
______________________________________________ ___
_________________________________________________ __ ______
__________________________ _______ ___________________________ _
_____________________________________________
________________________________________
____________________________________________
_________________________________________
__________________________________ _______________________________________
___________________________________ ______________________________________
____________________________________ __________________________________
_____________________________________
__________________________________________ __________________________________
__ ______ ______________________________ _
__________________________________________________ _________ ___________
_______________________________________ _____________ ___________
______________________________________ ______
__________________________________________________ __________
_______________________________________________ ______ ____________________
__________________________________________________ __
___________________________ _ ________________________________
__________________________________________ __________________________________
___ ___________ _ ________________________________________________
____________ __________________________________________________ __ __ ______
___________________________ _ ______________________________________________
__ ______ ________ _____________________________ ___________
______________________________________ _____________ ___________
______________________________________ ______ ________

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

UPD от 8 апреля 2018. Оставлю-ка здесь для себя на память из этого поста, чтоб не потерялось, из той же оперы:

/**
 * Программа putrnd использует суперслучайный алгоритм для генерации
 * суперслучайного пароля. Используйте её для генерации надёжных паролей!
 *
 * Compile: gcc -o putrnd putrnd.c
 * Call:    ./putrnd
 *
 * Author:  aureliano15
 * License: GPL v.3.
 * Copyleft (Ɔ) 2018.
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
  srand(time(0));
  int n = rand(), d1=87, d2=0, d3=3, d4=0, d5=0, d6=0, d7=0;
  n |= 175684;
  n &= 203331;
  n += 202755;
  n /= 2;
  n--;
  n >>= 2;
  while(putchar(n) && d1>=0)
  {
      d1=(d1-d2)/d3-d4+d5+d6+d7;
      d6-=d7-d6;
      if(d4)
      {
          d5+=5;
          d6-=54;
          d7+=54;
      }
      if(d2)
          ++d4;
      ++d2;
      ++d3;
      n+=d1;
  }
  d5-=5;
  return (n&d5)-d5;
}

и второй, немного более запутанный вариант:

/**
 * Программа putrndgoto использует суперслучайный и суперхитрый алгоритм
 * с метками для генерации суперслучайного пароля. Используйте её для
 * генерации надёжных паролей!
 *
 * Compile: gcc -o putrndgoto putrndgoto.c
 * Call:    ./putrndgoto
 *
 * Author:  aureliano15
 * License: GPL v.3.
 * Copyleft (Ɔ) 2018.
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
  srand(time(0));
  int n = rand(), d1=87, d2=0, d3=3, d4=0, d5=0, d6=0, d7=0;
  goto l13;
  l01: d6-=54; goto l04;
  l02: ++d3; goto l17;
  l03: putchar(n); goto l19;
  l04: d7+=54; goto l12;
  l05: n--; goto l09;
  l06: d6-=d7-d6; goto l10;
  l07: n &= 203331; goto l15;
  l08: ++d2; goto l02;
  l09: n >>= 2; goto l03;
  l10: if(d4) goto l16; goto l12;
  l11: ++d4; goto l08;
  l12: if(d2) goto l11; goto l08;
  l13: n |= 175684; goto l07;
  l14: d1=(d1-d2)/d3-d4+d5+d6+d7; goto l06;
  l15: n += 202755; goto l21;
  l16: d5+=5; goto l01;
  l17: n+=d1; goto l03;
  l18: d5-=5; goto l20;
  l19: if(d1<0) goto l18; goto l14;
  l20: return (n&d5)-d5;
  l21: n /= 2; goto l05;
}
★★

Последнее исправление: aureliano15 (всего исправлений: 1)

Ответ на: комментарий от Harald

а что не так? )

Тут просто небольшой холивар разгорелся на тему, как лучше писать выражения сравнения: переменная == константе или константа == переменной.

aureliano15 ★★
() автор топика
Ответ на: комментарий от aureliano15

Без -pedantic тоже компилируется, и предупреждений даже меньше.

Ну так вся суть -pedantic в предупреждениях. Хочешь чтоб не скомпилоровалось, тогда просто добавь -pedantic-errors.

Но как уже былос сказано код не написан следуя стандарту С++11 и использует расширения GNU (aka -std=gnu++11)

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

код не написан следуя стандарту С++11

Имхо, для кода, который вообще ничего не делает, это не самая серьёзная проблема: не делать по стандарту или не делать не по стандарту. :-) А gnu-расширение, позволяющее вычислять адреса меток, для отладки в некоторых случаях может быть очень даже полезным.

aureliano15 ★★
() автор топика
Ответ на: комментарий от aureliano15

Конечно, но <zanuda mode=«on»>на оригинале предполагается совместимость с -std=c++11, а VC++ с аналогичными флагами не скомпилировать</zanuda>

Хотя с другой стороны там вспоминается только GCC.

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

на оригинале предполагается совместимость с -std=c++11

А, в этом плане — да.

aureliano15 ★★
() автор топика
18 марта 2018 г.
Ответ на: комментарий от aureliano15

Беда в том, что когда я в одном проекте был недоволен тем, что длина строк была запредельно огромной и идентификаторы были таковы, что запомнить и ориентироваться в них было невозможно даже после нескольких месяцев работы, меня ткнули носом в гайдлайны, где на 50 страницах распинались о требованиях к идентификатору. В итоге, так как это осилить никто не мог, это делал специальный скрипт и приставленный к нему «специалист». Добавление новой функции было эпичным процессом. Можно было неделю биться головой об статический анализатор, пока не подберешь правильное название, или просто заполняешь форму в web и получаешь готовый прототип функции, или определение переменной, класса, и тп. Поэтому чтобы быстрее писать код, все старались новых имен не заводить. Индусы суровые ребята.

slapin ★★★★★
()
Ответ на: комментарий от slapin

Странная контора. Такое ощущение, что процессом программирования там руководил офис-менеджер или кто-то ещё, не менее далёкий от it. Мне кажется, что любой, даже самый упоротый начальник, хоть немного разбирающийся в азах, такого не допустит. И я таких фирм не видел.

А что это за контора, если не секрет, и прав ли я в том, что разработкой там руководили какие-то совсем левые люди?

aureliano15 ★★
() автор топика
Ответ на: комментарий от aureliano15

нет, типичные индусы. Раскрывать не буду, но скажу что транснациональная корпорация с японскими корнями. Просто есть тонны книг для менеджеров о том, как девелопить софтварные проекты, и если всё там написанное воспринимать всерьёз - получается зашквар. Но многим нравится. У многих вообще жесткие процессы, где всё оооочень медленно. На самом деле очень сложно по таким вещам спорить - у манагеров свои заботы, там kLoc'и, плотность ошибок, количество ошибок в день, всякие рейты, и вроде как все правила (но за исключением редких зашкварных, но их часто удается исключить) правильные и хорошие, и если бы ты был зелёным нубом только что прочитавшим книжку по C или C++ и тебе уже надо код писать, такое позволяет добиться какой-то эффективности. Но правил этих миллион, поэтому всё проверяет статический анализатор - нет никого, кто может это всё запомнить. Ну и выглядит это вместе с багами так, что большую часть времени ты тратишь на то, как накормить монстра, ритуал служения машине какой-то а не кодинг. Код ты написал в понедельник, и если тебе повезло, тебе удастся его загнать в ветку в пятницу. И скорость у тебя такая же как у нулёвого новичка рядом - просто подходы разные. А наверху сидит крутой дипломированный индус и читает очередную книжку про то как улучшить метрики и не вникать, чтобы процесс подходил под любой софт.

Такое не редкость в конторах, кто нанимает много народу, и им уже неохота разбираться в квалификации каждого, менеджеры мыслят макро-параметрами и диаграммами. Верятность попасть в такое есть, например если рядом проходило health products или safety critical, и подобные мало что значащие базворды.

slapin ★★★★★
()
Ответ на: комментарий от slapin

нет, типичные индусы.

Даже от индусов не ожидал такого.

транснациональная корпорация с японскими корнями.

Теперь понятно, почему Япония так просела.

тонны книг для менеджеров о том, как девелопить

Осталось написать тонны книг для программистов о том, как управлять. :-)

Но многим нравится.

Явно извращенцам.

сложно по таким вещам спорить - у манагеров свои заботы

Это понятно, что с бюрократией не поспоришь.

если бы ты был зелёным нубом только что прочитавшим книжку по C или C++ и тебе уже надо код писать, такое позволяет добиться какой-то эффективности.

Не думаю. Я общался с изучающими си/си++ студентами, и советы в «умных» книжках делать все идентификаторы типа lptrStrSzStringForTitleOfMainWindow их шокировали, не смотря на молодость.

Верятность попасть в такое есть, например если рядом проходило health products или safety critical, и подобные мало что значащие базворды.

Понял. Спасибо. Буду их остерегаться.

aureliano15 ★★
() автор топика
Ответ на: комментарий от slapin

А ISO9000 тут при чём? Это ведь менеджмент качества. Я с ним сталкивался, — бред невообразимый, но к кодированию, по-моему, никаким боком не имеет отношения.

А что касается MISRA, — почитал о нём тут. По-моему, большинство требований вполне разумно и соответствуют общим представлениям о хорошем стиле. Другое дело, что когда рекомендации по стилю программирования превращаются в жёсткие правила, то это, имхо, всегда зло. Но в самих рекомендациях я ничего плохого не увидел. И запомнить их не так сложно, если знаком с тем, что в си считается хорошим стилем, а что — нет.

aureliano15 ★★
() автор топика
Ответ на: комментарий от aureliano15

Проблема как раз когда ISO 9000 + MISRA. На самом деле все так говорят, пока не поработают вживую. Но многим начинает нравится и они хотят больше и больше. MISRA заапрувлена для ISO 9000. Это для менеджеров значит, что они смогут снять с себя ответственность в случае факапа, а в их менталитете это - основная жизненная задача менеджера. Далее - MISRA делают жирным static analysis tool'ом типа Coverity. И работает это так - сканишь ты прогу и видишь по 100 ошибок в каждой строчке. Фиксишь одну, а там новая. Многие правила спорные, некоторые противоречат самому духу (заставить идиота писать без ошибок). Обычно комбинации правил заставят поседеть даже бывалого - например запрет на использование суффикса l + essential type system могут не дать использовать некоторые типы переменных, весь код в кастах, которые ухудшают читаемость. Поэтому я не знаю ни одного крупного проекта, использующего MISRA. Знаю достаточно средних и мелких - но там не внедряют MISRA полностью, только ограниченное количество правил, но даже в этом случае ты часто ловишь себя на мысли, что ты превращаешься в индуса. Вот зачем в switch'e default, если ты и так перечислил все возможные варианты? зачем всякий if else if должен содержать еще один else? Почему все имена static функций должны быть уникальны? И такого очень много. Потому что это робот. Оно не заменит ни review ни тестирования. Оно просто тратит твоё время.

slapin ★★★★★
()
Ответ на: комментарий от slapin

заставить идиота писать без ошибок

Да, эта утопия согласуется с iso9000. :-)

Потому что это робот. Оно не заменит ни review ни тестирования. Оно просто тратит твоё время.

Понял. Спасибо за ликбез.

aureliano15 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.