1. Список говнокодов пользователя denis

    Всего: 2

  2. Python / Говнокод #4317

    −94

    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
    # -*- coding: utf-8 -*-
    
    # На входе: не пустой b-массив
    # На выходе: словарь из 1-ого элемента {самый часто встречающийся элемент:количество}
    
    # 1. Сначала составляем словарь, потом ищем максимум и возвращаем
    def Freq1(b):
      assert len(b) > 0
      d = {}
      for x in b: # Пробегаем в цикле исходный массив
        d[x] = d[x] + 1 if d.has_key(x) else 1 # Если ключ уже есть, прибавляем 1, если нет, записываем 1
      v = max(d, key=d.get) # v ключ из словаря соответствующий максимальному значению
      return {v:d[v]} # Возвращаем ответ
    
    # 2. Ищем максимум прямо при составлении словаря
    def Freq2(b):
      d = {}
      m, i = 0, 0 # Максимальная частота и индекс в словаре
      for x in b: # Пробегаем в цикле исходный массив
        d[x] = d[x] + 1 if d.has_key(x) else 1 # Если ключ уже есть, прибавляем 1, если нет, записываем 1
        if d[x] > m:
          m, i = d[x], x # Запоминаем максимум и его индекс
      return {i:m}
    
    # 3. Без использования словаря (сложность квадратичная - "тупой метод")
    def Freq3(b):
      m, i = 0, 0 # Максимальная частота и соответствующее ему значение
      for x in b:
        c = b.count(x) # Сколько раз встречается x в массиве b?
        if c > m:
          m, i = c, x
      return {i:m}
    
    # Проверка (примитивный unit-тест)
    def Check(inData, expected):
      assert Freq1(inData) == expected
      assert Freq2(inData) == expected
      assert Freq3(inData) == expected
    
    Check(["banana", "banana", "apple", "banana", "banana", "apple", "onion"], {'banana': 4})
    Check([2, 3, 9, 3, 6, 6], {3: 2})
    Check([True, True, True, False, False, True], {True: 4})

    Самый часто встречающийся элемент в массиве (3 способа).
    Везде сплошной говнокод. Как ПРАВИЛЬНО найти самый часто встречающийся элемент в массиве?
    Наверное, можно ещё отсортировать массив и пробежать по нему храня текущий элемент и количество и обновляя соответствующие переменные?

    denis, 09 Октября 2010

    Комментарии (15)
  3. PHP / Говнокод #1823

    +150.8

    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
    // Выведем все ошибки на чистую воду :)
    error_reporting(E_ALL);
    
    /**
     * Рекурсивное изменение прав
     * @param string $path - Путь (файл или каталог)
     * @param int $filemode - Права, например 0755
     * @return - bool FALSE если не удалось, TRUE если удалось
     */
    function chmodTree($path, $filemode) {
      if (!is_dir($path)) return chmod($path, $filemode);
      $dir = opendir($path);
      while ($file = readdir($dir))
        if ($file != '.' && $file != '..') {
          $fullpath = $path.'/'.$file;
          if (is_link($fullpath)) return FALSE;
          if (is_dir($fullpath))
            if (!chmodTree($fullpath, $filemode)) return FALSE;
          if (is_file($fullpath))
            if (!chmod($fullpath, $filemode)) return FALSE;
        }
      closedir($dir);
      return chmod($path, $filemode);
    }
    
    // Функция file_put_contents появляется только в PHP 5.0 ;(
    if (!function_exists('file_put_contents')) {
      function file_put_contents($filename, $data) {
        if (!($f = @fopen($filename, 'w'))) {
          return FALSE;
        } else {
          $bytes = fwrite($f, $data);
          fclose($f);
          return $bytes;
        }
      }
    }
    
    /**
     * Получает файл с удалённого хоста, показывает и сохраняет в кеше
     * @param string $RemoteFile - файл на удалённой машине
     * @param string $LocalFile - локальный файл для сохранения
     */
    function CashedFile($RemoteFile, $LocalFile) {
      // Пытаемся получить файл с удалённого хоста
      $text = @file_get_contents($RemoteFile); // Игнорируем ошибки
      if ($text === FALSE) {
        // Если не удалось получить файл, тогда читаем копию из кеша
        $text = file_get_contents('cache/'.$LocalFile);
      } else {
        // Если каталога с кешем нет => создаём его
        if (!file_exists("cache"))mkdir("cache");
        // Ставим права на каталог
        chmodTree("cache", 0777);
        // Записываем полученный документ в файл
        file_put_contents('cache/'.$LocalFile, $text);
      }
      // Отдаём браузеру то что удалось скачать :)
      echo $text;
    }

    Кусок быстосляпанного кода для подгрузки частей сайта из Google Docs.
    Практически нечитаемый код, но работает, подгружает файлы с удаленного хоста, складывает их в каталог, потом оттуда читает.
    Непонятно, зачем нужна функция chmodTree, каталог cache же одноуровневый.

    denis, 10 Сентября 2009

    Комментарии (13)