1. Си / Говнокод #25076

    +1

    1. 1
    m[7500];char*c=m+3750;char*main(int k,char**a,char*s){return!a?~k?k&&*s?main(k+(*s==91)-(*s==93),0,s+1):s:(*(c+=(*s==62)-(*s==60))+=(*s==43)-(*s==45),*s==44?*c=getchar():*s-46||putchar(*c),*s-93?*s-91?0:!*c?s=main(1,0,s+1)-1:main(-1,0,1+s--),1[s]&&main(-1,0,s+1):0):main(-1,0,1[a]);}

    ...Пройдя долиной ошибок и ворнингов,
    Не убоюсь я ошибок сегментации...

    Запостил: 666_N33D135, 10 Ноября 2018

    Комментарии (29) RSS

    • Ты знаешь.
      Ответить
    • Тебе сюда --> www.ioccc.org
      Ответить
    • #include<stdio.h>
      int a = 256;int main(){for(char b[a+a+a],
      *c=b ,*d=b+ a ,*e=b+a+a,*f,*g=fgets(e,(b[
      a]=b [a+a] =a- a,a) , stdin);c[0]=a-a,f=c
      ,c=d ,d=e ,e=f, f= g,g =0,g = fgets(e,a+a
      -a+ a -a+a -a+ a- +a,stdin ),f +a-a ; pu\
      tchar(+10)) { for( int h= 1,i=1,j, k=0 ,l
      =e[0]==32,m,n=0,o=c [ 0]== 32, p, q=0;d[q
      ];j=k,k=l,m=n,n=o,p=(j)+(k* 2 )+(l =(i = 
      e[ q]&&i ) &&e[q +1 ]== 32,l*4)+(m* 8 )+(
      16*  n  )+(  o  =(h =c[ q]&&h)&&c[q+1]== 
      32,o* (16+16) )+0-0 +0, putchar(" ......"
      /*\  (  |||  )  |/|/ / */".')|)\\\\\\\\'"
      "" "|||"   "|||" "|'" ")|)\\\\\\\\'/|/(/"
      "(/'/|/\\|\\|'/|/(/(/'/|/\\|\\|"[d[q++]==
      32?p:0]));}}/* typographic tributaries */
      Ответить
      • Деобфусцировал твой код, и замусорил его "влажными" пробелами. Проверь:
        #include<stdio.h>
        
        #define MAX_LEN 256
        
        char table[] = " .......')|)\\\\\\\\'|||||||')|)\\\\\\\\'/|/(/(/'/|/\\|\\|'/|/(/(/'/|/\\|\\|";
        
        int main()
        {
            char *prevprev = (char[MAX_LEN]){},
                 *prev = (char[MAX_LEN]){},
                 *cur = (char[MAX_LEN]){};
            fgets(cur,MAX_LEN,stdin);
            
            while (1)
            {
                char *tmp = prevprev;
                prevprev = prev;
                prev = cur;
                cur = fgets(tmp,MAX_LEN,stdin);
                
                int h = 1,
                    i = 1,
                    j,
                    k = 0 ,
                    l = cur[0]==' ',
                    m,
                    n = 0,
                    o = prevprev[0]==' ';
                    
                for (int q = 0; prev[q]; ++q)
                {
                    j=k;
                    k=l;
                    m=n;
                    n=o;
                    i = cur[q] && i;
                    l = i && cur[q+1]==' ';
                    h = prevprev[q] && h;
                    o = h && prevprev[q+1]==' ';
                    int p = j + k*2 + l*4 + m*8 + 16*n + o*32;
                    putchar(prev[q]==' ' ? table[p] : ' ');
                }
                
                putchar('\n');
            }
        }
        Не знаю, можно ли что-ниюудь сделать с внутренним циклом.

        У меня то поинтереснее программка.
        Ответить
        • > char *prevprev = (char[MAX_LEN]){},
          Это нормально так память выделять? По-моему удобно.
          Ответить
          • Это compound literals, доступно в C99, C11 и в некоторых компиляторах как расширение для C89/C90 и C++. MSVC для C++ не может, но, хотя там только С89/С90 (с чем-то от C++), для C это работает, если заменить {} на {0}, так как в C запрещен пустой инициализатор в отличие от C++.
            https://en.cppreference.com/w/c/language/compound_literal
            Ответить
    • > 62, 60, 45, 43, 91, 93, 44, 46
      Брейнфак?
      Ответить
    • Кстать, для 32бит можно убрать тип возвращаемого значения и char**a заменить на int*a, а для tcc ещё можно ретурн убрать.
      Ответить
      • Блядь...
        Ответить
        • Так понятнее?
          m[7500];
          
          char*c = m + 3750;
          
          main (int k, int*a, char*s) {
              !a ?
                  ~k ?
                      k && *s ?
                          main(k + (*s == 91) - (*s == 93), 0, s + 1)
                      :
                          s
                  :(
                      *(c += (*s == 62) - (*s == 60)) += (*s == 43) - (*s == 45),
                      *s == 44 ?
                          *c = getchar()
                      :
                          *s - 46 || putchar(*c),
                      *s - 93 ?
                          *s - 91 ?
                              0
                          :
                              !*c ?
                                  s = main(1, 0, s + 1) - 1
                              :
                                  main(-1, 0, 1 + s--),
                          1[s] && main(-1, 0, s + 1)
                      :
                          0
                  )
              :
                  main(-1, 0, 1[a]);
          }
          Ответить
          • Я не люблю, когда инкрементят строковый указатель. Это как вскрывать шпроты вилкой.
            Ответить
            • Что такое строковый указатель?
              Ответить
              • PChar, но в твоей пишпе их нет, так что расслабься.
                Ответить
                • А в апаскале указатель же крышечкой делался
                  там нету типа

                  ^string ?
                  Ответить
                  • Потому, что это бессмысленно. String - это и так указатель, только с механизмом подсчёта ссылок.
                    Ответить
                    • Что бессмысленного в указателе на указатель?
                      Ответить
                      • Если ты применишь к указателю крышечку ^, это будет означать разыменование, а так как это указатель на массив символов, то ты получишь ссылку на первый символ массива.
                        Ответить
                        • А если в определении типа? Я думал крышечка это как звзедочка в сишечке

                          типа

                          Petuh: ^etuh

                          Petuh -- указатель
                          ^Petuh -- данные типа etuh
                          Ответить
                          • Крышечка - это разыменование указателя.
                            Звёздочкой она работает только со структурами и примитивными типами, во всех остальных случаях - разыменование.
                            Ответить
                            • Прости, я перестал тебя понимать.

                              В сисечке звездочка служит двум целям: в декларации типа или переменной она означает указатель-на

                              А примененный к указателю оператор звездочка означает "взять данные по адресу" сиречь дереференс сиреч разыменовывание сиреч косвенный доступ

                              Крышечка в поскале не так же ?

                              Инканус наверняка знает
                              Ответить
                              • Для создания типизированного указателя - если она перед переменной и для разыменования - если после.

                                var pstruct=^TStruct; // типизированный указатель

                                pstruct^.fieldvalue=123; // разыменование, или, как ты выразился, "взять данные по адресу".
                                Ответить
                                • >pstruct^.fieldvalue=123;

                                  Компилятор схавает и без разыменования. Дельфи позволяет такие вольности.
                                  Ответить
                                  • Спасибо Стертор, так понятно
                                    Ответить
                                  • Ебать, какое открытие. Ты нам прямо Америку открыл.
                                    Ответить
                                    • Кэп?
                                      Ответить
                                    • Послушай, я на паскале последний раз писал когда вы все в четвертый класс ходили

                                      Я забыл уже всё
                                      Ответить
                              • Залогинился, проверь. Набросаю примеров на Паскале, а в комментариях будет сишка.
                                type
                                PInteger = ^Integer; { typedef int * PInteger; }
                                var
                                a: ^Integer; { int * a; }
                                b: PInteger; { PInteger b;}
                                c: Integer; { int c; }
                                begin
                                a := @c; { a = &c; }
                                a^ := 3; { *a = 3; }
                                c := a^; { c = *a; }
                                end.


                                Путаница возникает из-за того, что в сишке нет нормальных массивов: там перемешаны массивы и указатели. То есть указатель на int в сишке — это по совместительству указатель на массив интов. Квадратные скобки подразумевают разыменование (которое явно не пишется).

                                Насчёт строк: тип string в Турбо Паскале (который в Дельфи переименовали в ShortString) — это настоящий массив.

                                Новые строки в Дельфи (AnsiString, WideString etc.) — это указатели.
                                Ответить
            • Нормально совершенно в сишечке так делать.

              for(char*foo = "buratino"; *(foo) != NULL; foo += 2) {
                    printf("%c%c papapapapapa ", foo[0], foo[1]);
              }


              Даже наверное можливо так

              for(char*foo = "buratino"; *foo; foo += 2) 
                           printf("%c%c papapapapapa ", foo[0], foo[1]);
              Ответить

    Добавить комментарий