Имя: Пароль:
1C
1С v8
Как перебрать все варианты комбинаций
0 mzelensky
 
14.03.13
12:48
Есть 5 массивов: М1,М2,М3,М4,М5.

Каждый из них может быть пустым, а может содержать значения.

Сгенерировать все варианты комбинаций вот такой маски:

М1 М2  М4    М5     М4  М3  М1

Как видно из маски, элементы массивов М1 и М4 должны еще и внутри себя комбинироваться (т.е. каждый с каждым).

КАК ТАКОЕ РЕАЛИЗОВАТЬ?!?!?!?!
1 bse
 
14.03.13
12:51
а подумать?
2 mzelensky
 
14.03.13
12:52
ну что, кто головоломки любит???

Лично я терпеть не могу :(
3 mzelensky
 
14.03.13
12:52
(1) уже думаю!
4 Maxus43
 
14.03.13
12:53
все варианты комбинаций в запросе - это кросс джойн например, может туды копать?
5 mzelensky
 
14.03.13
12:55
(4) там еще замутка в том, что какие-то массивы могут быть ПУСТЫМИ! Т.е., например М4 пуст, значит маска будет уже такая:

М1 М2     М5    М3  М1

А если М4 и М2 пусты, то такая

М1  М5  М3  М1

...
6 Нога
 
14.03.13
12:58
(5) Не передавать в запрос пустые может?
7 MSII
 
14.03.13
12:59
Все массивы соединить, из каждого выбрать значения, выбросить строки с NULL хотя бы в одной ячейке.
8 MSII
 
14.03.13
13:01
М1 и М4 соединить дважды. Выбирать значения только из непустых массивов (придется динамически тест запроса генерить).
9 0xFFFFFF
 
14.03.13
13:01
Чет не уловил что надо
10 mzelensky
 
14.03.13
13:02
(7) а как в соединении с делать фишку из (0) с массивами М1 и М4 ?

При это мне же нужно не просто все омбинации, а все комбинации по определенной маске!
11 НафНаф
 
14.03.13
13:02
ничего не понял
12 mzelensky
 
14.03.13
13:04
(9) (11) что не понятно???
озьмите листок с ручкой и попробуйте нарисовать, то о чем я говорил в (0).
13 MSII
 
14.03.13
13:06
(10) А ты представь, что М1 и М4 - это не М1 и М4, а М6 и М7. И забудь про свою маску, просто получи все комбинации всех значений всех семи массивов.
14 mzelensky
 
14.03.13
13:07
(13) мне об это забывать нельзя! Данная форма маски ОБЯЗАТЕЛЬНА и особенность М1 и М4 тоже обязательна!
15 mzelensky
 
14.03.13
13:08
(14) т.е. мне нужно не просто ВСЕ варианты перебрать (варианты перестановок), а варианты перестановок по определенному правилу.
16 NS
 
14.03.13
13:08
Кодер он всегда алгоритмист. Придумывает сложнейшие алгоритмы. Например как сложить два числа. Как сравнить два числа. Даже цикл может придумать.
17 MSII
 
14.03.13
13:09
(14) Чем отличаются массивы М1 и М6, если они содержат одинаковые значения?
18 NS
 
14.03.13
13:09
А когда вложенные циклы, или не дай бог перестановки и сочетания - это уже головоломка. Такое только академик может решить.
19 НафНаф
 
14.03.13
13:10
зачем кстати?
20 MSII
 
14.03.13
13:11
(15) Смотри. Массив М1[89,108], остальные массивы пустые. Сколько комбинаций будет по твоему правилу?
21 1Сергей
 
14.03.13
13:13
Рекурсией легко делается
22 mzelensky
 
14.03.13
13:13
(20) каждый с каждым.
23 mzelensky
 
14.03.13
13:13
(21) подскажи как!

У меня пока ума хватает только на довольно сложные вложенные циклы
24 mzelensky
 
14.03.13
13:14
(19) какая тебе разница зачем?
25 MSII
 
14.03.13
13:14
(22) Ну вот, теперь забудь про свое правило. Массивов 7, М1[89,108] и М7[89,108], остальные пустые. Сколько будет комбинаций?
26 NS
 
14.03.13
13:14
Делается как угодно. Даже ребенок, совершенно незнакомый с программированием спокойно распишет все сочетания. А кодер всего лишь должен уметь готовый алгоритм расписать в виде кода. Алгоритм тут понятен. В чем могут быть проблемы?
27 MSII
 
14.03.13
13:15
(23) Как только ты поймешь, что тебе просто нужны все комбинации значений 7 массивов, так сразу же станет легче.
28 mzelensky
 
14.03.13
13:18
(27) да, с 7 соласен. Ток я сейчас начал не с запроса, а с циклов. Попробую сперва так.
29 mzelensky
 
14.03.13
13:19
(26) кричать, что все просто и элементарно может "Даже ребенок". А ты возьми и сделай!
30 NS
 
14.03.13
13:19
На семерке - без учета возможности пустых массивов
Процедура Скомбинировать(стр,м1="",м2="",м3="",м4="",м5="",м6="",м7="",м8="")
перем а;
Если пустоезначение(м1)=0 тогда
Для каждого а из м1 цикл
 Скомбинировать(стр+" "+а+" ",м2,м3,м4,м5,м6,м7,м8);
конеццикла;
КонецЕсли;
КонецПроцедуры
31 NS
 
14.03.13
13:20
(29) А чего тут делать? Алгоритм известен. Если ты кодер - просто напиши.
32 NS
 
14.03.13
13:21
Процедура Скомбинировать(стр,м1="",м2="",м3="",м4="",м5="",м6="",м7="",м8="")
перем а;
Если пустоезначение(м1)=0 тогда
Для каждого а из м1 цикл
 Скомбинировать(стр+" "+а+" ",м2,м3,м4,м5,м6,м7,м8);
конеццикла;
Иначе
сообщить(стр);
КонецЕсли;
КонецПроцедуры
//
Скомбинировать("",м1,м2,м3,м2,м1);
33 mzelensky
 
14.03.13
13:23
(32) и что это будет?!
34 NS
 
14.03.13
13:24
(33) Это будет то что ты просил. Выводиться все сочетания будут в виде строки.
Не хочешь в виде строки, сделай в любой другой структуре.
35 vladimir-boy
 
14.03.13
13:25
(0) а запросом соединить НЕ?
36 NS
 
14.03.13
13:38
Для примера
Процедура Скомбинировать(стр,м1="",м2="",м3="",м4="",м5="",м6="",м7="",м8="")
перем а;
Если пустоезначение(м1)=0 тогда
Для а=1 по м1.размерсписка() цикл
 Скомбинировать(стр+" "+м1.получитьзначение(а)+" ",м2,м3,м4,м5,м6,м7,м8);
конеццикла;
Иначе
сообщить(стр);
КонецЕсли;
КонецПроцедуры
//
Процедура Сформировать()
   с1=создатьобъект("СписокЗначений");
   с1.Добавитьзначение("11");
   с1.Добавитьзначение("12");
   с1.Добавитьзначение("13");
   
   с2=создатьобъект("СписокЗначений");
   с2.Добавитьзначение("1");
   с2.Добавитьзначение("2");
   Скомбинировать("",с1,с2,с1);
КонецПроцедуры
вывод
11  1  11
11  1  12
11  1  13
11  2  11
11  2  12
11  2  13
12  1  11
12  1  12
12  1  13
12  2  11
12  2  12
12  2  13
13  1  11
13  1  12
13  1  13
13  2  11
13  2  12
13  2  13
37 1Сергей
 
14.03.13
14:00
Процедура СообщитьМассив(Массив)
   Стр = "";
   Для каждого ЭлементМассива Из Массив Цикл
       Стр = ?(Стр="","",Стр + ", ") + ЭлементМассива;
   КонецЦикла;
   Сообщить(Стр);
КонецПроцедуры

Функция ВывестиКомбинации(Знач Массивы, Комбинация = Неопределено)
   
   Если Комбинация = Неопределено Тогда
       Комбинация = Новый Массив;
   КонецЕсли;
   
   Если Массивы.Количество()>0 Тогда
       МассивыБезПервого = Новый Массив;
       Для Идн=1 по (Массивы.Количество()-1) Цикл
           МассивыБезПервого.Добавить(Массивы[Идн]);
       КонецЦикла;
       Если Массивы[0].Количество()>0 Тогда
           Для каждого Элемент Из Массивы[0] Цикл
               Комбинация.Добавить(Элемент);
               ВывестиКомбинации(МассивыБезПервого, Комбинация);
               Комбинация.Удалить(Комбинация.Количество()-1);
           КонецЦикла;
       Иначе
           ВывестиКомбинации(МассивыБезПервого, Комбинация);
       КонецЕсли;
   Иначе
       СообщитьМассив(Комбинация);
   КонецЕсли;
   
КонецФункции

Функция СоздатьМассив(Э1=Неопределено, Э2=Неопределено, Э3=Неопределено, Э4=Неопределено, Э5=Неопределено, Э6=Неопределено, Э7=Неопределено, Э8=Неопределено, Э9=Неопределено, Э10=Неопределено)
   
   Результат = Новый Массив;
   
   Для Идн=1 По 10 Цикл
       Если Не Вычислить("Э"+Идн)=Неопределено Тогда
           Результат.Добавить(Вычислить("Э"+Идн));
       КонецЕсли;
   КонецЦикла;
   
   Возврат Результат;
   
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)
   М1 = СоздатьМассив(1, 2 ,4 ,5);
   М2 = СоздатьМассив(7);
   М3 = СоздатьМассив(3, 1, 4);
   М4 = СоздатьМассив();
   М5 = СоздатьМассив(5, 4, 2);
   
   // М1 М2  М4    М5     М4  М3  М1
   СписокМассивов = Новый Массив;
   СписокМассивов.Добавить(М1);
   СписокМассивов.Добавить(М2);
   СписокМассивов.Добавить(М4);
   СписокМассивов.Добавить(М5);
   СписокМассивов.Добавить(М4);
   СписокМассивов.Добавить(М3);
   СписокМассивов.Добавить(М1);
   
   ВывестиКомбинации(СписокМассивов);
   
   
КонецПроцедуры
38 1Сергей
 
14.03.13
14:06
а вообще, интересная задачка, спасибо :) Размял мозг
Программист всегда исправляет последнюю ошибку.