|
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 4
|
|
В поисках панграмм [excel, vba]12.01.2017, 20:51. Показов 2219. Ответов 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
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|