- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 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;
}
Sulik78 25.02.2011 10:37 # 0
Skelet0n 25.02.2011 10:47 # 0
Sulik78 25.02.2011 12:01 # −2
да и вообще первый раз слышу об этом, а такое что бывает(ло) ?
brainstorm 25.02.2011 12:10 # 0
мол кода дохуя - значит работа сделана. ага
Sulik78 25.02.2011 12:16 # 0
brainstorm 25.02.2011 12:19 # 0
немцы доигрались до того что сами скомпилировать уже его не осиливали. мы сделали скрипты сборки.
собираться то оно собиралось :))
но вот переписывать.... проще было заново написать.
TarasB 25.02.2011 15:41 # 0
Lure Of Chaos 25.02.2011 16:06 # 0
Анонимус 25.02.2011 16:08 # +4
telnet 25.02.2011 20:17 # 0
Тоже прокатит.
Lure Of Chaos 25.02.2011 21:50 # +1
istem 26.02.2011 00:41 # 0
Lure Of Chaos 26.02.2011 00:46 # 0
ZX_Spectrum 25.02.2011 23:52 # +1
$CTPYKTYPA_DAHHbIX - вот теперь красиво! :)
bugmenot 26.02.2011 19:24 # +3
ZX_Spectrum 25.02.2011 16:59 # +5
Int 25.02.2011 23:29 # 0
Lure Of Chaos 25.02.2011 23:48 # 0
Uchkuma 26.02.2011 11:02 # 0
//возвращаем массив $return
return $return;
как же он теперь в своем коде разберется?
Kevin 26.02.2011 12:48 # −3
Uchkuma 26.02.2011 13:13 # +1
Lure Of Chaos 26.02.2011 17:26 # +1
FutureCome 14.08.2013 11:39 # 0
Переписал на 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;
}
}
FutureCome 14.08.2013 11:48 # 0
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;
}
}
roman-kashitsyn 14.08.2013 12:05 # 0
FutureCome 14.08.2013 12:42 # 0