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

    • показать все, что скрытоТы знаешь.
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • Деобфусцировал твой код, и замусорил его "влажными" пробелами. Проверь:
        #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, но в твоей пишпе их нет, так что расслабься.
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • Потому, что это бессмысленно. String - это и так указатель, только с механизмом подсчёта ссылок.
                    Ответить
                    • показать все, что скрытоvanished
                      Ответить
                      • Если ты применишь к указателю крышечку ^, это будет означать разыменование, а так как это указатель на массив символов, то ты получишь ссылку на первый символ массива.
                        Ответить
                        • показать все, что скрытоvanished
                          Ответить
                          • Крышечка - это разыменование указателя.
                            Звёздочкой она работает только со структурами и примитивными типами, во всех остальных случаях - разыменование.
                            Ответить
                            • показать все, что скрытоvanished
                              Ответить
                              • Для создания типизированного указателя - если она перед переменной и для разыменования - если после.

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

                                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.) — это указатели.
                                Ответить
            • показать все, что скрытоvanished
              Ответить

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