Страницы: 1
RSS
Генерация всех возможных комбинаций слов из 2-3 колонок
 
Исходные данные (на примере ФИО понять ТЗ легче, но в итоговой задаче число колонок может быть 2-10):

Предположим, есть 3 колонки: "Фамилия", "Имя", "Отчество". Список может содержать N записей.

Фамилия Имя Отчество
Иванов Сергей Никанорович
Смирнов Петр Петрович
Сидоренко Михаил Евгеньевич
… … …
… … …
… … …
Необходимо сгенерировать новый список, который будет включать в себя все возможные комбинации между собой (все фамилии + все имена + все отчества).

Фио
Иванов Сергей Никанорович
Иванов Сергей Петрович
Иванов Сергей Евгеньевич
Иванов Петр Никанорович
Иванов Петр Петрович
Иванов Петр Евгеньевич
Иванов Михаил Никанорович
Иванов Михаил Петрович
Иванов Михаил Евгеньевич
Смирнов Сергей Никанорович
Смирнов Сергей Петрович
Смирнов Сергей Евгеньевич
Смирнов Петр Никанорович
Смирнов Петр Петрович
Смирнов Петр Евгеньевич
Смирнов Михаил Никанорович
Смирнов Михаил Петрович
Смирнов Михаил Евгеньевич



Подскажите плз, как такое реализовать, желательно с помощью формул.
Изменено: zamboga - 03.10.2017 00:04:29
 
Это очень легко делается с помощью макросов, а вот с помощью формул даже и не представлю сразу. Здесь нужны циклы, которые по факту (кроме циклических ссылок) нельзя реализовать.
Еще один способ обойтись без циклов - попробовать ветвление с функцией "ЕСЛИ".
Изменено: Все_просто - 18.06.2013 16:27:52
С уважением,
Федор/Все_просто
 
пичалька, с формулами я еще разберусь, а вот скрипты знаю только на уровне "записать макрос"/"запустить макрос"

Но, безусловно, буду признателен хотя бы за такую возможность (через макрос) -- с утра инет копаю, что бы решить. :oops:
 
Как вариант можно построить подобие таблицы умножения, но в таком случае надо будет повторить эту операцию дважды: вначале собрать И+О, а потом Ф + (И+О). Сейчас не могу приложить файл - на работе.
В общем случае, чтобы потом избавиться от "тела матрицы" можно использовать сводные таблицы.
Изменено: Все_просто - 18.06.2013 16:53:58
С уважением,
Федор/Все_просто
 
еще я не учел, что в итоговом результате на первом месте или втором месте тоже должно стоять любое слово (из 1,2, 3 колонки).

Т.е., например, такие варианты тоже нужны:

Михаил Евгеньевич Смирнов
Михаил Смирнов Евгеньевич

Евгеньевич Смирнов Михаил
Евгеньевич Михаил Смирнов
...
и т.д.
Т.е. мне надо сгенерировать все варианты комбинаций 1-2-3 колонок.
 
Это похоже на подбирание кода.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Кросс: http://www.excelworld.ru/forum/2-5133-1
Я сам - дурнее всякого примера! ...
 
Владимир, это называется не подбирание кода, а алгоритм брутфорса (грубого подбора) → http://ru.wikipedia.org/wiki/Полный_перебор
Еще хотел бы сказать, что впечатлен этажностью решения. Это ж какую надо выдержку иметь.  :)
Изменено: Все_просто - 18.06.2013 19:46:48
С уважением,
Федор/Все_просто
 
Владимир, спасибо огромное!

Формула впечатляет=)
 
Цитата
zamboga пишет:
Формула впечатляет=)
Ну формулу можно было бы и покороче составить (раза в три), к тому же не массивную и автоматически подстраиваемую по количеству значений в столбце A
 
Цитата
Все_просто пишет:
Как вариант можно построить подобие таблицы умножения
Вообще-то, этот процесс так и называется - "декартово произведение".  :)

При желании, можно просто получить данные запросом:
Код
SELECT * FROM [Лист1$A:A] t1, [Лист1$B:B] t2, [Лист1$C:C] t3
Поскольку строка запроса - это текст, то можно динамически изменять параметры (например, собрать необходимое количество столбцов) без переделки самого кода процедуры.
 
Коллеги, считает не совсем корректно, вернее, считает то нормально, но только для __идеальных__ входных данных, как в первоначальном примере.
К сожалению, я не учел некоторые детали в первоначальном ТЗ.

Попробовал поковырять формулы Владимира и МСН -- либо ошибки, либо неверная выдача. Своих знаний никак пока не хватает.

Ошибки отработки формул:
1. входные данные должны быть разделены по отдельным колонкам, как в моем примере, (а не как вы предложили, в одной)-- т.к. в качестве входных данных также выступают и фразы. Поэтому, даже если я объединяю свои входные данные в одну колонку -- то сейчас формула не корректно отработает, т.к. сейчас в вашем варианте решения разделителем выступает пробел.

2. Если на входе число колонок (слов) отличается от трех в любую сторону, то тоже формула не работает (причина, думаю, та же, разделитель -- пробел)

3. Первая колонка (фраза или слово) -- всегда на первом месте, тогда как мне надо получить все варианты (любая фраза из любой колонки на первом месте, на втором месте, на любом месте)

Уточненное ТЗ
Входные данные
1. На входе может быть 2-10 колонок (или n колонок для общего случая)
2. В каждой колонке содержится текстовая фраза
3. Каждая фраза состоит из 0-10 слов (или m слов для общего случая), во фразе могут быть цифры 0-9 и числа, знаки препинания .,!?, скобки (), кавычки "", дефисы -, слеш прямой и обратный /\, двоеточие :, точка с запятой ;, и т.д. Словом, любые знаки препинания и пунктуации (любые символы с клавиатуры)
4. Колонка может содержать пустые ячейки
5. Число строк с фразами в каждой колонке различно

Выходные данные
1. Одна колонка -- фразы, вторая колонка -- длина строки.
2. Каждая фраза комбинируется с каждой другой фразой, каждая фраза должна побывать на 1, 2, 3, ..., n месте.
3. На орфографическое и грамматическое несоответствие слов между собой не обращаем внимания. На итоговый порядок знаков препинания -- тоже.
4. Итоговый список отсортирован по возрастанию длины строки.

Если решение можно формулой -- лучше формулой, что бы я смог хоть как-то подразобраться. Или скрипт=)
Я прикрепил новый пример.
Сори, что написал и сюда, и на excelworld.
Изменено: zamboga - 03.10.2017 00:05:39
 
2-3 колонки, указанные в названии темы, выросли до 10.
То ли аппетит приходит.... то ли думать некогда.

Задача поменялась кардинально. Формулами можно, но затратно: сначала в отдельных столбцах по слову (одна позиция - один столбец), + столбец со сцепленными значениями.
 
Товарищи знатоки, тут несколько строк по три слова. А если у нас 1 столбец с 60-ю фамилиями и второй - с 80-ю именами? А вывести надо в третий столбец ВСЕ варианты фамилия ПОТОМ имя? Или же один столбец - фамилии, а другой - имена, ВСЕ варианты? Второй вариант даже лучше.
И как сделать, чтоб количество исходных вариантов фамилий и имен программа брала из отдельных ячеек (они постоянно меняются при каждом новом расчете).

Устроит любой вариант: формулы, макрос... лишь бы работало.
Изменено: Alex_Z - 02.10.2017 21:49:10
 
Доброе время суток.
Цитата
Alex_Z написал:
1 столбец с 60-ю фамилиями и второй - с 80-ю именами... любой вариант
Да пожалуйста. Даже пальцы за вас загнул  :D
Изменено: Андрей VG - 02.10.2017 22:08:51
 
У Вас вопрос по этой же теме? Где тогда Ваш файла-пример?
 
Ого! Андрей, немного не понятно, как вы это сделали. Но спасибо. Можете вкратце пояснить?

Алексей.
 
Цитата
Alex_Z написал:
Можете вкратце пояснить?
Цитата
AndreTM написал:
этот процесс так и называется - "декартово произведение".
Цитата
Alex_Z написал:
как вы это сделали.
Power Query.
Изменено: Андрей VG - 02.10.2017 22:19:07
 
Спасибо. Пойду гуглить. Нашел еще тему с вашим советами (про SQL запрос).  
 
Цитата
Alex_Z написал:
(про SQL запрос).
Не, Power Query несколько другое. ;)
Изменено: Андрей VG - 02.10.2017 22:37:36
 
см. вложение. для
ф1 и1 о1
ф2 и2 о2
ф3 и3
ф4
имеем 24 варианта сочетаний ф, и, о.
добавьте ф5 - получите 30 вариантов
добавьте о3 - получите 45 вариантов
добавьте о4 - 60 вариантов.
при приведенных значениях это такая система счисления, в которой в первом разряде есть 4 варианта, во втором 3 и в третьем 2.

вставляя перед формулой новуя колонку (отодвигая ее вправо) в появившуюся колонку можно дописать значения 4-го разряда, а в саму формулу необходимо будет дописать 4-е слагаемое по аналогии с 3-им и она станет работать с 4-мя разрядами
и т.д.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Игорь, спасибо большое!  
Страницы: 1
Наверх