|
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 4
|
|
В поисках панграмм [excel, vba]12.01.2017, 20:51. Показов 2329. Ответов 19
Метки нет (Все метки)
ПРИВЕТСТВИЕ
ЧЕГО МЫ ХОТИМ? На входе имеем базу слов, на выходе – все возможные по условиям панграммы. УСЛОВИЯ 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)), и уже это использовать как условие для запрета совмещения тех или иных слов. Если все гораздо проще, то да простит меня Оккам!
0
|
|
| 12.01.2017, 20:51 | |
|
Ответы с готовыми решениями:
19
EXCEL VBA |
|
142 / 125 / 50
Регистрация: 10.11.2011
Сообщений: 622
|
|
| 13.01.2017, 08:22 | |
|
0
|
|
| 13.01.2017, 08:40 | |
|
0
|
|
|
|
||||||
| 13.01.2017, 13:41 | ||||||
|
Генератор панграмм на основе Генератора анаграмм(
Ускорить работу программы ) Кликните здесь для просмотра всего текста
Application.CheckSpelling определяет каки- то неизвестные двухбуквенные слова (например "ид") - претензии предъявляйте к компании Microsoft. Для 33 букв может не хватить оперативной памяти. Время перебора ветвей, веточек и листьев дерева всех комбинаций 33 букв даже не оценивал, оно может быть гигантским. К тому же задача со всеми 33 буквами кириллицы может быть не решаема в принципе, так как будет ощущаться нехватка гласных.
0
|
||||||
|
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 4
|
||
| 13.01.2017, 20:00 [ТС] | ||
|
yutrans, благодарю. Исключительно на этом форуме модератор почему-то удалил ссылки на прочие ресурсы, где я разместил аналогичный пост. Или необходимо ссылаться непосредственно на темы?
SoftIce, Билли Миллиган и компания. KoGG, спасибо за содействие! Макрос, к сожалению, как Вы уже подчеркнули, далеко не самый оптимальный. И уже после всего этого я твердо могу заявить, что с Вами не согласен.
0
|
||
| 14.01.2017, 10:11 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 4
|
|
| 14.01.2017, 21:39 [ТС] | |
|
SoftIce, это наш фанат.
0
|
|
|
|
||||||
| 17.01.2017, 12:03 | ||||||
|
Генератор панграмм на Вашей базе слов.
Быстродействие тоже низкое, запустил для 33 букв и в отладочном режиме смотрю текущие промежуточные комбинации. Несколько минут уходит только на 1 слово верхнего уровня, несмотря на то, что начинаю тестовый перебор с 5-ти буквенных слов (для оптимизации).
0
|
||||||
|
|
||||||
| 17.01.2017, 15:11 | ||||||
|
Не удалось.
Задача явно для суперкомпьютеров. Вот второй вариант кода, с небольшим ускорением по частотности букв и прочими.
Не дождался смены 1-го слова , десятки минут работает. Может быть еще и можно немного ускорить, но большое время работы сулят сами законы комбинатортики .
0
|
||||||
|
|
|
| 17.01.2017, 15:25 | |
|
Причем в известных панграммах
https://www.artlebedev.ru/kovodstvo/sections/33/ буквы повторяются, а здесь по условиям задачи в панграмме каждая буква должна встречаться только 1 раз. И база слов, которую я взял у magNstr rYJIon бедновата, словоформы отсутствуют. Со всеми падежами и словоформами база разбухнет и работа генератора еще замедлится.
0
|
|
| 17.01.2017, 16:11 | ||
|
Алгоритм, с помощью которого можно найти панграммы я расписал по ссылке из второго поста (нашел более двух десятков панграмм по словарю из 24 тыс слов, но их можно подобрать существенно больше). Решение делал в полуавтоматическом режиме. Будет время полностью автоматизирую процесс.
0
|
||
| 18.01.2017, 02:01 | |
Сообщение было отмечено Sasha_Smirnov как решение
Решение
26 панграмм, слова в которых не повторяются
Кликните здесь для просмотра всего текста
взбухать дюже съёмщик шляпочный эрг
брюхач въезжий шмыг щёлкнуться эпод багряность въезд жмых шлёп щучий экю бег двухэтажный прочь съём шлюз ящик вождь зряшный кэтч съёмщица убег хлюп битюг вещь душ пляж съёмочный экзарх буж вьючный подъёмщик саз шлях эгрет вошь плюх разъёмщик стяг чуждый эбен взъехать кряж люэс подгиб шум щёчный адъюнкт вуз мэр обжёгшийся печь хлыщ два жгучесть объём хрящ шлюзный эпик брызжущий ключ подъём снять швах эге душный звяк плющ съёжить чех эмбарго баш вздуть съёмцы хрюк щеглячий эпонж дрязг жучить плюшка съёмный хвощ эфеб взгляд жечь нэп объёмистый хрущ юшка многажды съязвить чуб шейх щёлк эпюр блюмс въехать гуж подщёчный шик эрзя брюшняк гит жёлчь съездовый щуп эхма бэр гвоздь пуще съёмка шляхтич южный вглубь жох пшют разъём эсдек ящичный вхожий любя пэр съезд шмыгнуть щёчка жемчуг ксёндз объять прыщ шах элювий вруб пых съезжий фанг шмяк щёлочь этюд жгучий мышьяк нюх объезд плащ рёв эст взахлёб гюйс крыж подъять чинш щец эму Принцип поиска: после найденной панграммы, слова удаляются из словаря, далее запускается новый поиск. Если перемешать слова в словаре, то будут найдены другие панграммы. Во вложении файл с кодом и несколько десятков разных панграмм, найденных по словарю из 24 тыс. слов
2
|
|
|
|
|
| 18.01.2017, 06:33 | |
|
Из спойлера развеселили туристская и экономическая:
0
|
|
| 18.01.2017, 10:53 | |||
|
Вместо exe файла можно прикрутить lpsolve, реализованную в виде dll, имеющую доступный из VBA api, но lpsolve давно не обновлялся и работает медленнее
0
|
|||
|
|
|
| 23.01.2017, 16:29 | |
|
Модифицировал последний алгоритм перебора, поиск в следующем круге по наиболее редкой букве в оставшихся словах.
За 440 с. перебрал всю базу и ничего не нашел. Затем модифицировал - поиск в ветвях, начинающихся словами, содержащих 1 из 3-х наиболее редких букв в оставшемся массиве слов, и, о чудо, программа нашла первую панграмму за 220 секунд: обжёгшийся въезд фальц кэтч нюх рым щуп
0
|
|
| 30.01.2017, 07:41 | |
|
В коде из 13го сообщения опечатка (не правильно перечислен алфавит, пропущены буквы "ф" и "ц"), Панграммы из 17 го сообщения не верные
Выкладываю исправленный код, а также 1600 различных панграмм, найденных по словарю из 24 тыс. слов
1
|
|
| 30.01.2017, 07:41 | |
|
Помогаю со студенческими работами здесь
20
VBA Excel VBA Excel MS Excel VBA
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
|
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|