|
В ПОИСКАХ ПАНГРАММ [EXCEL, VBA]
|
|||
---|---|---|---|
#18+
ПРИВЕТСТВИЕ -Бодрого.. -Не ври, мне, скоту!(( (анаграмма в стиле «тихо сам с собою я веду беседу») ВАЖНО Просматривая профиль тов. Казанского на сайте programmersforum.ru , наткнулся на тему, в комментарии к которой он рекомендует автору (REztor) в случае размещения вопроса на разных форумах, информировать об этом на каждом из них. Отыскав в гугле все форумы, на которых REztor разместил свой вопрос ( sql.ru , programmersforum.ru , cyberforum.ru , forum.oszone.net ), я таки готов рискнуть и повторить его подвиг. По случаю банкета к вышеупомянутым форумам также присоединяются planetaexcel.ru и excelworld.ru . КТО МЫ? Все мы люди-человеки. ЧЕГО МЫ ХОТИМ? На входе имеем базу слов, на выходе – все возможные по условиям панграммы. УСЛОВИЯ 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)), и уже это использовать как условие для запрета совмещения тех или иных слов. Если все гораздо проще, то да простит меня Оккам! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 20:50 |
|
В ПОИСКАХ ПАНГРАММ [EXCEL, VBA]
|
|||
---|---|---|---|
#18+
"Просто заходите, хвастаться не надо!" (по мотивам от Задорнова). Цель публикации - какая? если есть вопрос, сформулируйте его явно, что ли... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2017, 07:55 |
|
В ПОИСКАХ ПАНГРАММ [EXCEL, VBA]
|
|||
---|---|---|---|
#18+
Akina , цель публикации - поделиться своим интересом к вопросу, идеями по его решению, и, по возможности, получить советы или готовые примеры как например тута или здеся . ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2017, 20:31 |
|
В ПОИСКАХ ПАНГРАММ [EXCEL, VBA]
|
|||
---|---|---|---|
#18+
Ну глянул по касательной... конструктива имхо капли, а код вообще ниачём. Каков у Вас объём словаря (в штуках)? magИstr rУЛonДело за малым – научиться выделять из столбца #1 диапазон слов с разными буквами, сумма численных значений которых равна (2^33)-1 = 8589934591А чего там учиться? неужели не слышали про bitwise OR? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2017, 21:18 |
|
В ПОИСКАХ ПАНГРАММ [EXCEL, VBA]
|
|||
---|---|---|---|
#18+
По касательной? Диагональ уже не в моде?) Обработанные словари (буквы в словах не повторяются) висят вот тут в 4 (24687 и 25248 слов) и 1 (33505, суммарно без дубликатов) постах. Как уже писал вот тут (пост 3): magИstr rУЛonВ программирования я профан, Excel для меня это что-то такое, с чем вроде бы еще не страшно работать. Могу представить в общих чертах как мы можем придти к тому или иному результату, а вот написать формулу или макрос - увы и ах. Прочитал в вики о bitwise OR, грубо говоря половину знаю, с половиной познакомился. Выводов как все это применить к задаче, увы, не родилось. К слову, ее уже решил тов. MCH на форуме по первой ссылке в этом посте с помощью OpenSolver и обнаружил сначала 2, а позже еще 3 (т.е. на данный момент суммарно 5) панграмм. Каким именно образом - для меня это пока загадка. Будем посмотреть.. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2017, 23:20 |
|
В ПОИСКАХ ПАНГРАММ [EXCEL, VBA]
|
|||
---|---|---|---|
#18+
В общем, суммарный словарь получится тыщ на 40... одно плохо - лобовое использование словарей плохо подходит для поиска/построения фраз, ибо в них должны быть всякие падежи-склонения-прочее, что словарям недоступно. magИstr rУЛonкак все это применить к задаче, увы, не родилось. Каждой букве своё бито-место. В рамках 33 бит каждое слово, не содержащее повторяющихся букв, имеет свой собственный уникальный код. Машина, а точнее процессор, 33 бита не разумеет, а вот 64 - запросто, остальные (старшие) 31 бит будут нулевыми. Фраза, состоящая из нескольких слов, также кодируется некоим 33-битовым кодом. А проверка, что каждая буква во фразе встречается только один раз, элементарна - побитный OR кодов всех слов должен быть равен арифметической сумме этих кодов. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2017, 22:51 |
|
В ПОИСКАХ ПАНГРАММ [EXCEL, VBA]
|
|||
---|---|---|---|
#18+
AkinaВ рамках 33 бит каждое слово, не содержащее повторяющихся букв, имеет свой собственный уникальный код.Пардон, не каждое слово, а совокупность составляющих это слово букв. Так что слова-анаграммы имеют одинаковые коды. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2017, 22:53 |
|
|
start [/forum/topic.php?fid=60&fpage=17&tid=2155344]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 145ms |
0 / 0 |