-
Есть кубики. 6 штук. Есть русский алфавит. Граней суммарно у кубиков больше, чем букв в алфавите, но для простоты будем считать, что буквы дублировать нельзя, лишние грани оставим пустыми. Есть словарь русских слов.
Требуется разместить буквы на кубиках таким образом, чтобы была возможность составить из них наибольшее количество слов словаря.
(Вариант задачи 2) на пустых гранях можно разместить дубликаты любых букв.
-
Можно придумать и третий вариант задачи - что бы ни при каких комбинациях кубиков не образовывались основополагающие слова великого и могучего. Тем более что, русский язык тяготеет к длинным словам, и ограничивая задачу шестью кубиками, мы серьёзно сокращаем словарь.
-
вроде как есть статистика наиболее употребительных букв. берем эту статистику, отсортировываем по убыванию, и наносим на кубики по по правилу "1 кубик - 1 буква", когда кубики кончаются- в обратном порядке. так чтобы с буквой с наибольшой частотой были буквы с наименьшей частой использования.
-
-
> kilkennycat © (19.09.16 22:59) [3]
там, на сколько я понял, про какой-то конкретный словарь речь. так что статистику самому надо будет высчитывать по этому словарю. + ну получим мы результат, как по ссылке. а вот как оттуда выудить идеальное решение - пока не знаю. ясное дело, что можно посчитать самые часто используемые гласные и согласные и про чередовать их, но это не идеальное решение.
-
> и ограничивая задачу шестью кубиками, мы серьёзно сокращаем словарь.
А от запрета дублировать буквы от словаря вообще, по моему, остаются одни ошметки.
-
Удалено модератором
-
Если достаточно найти близкое решение без доказательств, можно воспользоваться генетическим алгоритмом. Я так заполнял сложные сетки кроссвордов.
-
> Dimka Maslov © (19.09.16 21:53) [1]
>
> Можно придумать и третий вариант задачи - что бы ни при
> каких комбинациях кубиков не образовывались основополагающие
> слова великого и могучего.
Эту проблему решает наличие словаря, в котором можно изначально оставить только подходящие слова :)
> Eraser © (20.09.16 01:00) [4]
>
> > kilkennycat © (19.09.16 22:59) [3]
>
> там, на сколько я понял, про какой-то конкретный словарь
> речь.
Ну частотность можно и самостоятельно по словарю посчитать. Только не очень понятно что дальше с этой частотностью делать...
> DayGaykin © (20.09.16 10:40) [7]
>
> Если достаточно найти близкое решение без доказательств,
> можно воспользоваться генетическим алгоритмом.
А как мы узнаем, близкое ли это решение?
-
новые слова в русском образуются суффиксами и окончаниями.
есть еще безсуффиксный, но его опускаем.
посему на одном кубике не надо смешивать буквы которые одинаково часто используются в корнях, суффиксах и окончаниях.
но вообще задача дурная и нерешаема.
другое дело взять кубики с конкретной раскладкой и изменить ее чтобы у нее слов стало больше
-
упс, прогнал.
в словообразовании окончания не участвуют, приставки участвуют.
-
> другое дело взять кубики с конкретной раскладкой и изменить
> ее чтобы у нее слов стало больше
>
>
Так возьми случайную раскладку и улучшай.
> > DayGaykin © (20.09.16 10:40) [7]
> >
> > Если достаточно найти близкое решение без доказательств,
>
> > можно воспользоваться генетическим алгоритмом.
>
> А как мы узнаем, близкое ли это решение?
Никак. Если интуитивно тебе решение удовлетворяет - останавливаешь процесс поиска.
В моем случае задача была практическая, а этот способ дал хоть какое-то решение за короткое время, поэтому я на нем остановился.
-
Так возьми случайную раскладку и улучшай.
нахрена мне заниматься тупой работой?
сам улучшай.
никто не знает какое же наибольшее количество слов не длиннее 6 букв есть в русском.
-
> никто не знает какое же наибольшее количество слов не длиннее
> 6 букв есть в русском.
"Есть словарь русских слов"
-
есть. и што?
в нем все слова?
-
у меня был когда-то толстенный англо-русский на 80К слов.
И чо?
-
в вопросе-то было про слова языка а не слова из словаря.
-
> iop © (20.09.16 12:51) [16]
>
> в вопросе-то было про слова языка а не слова из словаря.
В вопросе было, дословно: "составить из них наибольшее количество слов словаря".
Ты скучен.
-
> Sergey13 © (20.09.16 08:30) [5]
> А от запрета дублировать буквы от словаря вообще, по моему, остаются одни ошметки.
как вариант,
потом в этих ошмётках считаем вероятность 'близости' буковок и рассыпаем буквы по кубиках так (не знаю как), чтобы средняя взаимовероятность ('вес кубиков') была одинакова
-
> А как мы узнаем, близкое ли это решение?
Так по условию большее, а не максимальное. Достаточно сравнить с другими результатами.
Я бы тоже использовал генетические алгоритмы.
А вообще профессор Зелезняк проболтался, что троек символов доступных для составления слов около 1 000. т.е. можно составить цепочки запрещенных к перебору и далее по ним отсекать. Так что полный перебор на кластере возможен.
-
> Эту проблему решает наличие словаря
А вот и не решает, ибо что мешает из кубиков составлять не словарные слова? Мы так половину алфавита выкинем.
-
На основе словаря для каждой буквы посчитать вероятность встретить в одном слове другую букву.
вроде получится массив 32! элементов
Если в одном слове две буквы встречаются - вероятность их встречи плюс 1/X.
Где X - количество слов в словаре.
и так для каждого слова в словаре и каждой пары букв.
-
хотя всё сложнее :(
Кроме полного перебора не придумал решения.
-
> Kipor © (20.09.16 23:02) [22]
да. днем тож пришел к такому же выводу.
-
и решений будет несколько.
-
> [12] iop © (20.09.16 12:12)
> не длиннее 6 букв есть в русском
Я видел, но забыл. Напомнишь?
-
> Кроме полного перебора не придумал решения.
Количество вариантов при полном переборе в int64 не влезет.
С учетом времени на оценку каждого варианта - жизни точно не хватит.
-
Можно попробовать найти несколько хороших решений,
а потом выбрать из них лучшее.
Делим все буквы на 2 класса по 18 букв:
1 класс. Наиболее частые + наиболее редкие + 3 пустышки
2 класс. Буквы со средней частотой встречаемости.
Понятно, что таких разбиений несколько.
Для каждого из них мы найдем одно или несколько хороших решений.
Как ищем хорошее.
1. Сначала буквы первого класса разбрасываем по кубикам на основе их взаимной неприязни.
2. Затем для каждого полученного варианта проверяем 137.225.088.000 вариантов добавить буквы второго класса.
Думаю, это уже посчитать будет можно.
-
Идея решения [27] в том, что перебираются только те варианты разбросать второй класс,
которые соответствуют только небольшому числу лучших вариантов разбросать первый класс.
-
я б начал с анализа морфологии заданного словаря: приставки, корни, суффиксы...
и в задаче не указано: интересуют только 6-буквенные слова?
-
> картман © (21.09.16 11:18) [29]
При решения этой задачи мы со словами работать по существу не будем.
Слово можно представить как множество из 32 элементов,
т.е. работаем с 32-битными числами вместо слов.
Более того, нам абсолютно не важно, что слова из одинаковых букв
представляются одним и тем же числом, просто учтем их количество.
-
> Требуется разместить буквы на кубиках таким образом, чтобы
> была возможность составить из них наибольшее количество
> слов словаря.
А запрета собирать слова из словаря 2 нет? например требование обяхательно разместить буквы "Й", "Х", "У" на одном кубике?
-
> Sha © (21.09.16 11:39) [30]
думаю, мое предложение упростит перебор:
выбрали самый частый корень
приставки
суффиксы
окончания
посчитали наибольшее кол-во слов для конкретных сочетаний к, п и с - учитывая неповторяемость букв, числа будут весьма умеренными.
распихиваем буквы из полученных частей слов по разным кубикам. Следующий по частотности корень.
Не?
-
> Следующий по частотности корень.
>
ну, чуть сложнее
-
> [32] картман © (21.09.16 12:24)
> Не?
Не. Слова, где в "машинах дышит интеграл", - скукота, пардон.
-
> картман © (21.09.16 12:24) [32]
чем конкретно помогают части слова,
если все то же самое можно проделать с целым словом
и получить более достоверный результат?
-
> картман © (21.09.16 12:24) [32]
Каждый кубик - множество, слово - множество.
Слово не представимо набором кубиков,
если пересекается хотя бы с одним кубиком более, чем двумя элементами.
-
для каждой возможной пары букв (их чуть больше 1000) посчитаем по словарю количество попаданий этой пары в одно слово.
размещение конкретной пары на одном кубике сделает невозможным составление из набора кубиков соответствующего числа слов словаря. теперь есть что минимизировать.
6 букв на кубике - это 15 их пар, всего на 6 кубиках - 80 пар букв (считая без пустых).
пойдем по отсортированному по количеству нахождений списку пар от минимума по направлению к максимуму, строя граф полусовпадающих пар, пока он не поддастся разбиению на 6 частей по 15 ребер каждая.
(в алгоритмах графов не силен, но как-то так)
-
> если все то же самое можно проделать с целым словом
> и получить более достоверный результат?
более ли, учитывая предложенный в [27] алгоритм?
-
> картман © (21.09.16 14:17) [38]
по моим ощущениям - да )
Там фишка в том,
что и для класса среднечастотных букв будет выполнен полный перебор,
и для класса высокочастотных и низкочастотных - тоже полный.
Но раздельный. И раздел только один. Взаимное влияние минимально.
А в случае частей слов, пар, троек и т.п. таких разделов м.б. несколько
и, что самое страшное, взаимное влияние этих разделов никак не учитывается,
и оно, вероятно, может сильнее повлиять на результат.
Конечно, все это мои ощущения, и все надо проверять.
[27] довольно легко программируется.
При наличии готового словаря - за один вечерок можно и результат получить.
Я бы разбивал буквы на 2 множества по 16 штук, без 'ё' было бы проще.
А другие варианты пока только в теории )
-
> что самое страшное, взаимное влияние этих разделов никак
> не учитывается,
да, увы(
-
> Sha © (21.09.16 09:54) [26]
> Количество вариантов при полном переборе в int64 не влезет.
> С учетом времени на оценку каждого варианта - жизни точно не хватит.
а ты посчитал все комбинации, или с учетом того, что слов в словаре не более, например, 1000?
-
> kilkennycat © (21.09.16 17:13) [41]
Все комбинации, исходя из первоначальной постановки задачи:
36! / ( 6 * (6!)^7 )
-
> kilkennycat © (21.09.16 17:13) [41]
Это оценка снизу, она ближе к точному значению,
чем оценка сверху (без множителя 6 в знаменателе)
-
> Sha © (21.09.16 17:41) [42]
ну, это же все варианты... даже "абвгде"
-
> kilkennycat © (22.09.16 17:05) [44]
это варианты не слов, а букв на кубиках,
и поэтому там можно написать даже "абвгде".
-
подумал еще. надеюсь, получится описать алгоритм достаточно подробно.
на 6 гранях 6 кубиков у нас 36 букв (пусть 3 из них - пустышки),
их возможных сочетаний по 2 (пар) будет n!/(m!(n!-m!)) = n(n-1)/2 = 36*35/2 = 630
каждая пара букв, встречающаяся в словах словаря N раз, при размещении её на одном кубике уменьшит на N число слов, которые мы сможем составить из набора кубиков
посчитаем для каждой пары букв число её нахождений в словах словаря и отсортируем список по убыванию (первыми явно будут 3*35 пар с одной или двумя пустышками с нулевой суммой нахождений)
на каждом кубике у нас по 6*5/2 = 15 пар букв, на 6 кубиках - 80 пар
то есть из 630 возможных пар букв нам для размещения на кубиках нужно выбрать 80 с минимальным числом нахождений в словаре, но не каких попало, а разбивающихся на 6 групп с непересекающимися наборами 6 букв (по 15 взаимосмежных пар в группе)
двигаясь по списку пар букв в сторону увеличения числа нахождений пар в словаре, будем по одной включать очередную пару во множество, из которого каждый раз будем пытаться составить 6 кубиков. когда получится - задача будет решена.
сначала проверим, даёт ли добавление новой пары возможность собрать новый кубик, проверив все возможные её сочетания по три со всеми имеющимися во множестве парами. проверка будет отбрасывать сочетания, в которых хоть одна буква в трех парах совпадает и сочетания, для которых во множестве не найдутся к трем рассматриваемым еще 12 смежных пар (попадающих на тот же кубик)
если новый кубик собрался, добавим его как строку из 6 букв в список строк, соответствующих наборам кубиков, которые уже можно собрать из нашего множества пар букв. теперь пройдемся по всему этому списку, делая для тех его строк, в которых нет ни одной из этих 6 букв, их копии с добавлением этих новых 6 букв в конец. как только длина строки достигнет 36 - задача решена. (6 первых букв определяют первый кубик и т.д.)
однако, к невозможности составления из кубиков одного и того же слова может приводить размещение на одном кубике нескольких разных пар букв, попробуем и это учесть.
заведем для каждой пары букв список (индексов) слов, в которых она встречается. при добавлении новой пары в наше множество будем уменьшать на 1 счетчики нахождений у пар, входящих во все слова, имеющиеся в списке попадающей во множество пары, и пересортируем список еще не вошедших в наше множество пар.
ну что, похоже, так уже гарантированно лучшее решение получится найти,
как думаете?
-
*) посчитаем для каждой пары букв число её нахождений в словах словаря и отсортируем список не по убыванию, а по возрастанию
-
Для этого нужно доказать, что после этого алгоритма
останется наибольшее количество слов из словаря.
Пока неясно, откуда это следует.
-
надо идти с конца. сначала составить словарь.
-
каждая очередная пара букв, помещаемая на один кубик, делает невозможным составление из набора кубиков точно подсчитанного числа слов.
мы расширяем множество используемых пар так, что каждое добавление новой пары добавляет в список становящихся невозможными слов минимальное их число.
факт того, что в результате у нас осталось не наибольшее количество слов означал бы что хотя бы на одном из шагов мы выбрали пару букв, отменяющую больше слов, чем какая-то другая не выбранная нами пара, но это невозможно, так как мы всегда выбираем пару, минимальную по числу отменяемых слов (или равную среди нескольких минимальных).
-
> L_G © (22.09.16 21:20) [50]
Абсолютно неверно.
Оптимальное в целом решение не получается
как сумма частичных условных оптимальных решений на отдельных шагах.
Грубо говоря, можно съесть ферзя, но следующим ходом получить мат.
-
действительно, число отмененных набором пар букв слов меньше суммы чисел слов, отменяемых каждой из этих пар по отдельности.
поэтому полагаться на счетчики слов, отменяемых конкретными парами букв, нельзя.
-
> Есть кубики. 6 штук. Есть русский алфавит.
Граней 36. букв 33. Всего три грани на дубли букв.
А в словаре есть "мама", "долото", "молоко" и т.д. И таких много.
Слова с повторяющимися буквами серьезно портят задачку...
-
> manaka © (22.09.16 23:39) [53]
возьмите алфавит до 1917 года, там от 35 до 37 букв :)
-
> На основе словаря для каждой буквы посчитать вероятность
> встретить в одном слове другую букву.
> вроде получится массив 32! элементов
А не 32*31 разве?
-
Kerk подкинул проблему и удалился :)
-
> Kipor © (24.09.16 23:12) [56]
только не говори, что уже три дня не ешь, не пьешь, играешь в кубики :)
-
еще пара идеек:
1) модификация моего алгоритма с рассмотрением не пар, а троек букв наверняка даст лучшее решение
всего троек 36!/((36!-3!)3!) = 36*35*34/6 = 7140
подсчет отменяемых слов для троек, конечно, побольше времени займет,
зато подбор кубиков наверняка будет быстрее, чем с парами
2) с любым алгоритмом, собрав корректный набор кубиков, можно точно посчитать отменяемые им слова и не останавливаться на этом, а продолжать собирать новые варианты. динамика улучшения находимых решений с ростом затрат ресурсов подскажет, когда стоит остановиться :)
-
> Kipor © (24.09.16 23:12) [56]
> Kerk подкинул проблему и удалился :)
её идеальное решение - если не идеальный архиватор, то верный путь к его созданию )
-
> Eraser © (25.09.16 22:23) [59]
>
> идеальный архиватор
возможно, я уже рассказывал про идеальный архиватор:
как-то давно, на одной работе подходит сотрудник компании, и говорит, что изобрел идеальный архиватор. Мне лишь программку остается написать. Суть изобретения: если архиватор сжимает в 2 раза, то многократное сжатие доведет файл до байта (ну или до бита). Когда я ему разъяснил, что вариантов байта не так уж много (а бита и подавно), и что согласно его теории получается, что в двух битах содержится Абсолютно Вся Информация и надо лишь создать Разархиватор, чувак начал думать над разархиватором.
-
У меня вот такие буковки на кубиках получаются на урезанном словаре Лопатина:
бвгмпф дзтцчш йкнхь аоъюя жлрсщ еиуыэ
-
> Sha © (26.09.16 01:23) [61]
а ё?
-
> kilkennycat © (26.09.16 01:29) [62]
ё=е
-
> Sha © (26.09.16 07:44) [63]
вообще-то нет.
-
> Sha © (26.09.16 07:44) [63]
вообще-то нет.
-
но я так вижу )
-
> Sha © (26.09.16 01:23) [61]
Это по варианту [27] ?
-
Kerk © (26.09.16 11:35) [67]
Гораздо проще оказалось искать решение алгоритмом вроде генетического.
На каждом шаге отбираем V лучших вариантов.
Для каждый из них производим M мутаций представляющих собой 1..16 перестановок букв.
Среди получившихся V*M вариантов снова берем лучшие, и т.д.
Алгоритм довольно быстро сходится.