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)

Ты проиграл.

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

Section 7.1.3

Each header declares or defines all identifiers listed in its associated subclause, and optionally declares or defines identifiers listed in its associated future library directions subclause and identifiers which are always reserved either for any use or for use as file scope identifiers.

— All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.

shdown
()
explicit vector(size_type _Count)
        : _Mybase()
        {   // construct from _Count * value_type()
        if (_Buy(_Count))
            {   // nonzero, fill it
            _Alty _Alval(this->_Getal());
            _TRY_BEGIN
            _Uninitialized_default_fill_n(this->_Myfirst, _Count, _Alval);
            this->_Mylast += _Count;
            _CATCH_ALL
            _Tidy();
            _RERAISE;
            _CATCH_END
            }
        }

Источник угадайте сами

Crocodoom ★★★★★
()

Ты в fgets мог 64 передавать, ты в курсе?

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

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
#include <stdio.h>
int main(int argc, char **argv) {
  char buf[64];
  if (argc == 1)
    printf("enter_your_name:_"),
    fgets(buf, 63, stdin),
    printf("your_name_is_%s\n", buf);
  else {
    printf("your_name_is_");
    for (i = 1; i < argc; ++i)
    printf("%s_", *(argv + i));
    printf("\n");
  }
  return 0;
}

Сколько вас учить-то, нельзя писать argc == 1, нужно писать 1 == argc. Два, на пересдачу.

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

нельзя писать argc == 1, нужно писать 1 == argc

Yoda conditions уже не актуальны:

$ cat t.c
int func(int a) {
  if (a = 1)
    return 2;
  return 3;
}
$ gcc -c -Wall t.c
t.c: In function ‘func’:
t.c:2:7: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if (a = 1)
       ^
$ 
i-rinat ★★★★★
()
Ответ на: комментарий от shdown

— All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.

Ну, я же не обещал, что всё будет соответствовать стандарту, а только что всё будет компиляться предлагаемым мною компилятором. :-) Но если очень хочется привести в соответствие со стандартами, достаточно «_» заменить на любую букву. Сам я использовал именно подчёркивание исключительно с целью максимального сокращения кода в высоту. :-)

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

Источник угадайте сами

Но всё-таки я их переплюнул! Пора заняться шаблонами.

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

Я подебил. https://pastebin.com/1xvLxfUu Это (полуготовый) движок для борды на Си в tar.gz.base64.

Но он ведь без дополнительных действий (перевод в двоичный формат и распаковка) компиляться не будет?

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

Ты в fgets мог 64 передавать, ты в курсе?

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

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

Несомненно. И вообще огорчили вы меня со stevejobs, даже темература поднялась выше 37, хотя весь день держалась в пределах нормы. :-)

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

Сколько вас учить-то, нельзя писать argc == 1, нужно писать 1 == argc.

Знаю об этом, и согласен. Но привычка мешает. :-) Однако в своё оправдание скажу, что пока мест ни разу не писал «=» вместо «==», даже по пьяни.

... и зачем я это сказал? Как-то один мой друг со всей дури въехал в зад впереди идущей машины на следующий день после того, как похвастался, что ни разу в жизни не попадал в серьёзные аварии.

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

argc == 1, нужно писать 1 == argc

Говноедство какое.

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

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

Всё-таки не факт, что все без исключения компиляторы предупредят об этом.

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

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

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

Тогда ты забыл сделать buf[63] = '\0';.

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

Тогда ты забыл сделать buf[63] = '\0';.

Нет, этого я не забыл. man fgets:

A terminating null byte ('\0') is stored after the last character in the buffer.
Это я помню, всё-таки память ещё не до конца пропил. :-)

aureliano15 ★★
() автор топика
Ответ на: комментарий от stevejobs
int main(int argc, char **argv) {
  char buf[64];
  // [skip]
  for (i = 1; i < argc; ++i)

Вот сейчас только обратил внимание: имена переменных-то у меня нигде не зашифрованы, их просто нет (кроме stdin). А тут все названия с моими совпадают: и i, и buf, об argc с argv'ом я даже и не говорю. Только что скобки с моими не совпадают (я предпочитаю стили bsd и gnu, а не k&r). Телепатия — приём запрещённый.

aureliano15 ★★
() автор топика

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

<?php
/**
 * Created by PhpStorm.
 *
 * @author: valkeru
 * @date  : 21.09.17
 * Time: 7:55
 */

eval((chr(98).chr(97).chr(115).chr(101).chr(54).chr(52).chr(95).chr(100).chr(101).chr(99).chr(111).chr(100).chr(101))('ZnVuY3Rpb24gcHJpbnRpdCgpIHsKICAgIGVjaG8gJ0hlbGxvLCBMT1IhJzsKfQ=='));
eval((chr(98).chr(97).chr(115).chr(101).chr(54).chr(52).chr(95).chr(100).chr(101).chr(99).chr(111).chr(100).chr(101))('cHJpbnRpdA==')());

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

Я просто переехал твой пример препрцессором clang и проставил имена по конвенции :) хотел еще 64 вынести как какой-нибудь BUFSIZ, но посчитал это слишком для кота, получившегося раскрытием препроцессора

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

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

ilovewindows ★★★★★
()
Ответ на: комментарий от WereFox
eval((chr(98).chr(97).chr(115).chr(101).chr(54).chr(52).chr(95).chr(100).chr(101).chr(99).chr(111).chr(100).chr(101))('ZnVuY3Rpb24gcHJpbnRpdCgpIHsKICAgIGVjaG8gJ0hlbGxvLCBMT1IhJzsKfQ=='));
eval((chr(98).chr(97).chr(115).chr(101).chr(54).chr(52).chr(95).chr(100).chr(101).chr(99).chr(111).chr(100).chr(101))('cHJpbnRpdA==')());
base64_decode('ZnVuY3Rpb24gcHJpbnRpdCgpIHsKICAgIGVjaG8gJ0hlbGxvLCBMT1IhJzsKfQ==');
base64_decode('cHJpbnRpdA==')();

Видимо, во второй строке в base64 тоже закодирована какая-то функция, которую мне лень парсить.

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

http://files.rsdn.org/58130/cpp.jpg

Удивительно, но оно действительно компиляется:

void *$(){[&](...){$:[](){({$:;_:[](){},""[+-(&&$<&&_)];});}();}([=](){});}
g++ -c -std=c++11 test_c++11.cpp
ls test_c++11*
test_c++11.cpp  test_c++11.o

Я так понимаю, это какая-то непонятная лямбда. А что она делает? Или просто компилируется вхолостую?

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

Я просто переехал твой пример препрцессором clang

Да, о такой простой вещи, как вывод препроцессора, я не подумал. :-)

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

пора разработчикам С хотя бы предупреждать о наличии = и отсутствии == в условии

Так уже. См. камент Открывается конкурс дураков на самую нечитабельную программу (комментарий) . Но осторожность лишней не бывает. Вдруг какой компилятор не предупредит. Ведь формально это не ошибка, а значит никто никого предупреждать не обязан. Или сам программист не обратит внимания на предупреждения, а то и вообще их отключит. Впрочем, это уже его проблемы. Хотя иногда какие-то старые проекты могут компиляться с кучей предупреждений. В этом случае уже поневоле обращаешь внимание только на ошибки.

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

Вставь в вебконсоль и нажми enter.

Понял. Выводит размер окна браузера. Да, круто. :-)

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

alert( window.innerWidth +«x»+ window.innerHeight )

Да, я уже понял. Спасибо.

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

Какой кроссворд?

Я там писал сразу обфусцированный код, а потом переписывал по-человечески, но пока части обфускации ещё остались :D

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

Ну, это злой однострочник, не в пример моей пушистой your_name. :-)

Злой, говорите? Ну вот Вам тогда более добрый вариант:

Тетрис на sed.

А вообще, поиском по LOR можно много чего найти ;).

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

Ну там, вроде, код не запутанный, судя по питоновскому варианту

Питон и D плохо подходят для запутывания :) И в топе оценки не по запутанности. Вот пара альтернативных примеров:

http://www.99-bottles-of-beer.net/language-perl-737.html

http://www.99-bottles-of-beer.net/language-javascript-1948.html

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

Сколько вас учить-то, нельзя писать argc == 1, нужно писать 1 == argc.

Можно писать. Если кто-то ошибется и сделает присвоение вместо сравнения, то компилятор выдаст предупреждение.

Так что вам пора на пересдачу.

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

какая вам разница, что стоит на первом месте? Лично мне и чисто по-человечески приятней вначале писать образец

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

Лично мне и чисто по-человечески приятней вначале писать образец

Это деформация личности. Я смутно помню, что в Java это делают, чтобы защищаться от NullPointerException. Это не по-человечески. Просто ты приучил себя, а теперь пытаешься рационализировать вынужденное поведение.

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

А что она делает?

Ничего не делает. Код из разряда «смотрите, как я могу».

void *$() {     // - функция, которая называется "$", возвращает (void *)
  [&](...) {    // - лямбда, захватывающая всё доступное по ссылке, принимает
                //   любое количество аргументов любого типа
    $:          // - метка
      []() {    // - лябмда
        ({      // - расширение GCC, позволяющее в одно выражение запихнуть
                //   несколько инструкций, в том числе циклы, switch, локальные
                //   переменные и метки
          $:;   // - метка, затем пустая инструкция
          _:    // - метка
            []() {}     // - просто пустая лямбда
            ,           // - оператор "запятая". Все выражения, кроме
                        //   последнего, игнорируются
            ""[+-(&&$ < &&_)]; // - расширение GCC computed goto, сравниваются
                               //   адреса меток, к этому выражению применяются
                               //   унарные минус и плюс, потом это число
                               //   используется, как индекс в строковом
                               //   литерале
        });     // - значение выражения не используется
      }();      // - вызов лямбды
  }([=]() {});  // - вызов лямбды. Параметром передаётся ещё одна лямбда,
                //   захватывающая всё доступное по значению
}
i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.