|
Как перебрать все варианты комбинаций | ☑ | ||
---|---|---|---|---|
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
|
а вообще, интересная задачка, спасибо :) Размял мозг
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |