1. C# / Говнокод #9057

    +119

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    static int getCheckNumber(int n)
    {
    return Average(n, 0);                //Сабж
    }
    
    static int Average(int x, int y)   //Функция вычисления среднего арифметического
    {
    return ((x + y) / 2);
    }

    Среднее арифметическое от произвольной переменной и нуля - эквивалентно делению на 2 :)

    Запостил: vistefan, 09 Января 2012

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

    • Гениально!
      Ответить
    • А по-моему вполне декларативненько...
      Ответить
    • может тут и неоправданно, а вообще мне такой подход навится. а то сегодня делим на два вместо использования метода, а завтра вместо вызова универсального метода будет копипаст алгоритма на 10 строк, в который он вырождается если передать в него одним из агрументов тот же ноль или например пустой список.
      Ответить
    • Говнокод этот, кстати, не цитирование чьего-то шедевра, а мой собственный, причём не как fail, а именно как оригинальное решение. У меня вообще есть такое хобби, выражать максимально простую задачу максимально большим количеством кода, но это уже отдельный разговор...
      Ответить
    • Кстати Average неправильная - округляет не туда. Надо перед делением +1 делать
      Ответить
      • Ребята, ну какого...
        Я ж показал фичу, принцип, я ж не решение пишу. Буду я ещё кодить тут пять минут, ради 2-х строк сабжа.

        Лучше ничего никуда не прибавлять, а сделать функции double
        Ответить
        • Это не ресурс не для фич а для говна.
          А код вполне себе извращенный.
          Ответить
    • Это какое-то неправильное каррирование
      правильное вот:

      typedef boost::function<int (void)> simple;
      typedef boost::function<simple (simple, simple)> func;
      typedef boost::function<simple (simple)> curry1;
      typedef boost::function<simple (void)> curry2;
      
      int average(int q)
      {
      	boost::function<int (int, int)> avg = [](int x , int y) -> int { return (x + y) / 2; };
      	func f = [&avg](simple x, simple y) -> simple { return boost::bind(avg, x(), y());  };
      	
      	simple t2 = []() -> int { return 0; };
      	simple t1 = [&q]() -> int { return q; };
      	
      	curry1 r1 = boost::bind(f, t2, _1);
      	curry2 r2 = boost::bind(r1, t1);
      	
      	simple result = r2();
      	
      	return result();
      	
      }
      
      int main(int argc, char** argv)
      {
              std::cout << average(10) << std::endl;
              return 0;
      }
      Ответить
      • PS шаблоны делать мне уже неохота. Пишите сами
        Ответить
      • Это всё фигня, я показал только принцип...
        Ответить
    • это же эквивалентно n/2 , тк y = 0, ЕВРИКА!
      Ответить

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