Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2017, 20:50   #1
magИstr rУЛon
Новичок
Джуниор
 
Регистрация: 12.01.2017
Сообщений: 2
По умолчанию В поисках панграмм [Excel, VBA]

ПРИВЕТСТВИЕ

-Бодрого..
-Не ври, мне, скоту!((

(анаграмма в стиле «тихо сам с собою я веду беседу»)

ВАЖНО

Просматривая профиль тов. Казанского на сайте programmersforum.ru, наткнулся на тему, в комментарии к которой он рекомендует автору (REztor) в случае размещения вопроса на разных форумах, информировать об этом на каждом из них. Отыскав в гугле все форумы, на которых REztor разместил свой вопрос (sql.ru, programmersforum.ru, cyberforum.ru, forum.oszone.net), я таки готов рискнуть и повторить его подвиг. По случаю банкета к вышеупомянутым форумам также присоединяются planetaexcel.ru и excelworld.ru. Ссылки на соответствующие темы:

http://www.sql.ru/forum/1245788/v-po...ramm-excel-vba
http://forum.oszone.net/thread-322702.html
http://www.cyberforum.ru/vba/thread1899149.html
http://www.excelworld.ru/forum/10-31867-1
http://www.planetaexcel.ru/forum....omoshch

КТО МЫ?

Все мы люди-человеки.

ЧЕГО МЫ ХОТИМ?

На входе имеем базу слов, на выходе – все возможные по условиям панграммы.

УСЛОВИЯ

1. Панграммы ищем для n букв (первостепенно – 33).
2. Все буквы в конечном наборе слов предложении встречаются ровно по 1 разу.
3. Исходная база содержит слова с повторяющимися буквами и/или всякими ненужными символами (какими конкретно – не известно).

МОЙ ВКЛАД

1. Нашел формулу массива для первоначальной сортировки базы:
{=ИЛИ((ДЛСТР(A2)-ДЛСТР(ПОДСТАВИТЬ(СТРОЧН(A2);СИМВОЛ( СТРОКА($1:$255));"")))>1)}
Для слов с повторяющимися буквами выдает ИСТИНА. Далее сортируем, все строки с ИСТИНА в расход, оставляем одни только ЛОЖИ.

2. Нашел макрос на очищение нашей уже обрезанной базы от всякой нечисти - достаточно указать список лишних символов. Проблема: база большая, какой там конкретно мусор – не известно. Искал макрос который бы выводил список всех символов (по 1 шт), имеющихся на листе, не нашел.

3. Подумал над алгоритмом для работы с результирующей базой.

ВОЗМОЖНЫЙ АЛГОРИТМ

1. Выводим все буквы слова функцией ПСТР.
2. Создаем двоичный код каждого слова функцией СЧЁТЕСЛИ.
3. Переводим в десятичную систему счисления, поочередно умножая на 2^m (m<33) и затем суммируя. Можно, конечно, объединить все 0 и 1 в громоздкое 33-ёхзначное число, которое потом перегнать функцией ДВВДЕС. Имеем столбец #1 с.. назовем это численной записью числа.
4. Сортируем базу слов по столбцу #1. Имеем численную запись чисел по возрастанию/убыванию.
5. Моя остановочка.

Дело за малым – научиться выделять из столбца #1 диапазон слов с разными буквами, сумма численных значений которых равна (2^33)-1 = 8589934591 (для 33-ёх букв, не говоря уже о количестве вариаций для 32, 31 и т.д.)

ЛЁД ТРОНУЛСЯ

Нашел такую весчь, называется подбор слагаемых под нужную сумму. Является частным случаем «задачи о рюкзаке». Наиболее оптимальные на мой беглый взгляд алгоритмы обитают тута (http://www.excelworld.ru/forum/10-5196-1). Вот если бы эту штуку как-то применить в нашей задаче. Описанный мною выше возможный алгоритм можно упростить до записи слов в двоичном коде. Далее:

1. Берем первое слово, сверяем с каждым на наличие одинаковых букв (единичек). Отбираем массив #1(1) слов с буквами, которых нет в нашем первом слове.
2. Берем первое слово из массива #1(1), сверяем с каждым из массива #1(1) на наличие одинаковых букв (единичек). Отбираем массив #2(1) слов с буквами, которых нет в нашем первом слове из массива #1(1).
3. Повторяем операцию до тех пор, пока конечный массив не превратится в слово. Суммируем двоичный код получившейся выборки и проверяем на равенство 11…11 (33 шт).
4. Возвращаемся на массив уровнем выше (предпоследний), берем оттуда второе слово и делаем все то же самое (опускаемся вниз, проверяем на равенство новую выборку). Если слов в нем больше двух, повторяем операцию с третьим и так далее.
5. Продолжаем последовательно подниматься до массива #1(1), где выбираем уже второе слово, вновь опускаемся до конечного «массива» (одно слово), вновь последовательно поднимаемся и опускаемся; возвратившись в массив #1(1), берем третье слово и так далее.
6. Проверив все слова из массива #1(1), возвращаемся в исходную базу, берем 2 слово, получаем массив #1(2) и работаем с ним аналогично.

Перевод в десятичную СС – это просто сокращение записи. Можно назначить буквам «вес», например 1-33 и начать искать слагаемые под сумму 33*(33+1)/2 = 561, но т.к. они разнятся всего на единицу, ложных вариантов будет как минимум 90%. Можно назначить первой букве вес 10^-16, 17-ой – 1, последней – 10^16. В промежутке известно что. Ложные варианты сократятся на порядок. 10 можно заменить и на 100, и на 1000, но я не уверен, будет ли алгоритм подбора слагаемых под сумму корректно обрабатывать такие данные.

По сути, от двоичного кодирования, как и от дальнейших преобразований, можно отказаться и работать напрямую с буквами. Не говоря уже о возможности существования варианта, где для сравнения 2-х слов на наличие одинаковых букв достаточно, 2-х ячеек, в которых, собственно, и записаны эти слова.

Еще нашел макросы на расположение букв в слове в алфавитном порядке. Модернизированную таким образом базу можно отсортировать в алфавитном порядке, имеем, таким образом, 33 группы. Далее можно сгруппировать слова по наличию сочетаний АБ – ЮЯ (528), АБВ – ЭЮЯ (5456), АБВГ – ЫЭЯЮ (40920) и т.д. (исходя из формулы N!/((N – M*K)!*((K!)^M)), и уже это использовать как условие для запрета совмещения тех или иных слов.

Если все гораздо проще, то да простит меня Оккам!

Последний раз редактировалось magИstr rУЛon; 13.01.2017 в 20:23.
magИstr rУЛon вне форума Ответить с цитированием
Старый 13.01.2017, 10:27   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Букв много, а толку мало
Не вижу четкого вопроса / просьбы, и прикреплённого файла Excel
Или вы хотите просто поговорить об этом?
EducatedFool вне форума Ответить с цитированием
Старый 13.01.2017, 20:35   #3
magИstr rУЛon
Новичок
Джуниор
 
Регистрация: 12.01.2017
Сообщений: 2
По умолчанию

EducatedFool, цель публикации - поделиться своим интересом к вопросу, идеями по его решению, и, по возможности, получить советы или готовые примеры как например тута или здеся.

Аналогично ответил вот тут вот.

Отдельно приношу извинения за манеру письма, в случае, если текст действительно показался Вам слишком пространным.
magИstr rУЛon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
в поисках Брокер Фриланс 1 05.11.2014 22:30
вывести данные в новую книгу Excel из другой книги Excel через VBA Алла94 Microsoft Office Excel 0 08.10.2014 16:16
Совместимость Excel 2007 VBA - Excel 2010 VBA Genas Microsoft Office Excel 2 28.11.2012 15:33
VBA Word,VBA Excel решить 2 задачи fafolo4ka Фриланс 6 05.03.2012 01:15
Как запретить запуск программы на VBA Excel 2003 в Excel 2007 kovalevskivf Microsoft Office Excel 2 15.05.2009 16:47