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

    +96.5

    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
    ......
                     int a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,a10=0;
                     for (int i=0;i<arl->Count;i++)
                     {
                        if(arl[i]<0.1)
                        {
                            a1++;
                        }
                        if(arl[i]<0.2&&arl[i]>0.1)
                        {
                            a2++;
                        }
                        if(arl[i]<0.3&&arl[i]>0.2)
                        {
                            a3++;
                        }
                        if(arl[i]<0.4&&arl[i]>0.3)
                        {
                            a4++;
                        }
                        if(arl[i]<0.5&&arl[i]>0.4)
                        {
                            a5++;
                        }
                        if(arl[i]<0.6&&arl[i]>0.5)
                        {
                            a6++;
                        }
                        if(arl[i]<0.7&&arl[i]>0.6)
                        {
                            a7++;
                        }
                        if(arl[i]<0.8&&arl[i]>0.7)
                        {
                            a8++;
                        }
                        if(arl[i]<0.9&&arl[i]>0.8)
                        {
                            a9++;
                        }
                        if(arl[i]<1&&arl[i]>0.9)
                        {
                            a10++;
                        }
                     }
    .....

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

    Запостил: KoirN, 11 Февраля 2010

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

    • По моему написать
      a[(int)(arl[i]*10)]++;
      куда проще, чем убедиться в отсутствии опечаток в приведённой простыне.
      Ответить
      • Конечно проще и лучше, но на тот момент загруженный мозг радил вот это вот гомницо.
        Ответить
      • Хоть и действительно говнокодец, но прошу не забывать, что развернутые циклы иногда работают быстрее. Более того, создавая массив для счётчиков ты запрещаешь для большенства компиляторов держать эти счётчики в регистрах (вместо того помещаешь их в ОЗУ), что замедляет инкремент в 4 раза на современных компьютерах.

        А так спору нет, такие вещи должны быть скорее наглядными, чем быстрыми, ибо я сомневаюсь, что такая извращённая оптимизация в данной программе в данном куске кода имеет смысл :)
        Ответить
        • И, кстати, умножение бывает трудоёмким, а автору для пущей извращённости можно было ещё else делать после каждого if :))
          Ответить
          • Хм, на удивление, оказалось, что на athlon, fmul к примеру, отрабатывает всего в 4 такта. Т.е. даже если рассматривать код автора как неправильную попытку (чуть ниже guest написал более красивый вариант) оптимизации, то всё-равно epic fail :)
            Ответить
        • тогда уж так наверное надо было? тоже тупо, в лоб, но писать быстрее
          if(arl[i]<0.1){
            a1++;
          } else if(arl[i]<0.2) {
            a2++;
          } ...

          PS не знаю как на сях пишется else if, может вместе
          Ответить
          • Да, вы правы... Я изначально код прочёл именно так, а только потом заметил, что он написан несколько глупее и добавил второй комментарий, оправдывающий первый :).
            Ответить
            • кстати наш вариант ловит "прямые попадания" в границу, а у автора отбрасывает. Нет ли тут подвоха?))
              И я уже сомневаюсь, что тут говнокод: такое обычно пишется в целях отладки, а потом стирается, так что нечего и задумываться об общем случае. Автор может в легкую менять диапазоны и делать их перекрывающимися, например
              if(arl[i]<0.7&&arl[i]>0.6) a7++;
              if(arl[i]<0.9&&arl[i]>0.3) a77++;

              Впрочем для проверки рендома это лишнее, так что плюсанул.
              Ответить
              • Всё-равно изящнее, наверное, было бы сделать как в первом комментарии, просто с if-ом на то, целое ли значение.
                Ответить
    • Для общего случая, когда диапазоны могут быть любые

      const int n = 10; // количество диапазонов
      const int l = 0; // нижняя
      const int h = 1; // и верхняя границы
      const double d = (h-l)/n; // шаг

      int *result = new int[n]
      for (int i = 0; i < n; ++i) result[i] = 0;
      for (int i = 0;i < arl->Count; ++i)
      {
      for (int j=n-1; j >= 0; ++j)
      {
      if (arl[i] > j * d)
      {
      result[j+1]++;
      break;
      }
      }
      }
      Ответить
    • Простите, не заметил тега code.
      Ответить
    • на автора в зеркало по утрам глядит китаец
      Ответить

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