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

    −11

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    99. 99
    #define MIN(a, b) ( ( (a) < (b) ) ? (a) : (b) )
    // Libraries
    #include <stdio.h>
    #include <stdlib.h>
    // Check Int32.max
    #ifndef INT32_MAX
        // Define Int32.max
        #define INT32_MAX ((long long)0xFFFFFFFE)
    #endif
    // Минимальное произведение
    long long fifthTask() { // ОСТОРОЖНО: ГОВНОКОД
        unsigned int i;//`for` loop counter
        unsigned int count;//count of elements
        long long*numbers;//elements
        //result value
        long long min;
        {//input values and do some 'on-the-go' calculations
            unsigned char containsZero = 0; //zero flag
            //pair1
            long long in_min_s  = 0; //минимальное отрицательное для перемножения на максимальное полож.
            long long in_max_u  = 0; //максимальное положительное для перемножения на минимальное отриц.
            //pair2
            long long in_min1_u = INT32_MAX - 1; //первое минимальное положительное для перемножения на второе и странений.
            long long in_min2_u = INT32_MAX;     //второе минимальное положительное для перемножения на первое и странений.
            //scan for count
            scanf("%u", &count);//2<=count<=10ˆ5
            //allocate numbers memory
            numbers = calloc(sizeof(long long), count);
            //scan 2 first min-max vals
            scanf("%lld", numbers+0);
            scanf("%lld", numbers+1);
            {//analyze first 2 inputed values manually
                if (*numbers == 0 || numbers[1] == 0){//set contains zero flag is input == 0
                    containsZero = 1;
                }
                if (*numbers < 0 || numbers[1] < 0){//get min signed val
                    in_min_s = MIN(*numbers, numbers[1]);
                }
                if (*numbers > 0) {//input min max unsigned vals step1
                    in_min1_u = *numbers;
                    in_min2_u = *numbers;
                    in_max_u  = *numbers;
                }
                if (numbers[1] > 0)
                {//input min max unsigned vals step2
                    if (*numbers < numbers[1]){in_min2_u = numbers[1];in_max_u  = numbers[1];}
                    else {in_min2_u = in_min1_u;in_max_u  = in_min2_u;in_min1_u = numbers[1];}
                }
            }
            for (i = 2; i < count; ++i)
            {//loop for all other vals
                //scan inputed val.
                scanf("%lld", numbers+i);
                //get inputed val.
                long long num = numbers[i];
                if (num == 0) {//set contains zero flag
                    containsZero = 1;
                }
                if (num < 0 && num < in_min_s) {//set min signed val (val < 0).
                    in_min_s = num;
                }
                if (num > 0) {
                    if(num < in_min1_u) {//swap 2 min vals and 1st min val = num
                        in_min2_u = in_min1_u;
                        in_min1_u = num;
                    }
                    else if (num>0&&num<in_min2_u) {//swap ('max') 2nd min val with `num`
                        in_min2_u = num;
                    }
                    if (num > in_max_u) {//set max unsigned val.
                        in_max_u = num;
                    }
                }
            }
            //ну и редкостный говнокод же я написал....
            //и..кажется..он работает(?)..лан, для олимпиады сойдет :]
            {//calc min
                //а вот и возможные рез-ты подъехали
                long long min1 = in_min_s  * in_max_u;
                long long min2 = in_min1_u * in_min2_u;
                if (in_min_s == 0) {//nooo..stupid user,dont enter those stupid vals again...
                    //дабы неверные рез-ты не вылезли в лог делаем их максимально возможными.
                    min1 = INT32_MAX;//kostyl
                }
                //get min multipl.
                min = MIN(min1, min2);
                if (containsZero && min > 0) {//0 * val if seq contains zero and zero < min.
                    min = 0;
                }
            }
        }
        return min; //return result
    }
    // Main function that runs preconfigured task
    int main(int argc, const char * argv[]) {
        long long res = fifthTask();
        printf("%lld", res);
        return 0;
    }

    Сам не знаю, что на меня нашло, но говнокод получился отменный. Причем вроде как работает при соблюдении условий задачи для входных данных.

    Тест задачи отличается от написанного мною ниже, но суть такая же.
    Всероссийская олимпиада по информатике 2015-2016.
    Задача 5 - Минимальное произведение: Дана последовательность из N целых чисел (они могут быть положительными, отрицательными или равными 0). Нужно выбрать из них такую пару чисел, что их произведение друг на друга является минимальным среди всех других пар. (квадраты 1-ого числа не рассматриваются, но можно выбрать 2 одинаковых числа из последовательности).
    Также 1<N<10^5+1
    Вход:
    N - Колич-во чисел в последовательность
    Следующие N сток содержат сами числа, по модулю не превосходящие 40000

    Выход:
    Единственное число - наименьшее возможное произведение 2-х различных (по индексу в последовательности, как я понял) элементов этой последовательности.

    Пример:
    IN:
    3
    1
    -3
    2
    OUT:
    -6

    Запостил: b1nary, 28 Октября 2015

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

    • UPD: Только сейчас заметил, на деле не работает с последовательностью только из отрицательных чисел
      Ответить
    • Занятная питушня. А теперь - мой выход.
      // Libraries
      #include <stdio.h>
      #include <stdlib.h>
      // Check Int32.max
      #ifndef INT32_MAX
          // Define Int32.max
          #define INT32_MAX ((long)0x7FFFFFFF)
          #define INT32_MIN (-INT32_MAX-1)
      #endif
      
      #define SET(id) { nums[id] = num; inds[id] = i; }
      
      // Минимальное произведение
      long fifthTask() { // ОСТОРОЖНО: ГОВНОКОД
          // x>0, y>0: min(x>0)*min(y>0)
          // x<0, x>0: min(x<0)*max(y>0)
          // x<0, y<0: max(x<0)*max(y<0)
          // x=0, y=?: ok
          long* nums = calloc(8, sizeof(long));//elements
          int* inds = calloc(8, sizeof(int));
          
          if(!nums || !inds) return INT32_MAX;
          
          nums[0] = INT32_MAX; // min pos 1
          nums[1] = INT32_MAX; // min pos 2
          nums[2] = INT32_MIN; // max neg 1
          nums[3] = INT32_MIN; // max neg 2
          nums[4] = INT32_MAX; // min
          nums[5] = INT32_MIN; // max
          nums[6] = 0; // zero 1
          nums[7] = 0; // zero 2
          
          int i, j;
          
          for(i = 0; i < 8; ++i) inds[i] = -1;
          
          int count;
          scanf("%d", &count);//2<=count<=10ˆ5
          
          long num;
          
          for (i = 0; i < count; ++i) {
            scanf("%ld", &num);
            
            if(num > 0) {
              if(num < nums[1]) SET(1)
              else if(num < nums[0]) SET(0)
              
              if(num > nums[5]) SET(5)
            } else if(num < 0) {
              if(num > nums[3]) SET(3)
              else if(num > nums[2]) SET(2)
      
              if(num < nums[4]) SET(4)
            } else {
              if(inds[6] < 0) inds[6] = i;
              else inds[7] = i;
            }
          }
      
          long min = INT32_MAX;
          
          for(i = 0; i < 8; ++i)
            for(j = 0; j < 8; ++j)
              if(inds[i] >= 0 && inds[j] >= 0 && inds[i] != inds[j])
                if(nums[i] * nums[j] < min)
                  min = nums[i] * nums[j];
      
          return min;
      }
      // Main function that runs preconfigured task
      int main(int argc, const char * argv[]) {
          long res = fifthTask();
          printf("%ld", res);
          return 0;
      }

      http://ideone.com/DdFJfL
      Ответить
      • Оптимизация: http://ideone.com/0kYaBh
        Ответить
        • Царский код: http://ideone.com/wa4yfi
          #include<stdio.h>
          #include<stdlib.h>
          #define X(s,u) n s N[u]?(N[u]=n,I[u]=c):
          #define Y(a,x) X(a,x)X(a,x+1)0,-X(a-,x+2)0
          main(){
            long m=50000,N[6]={m,m,-m,-m,-m,m},c=-1,I[6]={c,c,c,c,c,c},n;
            for(scanf("%ld",&c);c--;scanf("%ld",&n),n<0?Y(>,3):Y(<,0));
            for(n=36;n--;c=N[n/6]*N[n%6],I[n/6]<0|I[n%6]<0|I[n/6]==I[n%6]|c>m||(m=c));
            printf("%ld",m);
          }
          Ответить
          • Видно дьявол тебя целовал...
            Ответить
            • Укоротил на несколько символов: http://ideone.com/RI95BT
              #include<stdio.h>
              #include<stdlib.h>
              #define X(s,u) n s N[u]?(N[u]=n,I[u]=c):
              #define Y(a,x) X(a,x)X(a,x+1)0,-X(a-,x+2)0
              main(){
                int m=1e9,N[6]={m,m,-m,-m,-m,m},c=-m,I[6]={c,c,c,c,c,c},n,*f="%ld";
                for(scanf(f,&c);c--;scanf(f,&n),n<0?Y(>,3):Y(<,0));
                for(n=36;n--;c=N[n/6]*N[n%6],I[n/6]+I[n%6]<0|I[n/6]==I[n%6]|c>m||(m=c));
                printf(f,m);
              }
              Ответить
              • И ещё: http://ideone.com/l6nnFC
                #include<stdio.h>
                #include<stdlib.h>
                #define X(s,u)n s N[u]?(N[u]=n,I[u]=c):
                #define Y(a,x)X(a,x)X(a,x+1)0,-X(a-,x+2)0
                main(){
                  int m=1e9,N[]={m,m,-m,-m,-m,m},c=-m,I[]={c,c,c,c,c,c},n,*f="%d";
                  for(scanf(f,&c);c--;scanf(f,&n),n<0?Y(>,3):Y(<,0));
                  for(n=36;n--;c=N[n/6]*N[n%6],I[n/6]+I[n%6]<0|I[n/6]==I[n%6]|c>m||(m=c));
                  printf(f,m);
                }
                Ответить
                • А, тут уже давно можно включение stdlib.h убрать.
                  Ответить
                  • Всё, http://ideone.com/3rvByl, мой шакальный максимум.
                    #include<stdio.h>
                    #define X(s,u)p s N[u]?(N[u]=p,N[u+6]=c):
                    #define Y(a,x)X(a,x)X(a,x+1)0,-X(a-,x+2)0
                    main(){int m=1e9,c=-m,N[]={m,m,c,c,c,m,c,c,c,c,c,c},n=36,p,q,*f="%d";for(scanf(f,&c);c--;scanf(f,&p),p<0?Y(>,3):Y(<,0));for(;n--;c=N[n/6]*N[n%6],p=N[n/6+6],q=N[n%6+6],p+q<0|p==q|c>m||(m=c));printf(f,m);}
                    Ответить
                    • Охуеть.
                      Ответить
                      • Вот тут есть соревнования по минимально короткому коду https://codefights.com
                        Ответить
                    • http://images.musictimes.com/data/images/full/17461/camron-u-mad.jpg?w=775
                      Ответить
                    • Операторы как аргументы макроса? А что, так можно?

                      Амаяк Арутюнович, а Вы нам основы функционального программирования на Си покажете?
                      Ответить
                      • Какие операторы, дяденька? Ради препроцессора, перестаньте.

                        Помню, у меня уже некогда было кобенаторно-функциональное обострение: http://govnokod.ru/13420#comment188342
                        Ответить
                    • [IMG]http://i68.tinypic.com/2m3229x.png[/IMG]
                      Ответить
                    • http://i68.tinypic.com/2m3229x.png
                      Ответить
                      • Следить за предупреждениями в гольфах? Фи.
                        И да, это не C++.
                        Ответить
                        • Мда, int* -> char* добавило бы 4 лишних символа, которые я так тщательно экономил.
                          Ответить
                    • f =:  4 : '<./;(</.|.*/~y)#~(<.-:<:+:x)~:i.<:+:x'
                      
                      w =: 3 : 'LF,~":({.[0".(}:y)) f }.[0".(}:y)'
                      
                      w&.stdin ''
                      exit ''
                      Ответить
                      • И еще укоротил
                        f =: 4 : '<./;(</.|.*/~y)#~(<.-:t)~:i.t=.<:+:x'
                        w =: 3 : 'LF,~":({.t)f}.t=.0".}:y'
                        w&.stdin ''
                        exit ''
                        Ответить
                        • Вот это язык для настоящий мужиков. Не то что вялый питон
                          Ответить
                        • Маэстро, что употребляете?
                          Ответить
                        • > stdin
                          > exit
                          http://cs410416.vk.me/v410416505/abb6/53ARIQmZ4SU.jpg
                          Ответить
                        • Нихуя непонятно.
                          Ответить
                          • Все просто
                            y rplc''-_'',LF,'' '' - вырезаем переносы строки и меняем минусы на _
                            n=.{.a=.0" - считываем массив a из строки и выделяем количество чисел n
                            t=.<:+: - ищем количество диагоналей матрицы n x n
                            (<.-:t)~:i. - ищем какую диагональ удалить
                            (</.|.*/~}.a) - создаем матрицу произведений, разворачиваем и нарезаем на диагонали
                            #~ - выбираем только нужные диагонали
                            <./; - распаковываем диагонали в массив и ищем наименьшее произведение
                            LF,~": - превращаем в строку и добавляем перенос строки

                            По памяти эта параша не пройдет
                            Ответить
                            • Нихуя непонятно.
                              Ответить
                            • Вот теперь норм

                              l =: 3 : 0
                              t =. }.".y rplc '-_',LF,' '
                              if. 0<+/0<t do.
                                r =: */(0 1){/:~t
                              elseif. 0<+/0>t do.
                                r =: */(0 1){\:~t
                              elseif.  do.
                                r =: (<./ * >./) t
                              end.
                              LF,~":r
                              )
                              
                              l&.stdin ''
                              exit ''
                              Ответить
                              • Не, еще лучше сделал
                                l =: 3 : 'LF,~":<./((<./ * >./) t),(*/(0 1){\:~t),*/(0 1){/:~t=.}.".y rplc ''-_'',LF,'' '''
                                
                                l&.stdin ''
                                exit ''
                                Ответить
                                • l =: 3 : 'LF,~":<./((<./*>./)t),*/"1(i.2){"1(\:~t),:/:~t=.}.".y rplc LF,'' -_'''
                                  
                                  l&.stdin ''
                                  exit ''
                                  Ответить
                        • ::scan "\%^\6{%#\&.&"[/^
                          ::out ,]"&:%^}
                          Ответить
                          • Это на чем?
                            Ответить
                            • Я хуй знает, я просто башкой об клаву побился.
                              Ответить
                              • > я просто башкой об клаву побился

                                И случайно нашёл линейный алгоритм для проблемы коммивояжёра
                                Ответить
                                • Алгоритм делать умный вид якобы знающего экзотерический язык.
                                  Ответить
                                  • Меня терзают смутные сомнения, что я что-то похожее на ГК уже видел.
                                    Ответить
                        • Укоротил и пофиксил
                          f =:  3 : 'LF,~":<./;(</.|.*/~}.a)#~(<.-:t)~:i.t=.<:+:n=.{.a=.0".y rplc''-_'',LF,'' '''
                          f&.stdin ''
                          exit ''
                          Ответить
                          • И даже так
                            l =: 3 : 'LF,~":<./(*/,*/"1)(i.2){(\:~,./:~)t=.}.".y rplc LF,'' -_'''
                            
                            l&.stdin ''
                            exit ''
                            Ответить
    • 1. Ты на паскале раньше не писал?
      2. в примере вывод должен быть -9, разве нет?
      3. с последовательностью только из положительных чисел тоже не сработает, я правильно понял?
      Ответить
      • прогнал. Забыл что первая строка - количество элементов
        Ответить
      • 1 - нет, у меня в школе нет программирования, все языки, алгоритмы, оптимизация итд учу сам (пока что это Swift, ObjC, C, Python, PHP, AppleScript, немного 'Metal Shading Language' и Haskell). Pascal не учил ибо устарел и никому не нужен. Разве что в школах учить на нем мб проще. Хотя на Python было бы легче (хотя это скриптовый ЯП, не лучшее начало).
        3 - Сработает, ошибка в сохранении мин значений для последующего умножения (обнаружил только после отправки задания)
        Ответить
        • >хотя это скриптовый ЯП, не лучшее начало
          это тебе поцоны во дворе сказали ?
          Ответить
          • Нет, просто предпочитаю строго типизированные компилируемые языки (BTW Си в их число не входит, ибо с типизацией 'проблемы', а удобного строго типизированного скриптового языка я ещё не встречал)
            Ответить
            • дурачок ты анальный, пайтон это _СТРОГО_ типизированный язык

              >>PHP
              а, ну все с тобой понятно

              >>AppleScript
              это говорит человек у которого "паскаль устарел"?
              Ответить
              • У питона (по крайней мере второго) в некоторых местах всё-таки слабая типизация проскакивает.

                Например байтстринги неявно кастуются в юникод. И это очень плачевно заканчивается.
                Ответить
                • Есть такая народная мудрость: если в 2015м году некто использует однобайтовую кодировку, то этот некто -- пидарас.
                  Ответить
                  • Пример из жизни: автор-пиндос забыл в своей либе сделать decode(), я поставил на сервер и кровь-кишки-распидорасило на первом же русском слове в utf-8...

                    Если бы у второго питона была настоящая сильная типизация, то изначальный автор не забыл бы decode(). И мне не пришлось бы туда его дописывать самому.

                    > однобайтовую кодировку
                    utf-8 - однобайтовая? Байтстринги в utf-8 тоже как бы крашатся на касте в юникод (но только если содержат что-то кроме ascii, что усугубляет проблему).
                    Ответить
                    • Если бы автор перестал насиловать труп и ушёл на третий питон, то decode() он бы больше не забывал никогда.
                      Ответить
                      • > и ушёл на третий питон
                        Мечтать не вредно... Всякие gevent'ы не хотели идти натретийпитон в те дни.
                        Ответить
                        • Кстати, есть список библиотек, которые до сих пор не портировали на третий Питон? Или ещё какие-нибудь причины использовать второй?
                          Ответить
                          • Ну прежде всего это миллионы строк своего говнокода, переписывать которые нет ни времени, ни денег. Проще извиниться перед пользователями, дописать забытый decode() и собрать новый релиз.
                            Ответить
                            • Ради старых проектов понятно.

                              А для новых проектов?
                              Ответить
                          • На самом деле, на тройку полностью перешел только веб. Плагины к какому-то говну вроде XBMC/Kodi застряли на двойке навсегда.
                            Ответить
                  • Однобайтовая кодировка в двойке практически прибита гвоздями, например, параметры комадной строки в байтах, втч argv[0] в котором путь до выполняемого файла.
                    Ответить
                • >Например байтстринги неявно кастуются в юникод. И это очень плачевно заканчивается.
                  Эм, что-то я не врубаюсь, можно пример?
                  Ответить
                  • - читаешь байтстринг из какого-нибудь сетевого пакета
                    - забываешь сделать decode
                    - складываешь его с юникодной строкой
                    - кровь-кишки-ascii-codec-can't-decode-byte-0xd1-in-position-0

                    Причём символы из ascii кастуются без проблем, заметая проблему под ковёр до поры до времени.
                    Ответить
                    • Эм, ЧЯДНТ?
                      >>> bs = b'abc'
                      >>> us = u'bca'
                      >>> bs + us
                      Traceback (most recent call last):
                        File "<stdin>", line 1, in <module>
                      TypeError: can't concat bytes to str
                      Ответить
                      • Юзаешь третий питон, в котором эту слабость таки устранили. Слава богу.
                        Ответить
                        • Омг, походу спать надо больше, "(по крайней мере второго)" не заметил.
                          Ответить
                  • Упрощённый пример: http://ideone.com/d7WDwd
                    Ответить
                  • Неявный каст равносилен .decode() без параметров который кидает исключение на любой символ с кодом больше 127.
                    Ответить
            • http://habrahabr.ru/post/161205/
              Ответить

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