1. PHP / Говнокод #5801

    +164

    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
    <?php
    // Создаём функцию struktura_array (массив со значениями)
    function struktura_array($mas) {
    //Подсчитываем количество значений в массиве $mas
    $col_el = count($mas);
    //Подсчитываем количество всевозможных вариантов по формуле 2^n – 1, n = $col_el
    $col_zn = pow(2,$col_el)-1;
    
    //Делаем цикл до $i = $col_zn
    for ($i=1; $i <= $col_zn; $i++) {
    //выполняем преобразование числа $i в двоичную систему
     $dlina_i_bin = decbin($i);
    //Дописываем нули в левую часть на длину $col_el
     $zap_str = str_pad($dlina_i_bin, $col_el, "0", STR_PAD_LEFT);
    //Переворачиваем $zap_str
     $zap_dop = strrev($zap_str);
     $dooh = array();
    //Преобразуем $zap_dop в массив вида Array (0=>"0", 1=>"1", 2=>"1", 3=>"0", 4=>"0")
     for($j=0; $j < $col_el; $j++) {
     $dooh[] = $zap_dop[$j];
     }
    //Обнуляем $d и $a чтоб при следующем проходе цикла они были пустыми
     $d = 0; $a = "";
    //Теперь самое интересное
    //Итерируем по массиву $dooh и выдергиваем значения (либо 1 либо 0)
     foreach ($dooh as $k=>$v) {
    //Если выдернули 1 то в массив $a записываем значение с соответствующим ключом
       if ($v == 1) {$a[] .= $mas[$d];}
    //Увеличиваем ключ на единицу для перехода по массиву
       $d++;
     }
     $return[] = $a;
    }
    
    return $return;
    }

    Запостил: qbasic, 25 Февраля 2011

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

    • автор видимо зарплату за комментарии к коду получает а не за сам код.
      Ответить
      • Кстати, есть где-нибудь сейчас построчная оплата кода?
        Ответить
        • не знаю :)
          да и вообще первый раз слышу об этом, а такое что бывает(ло) ?
          Ответить
          • бывает. мы один раз с такими немцами работали. эти пидарасы сделали по 10 наследоований классов пустышек.
            мол кода дохуя - значит работа сделана. ага
            Ответить
            • они захотели больше заработать чем на своем порно :)
              Ответить
              • да, только этот проект нам на дописывание дали.
                немцы доигрались до того что сами скомпилировать уже его не осиливали. мы сделали скрипты сборки.
                собираться то оно собиралось :))
                но вот переписывать.... проще было заново написать.
                Ответить
    • struktura_array
      Ответить
    • в начале не хватает комментария
      // пишем говнокод
      Ответить
    • У автора просто память плохая.
      Ответить
    • бля!!! да ведь автор забыл написать

      //возвращаем массив $return
      return $return;

      как же он теперь в своем коде разберется?
      Ответить
    • Очевидно, что это какой-то туториал.
      Ответить
    • Реализация не очень, а вот алгоритм интересный.
      Переписал на C# ООП более-менее. Может быть, кому пригодится. Прошу не пинать.
      public class UniqueCombination<T>
      {
      /*Все элементы находятся только в своих позициях, сочетания отличаются только присутствием/отсутствием конкретных элементов.
      * Алгоритм взят отсюда: sources.ru/magazine/1207/5.html
      * Переделал на ООП. Вместо цикла сделал GetNext(), упростил.*/
      T[] _array;
      int _maskNumber = 0;

      public UniqueCombination(T[] array)
      {
      _array = array;
      }

      public T[] GetNext()
      {
      var permutation = GetPermutationByNumber(_array, _maskNumber);
      _maskNumber++;
      return permutation;
      }

      public static T[] GetPermutationByNumber(T[] array, int number)
      {
      var binaryMask = GetPermutationMask(number, array.Length);
      var permutation = GetPermutationByMask(array, binaryMask);
      return permutation;
      }

      static bool[] GetPermutationMask(int maskNumber, int arrayLength)
      {
      //var col_zn = (int)Math.Pow(2, arrayLength) - 1;
      var mask = Convert.ToString(maskNumber, 2);
      // var zap_dop = zap_str.Reverse().ToArray();

      bool[] binaryMask = new bool[arrayLength];
      for (int i = 0; i < mask.Length; i++)
      {
      binaryMask[i] = (mask[i] == '1');
      }

      return binaryMask;
      }

      static T[] GetPermutationByMask(T[] array, bool[] binaryMask)
      {
      var permutation = new T[array.Length];
      for (int k = 0; k < binaryMask.Length; k++)
      {
      if (binaryMask[k])
      {
      //Записываем элемент в перестановку
      permutation[k] = array[k];
      }
      }
      return permutation;
      }
      }
      Ответить
      • Точнее так:
        public class UniqueCombination<T>
        {
        /*Все элементы находятся только в своих позициях, сочетания отличаются только присутствием/отсутствием конкретных элементов.
        * Алгоритм взят отсюда: http://sources.ru/magazine/1207/5.html
        * Переделал на ООП. Вместо цикла сделал GetNextCombination(), упростил.*/
        T[] _array;
        int _maskNumber = 0;
        public UniqueCombination(T[] array)
        {
        _array = array;
        }
        public T[] GetNextCombination()
        {
        var combination = GetCombinationByNumber(_array, _maskNumber);
        _maskNumber++;
        return combination;
        }
        public static T[] GetCombinationByNumber(T[] array, int number)
        {
        var binaryMask = GetCombinationMask(number, array.Length);
        var combination = GetCombinationByMask(array, binaryMask);
        return combination;
        }
        static bool[] GetCombinationMask(int maskNumber, int arrayLength)
        {
        //Подсчитываем количество всевозможных вариантов
        //var col_zn = (int)Math.Pow(2, arrayLength) - 1;
        var mask = Convert.ToString(maskNumber, 2);
        //Переворачиваем (не нужно, походу)
        // var zap_dop = zap_str.Reverse().ToArray();
        bool[] binaryMask = new bool[arrayLength];
        for (int i = 0; i < mask.Length; i++)
        {
        binaryMask[i] = (mask[i] == '1');
        }
        return binaryMask;
        }
        static T[] GetCombinationByMask(T[] array, bool[] binaryMask)
        {
        var combination = new T[array.Length];
        for (int k = 0; k < binaryMask.Length; k++)
        {
        //Если маска этого элемента true,
        //то в массив записываем его в перестановку
        if (binaryMask[k])
        {
        combination[k] = array[k];
        }
        }
        return combination;
        }
        }
        Ответить
        • Ну ваша-то реализация гораздо лучше, лол. Особенно порадовал GetCombinationMask. Ну и это уж точно не перестановки (permutations), на лицо рука попытка генерации всех подмножеств заданного множества.
          Ответить

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