CrossGen v1.0
+Читая хабр, случайно натолкнулся на идею сделать программу, которая по заданной кроссвордной сетке находит способ её заполнить. В этом посте вкратце напишу про моё решение и первую версию приложения.
+diff --git a/archives.html b/archives.html index 95075be..951a629 100644 --- a/archives.html +++ b/archives.html @@ -6,7 +6,7 @@
-Project Euler и остальное
@@ -49,6 +50,20 @@Читая хабр, случайно натолкнулся на идею сделать программу, которая по заданной кроссвордной сетке находит способ её заполнить. В этом посте вкратце напишу про моё решение и первую версию приложения.
+Project Euler и остальное
diff --git a/category/proekty.html b/category/proekty.html index 3f8bcf2..9d2b9fe 100644 --- a/category/proekty.html +++ b/category/proekty.html @@ -6,7 +6,7 @@ -Project Euler и остальное
@@ -49,6 +50,20 @@Читая хабр, случайно натолкнулся на идею сделать программу, которая по заданной кроссвордной сетке находит способ её заполнить. В этом посте вкратце напишу про моё решение и первую версию приложения.
+Project Euler и остальное
diff --git a/feeds/all.atom.xml b/feeds/all.atom.xml index 8389c11..d54060d 100644 --- a/feeds/all.atom.xml +++ b/feeds/all.atom.xml @@ -1,2 +1,2 @@ -Project Euler и остальное
@@ -49,6 +50,20 @@Читая хабр, случайно натолкнулся на идею сделать программу, которая по заданной кроссвордной сетке находит способ её заполнить. В этом посте вкратце напишу про моё решение и первую версию приложения.
+В данный момент школьник, закончивший СУНЦ МГУ. Немного занимаюсь фрилансом.
-Увлекаюсь математикой, информатикой и тем, что находится между ними.
-Навыки: C++, Python, wxWidgets.
+В данный момент студент ВМК МГУ. Немного занимаюсь фрилансом.
+В основном программирую на Python и C++, есть также знания HTML, CSS, Delphi, Bash. Разрабатываю прикладные приложения (в том числе графические под Win/MacOS/Linux), парсеры (с использованием scrapy), скрипты автоматизации +Есть опыт разработки веб-приложений с использованием микрофреймворка Flask.
+Навыки: +Python: wxPython, scrapy, sympy, flask +C++: STL, Boost, wxWidgets, flint, gmp +Delphi, Bash +Пользуюсь git +БД: SQLite, MySQL +ОС: Windows, Xubuntu(рабочая), Debian, CentOS
Project Euler и остальное
+ + +Значительная часть моих проектов есть на GitHub или BitBucket вместе с открытым исходным кодом.
+
За подробностями пишите мне на почту
+Project Euler и остальное
+ + +Начать, наверное, нужно с того, что реальную практическую значимость я осознал после того, как реализовал 90% того, что есть сейчас. Сейчас мне кажется, что единственное применение данного приложения лишь в том, чтобы создавать кроссворды очень сложной или необычной формы. Зачем это надо обычному человеку я вообще не знаю.
+Собственно, алгоритм генерации изначально был примитивным: простой рекурсивный поиск с отсечением. Скорость генерации более-менее сложных сеток была ужасной (для перцентиля 30% это примерно 40 минут на этой сетке, в общем случае, время генерации непредсказуемо.
+В дальнейшем были выполнены некоторые оптимизации. Первой более-менее значимой стала замена передачи сетки в юникоде (во внутреннем цикле) на передачу сетки в однобайтовой кодировке, таким образом, языки с алфавитом больше ~200 букв пролетают. Впрочем, мне кажется, что им не слишком сильно требуются кроссворды. Такая оптимизация дала ~35% прироста при значимом времени перебора (больше секунды).
+В какой-то момент, мне показалось, что оптимизация структуры данных для хранения сетки тоже могла сильно увеличить производительность, но это будет заметно только на разряженных сетках, которые и так достаточно быстро генерируются. На сложных же плотных сетках, прирост скорости может быть минимальным, вплоть до отрицательного. Таким образом, используются просто двумерный массив.
+Наибольший прирост, как и ожидалось, дало упорядочивание словаря по некоторому критерию. Таким образом, при переборе, “плохие” варианты будут попадаться редко. На это ушло немногим больше дня. В конечном итоге, целевой функцией, которая стала критерием сортировки, стала такая \(\sqrt[n]{\prod_{i=1}^{n}{f\left( a_i \right)}}\) (иначе говоря, среднее геометрическое отлично подошло), где \(n\) — количество букв в слове, \(a_i\) — буквы слова, а \(f \left( x \right)\) есть вероятность появления буквы \(x\). Я отсекаю примерно половину самых “плохих” слов, а из того, что осталось я составляю кроссворд. Производительность, в среднем, увеличилась в ~1000 раз. На тестовых сетках для перцентиля 90% длительность работы около секунды.
+

Project Euler и остальное
diff --git a/posts/moi-pervyi-post/index.html b/posts/moi-pervyi-post/index.html index ae37dfe..09abae5 100644 --- a/posts/moi-pervyi-post/index.html +++ b/posts/moi-pervyi-post/index.html @@ -21,8 +21,8 @@ - - + + @@ -33,13 +33,14 @@Project Euler и остальное
diff --git a/posts/moio-reshenie-zadachi-60/index.html b/posts/moio-reshenie-zadachi-60/index.html index c502756..87546b0 100644 --- a/posts/moio-reshenie-zadachi-60/index.html +++ b/posts/moio-reshenie-zadachi-60/index.html @@ -21,8 +21,8 @@ - - + + @@ -33,13 +33,14 @@Project Euler и остальное
diff --git a/tag/bgl.html b/tag/bgl.html index 3770ea4..a9a2e43 100644 --- a/tag/bgl.html +++ b/tag/bgl.html @@ -6,7 +6,7 @@ -Project Euler и остальное
diff --git a/tag/blog.html b/tag/blog.html index f68e695..8f05e93 100644 --- a/tag/blog.html +++ b/tag/blog.html @@ -6,7 +6,7 @@ -Project Euler и остальное
diff --git a/tag/c.html b/tag/c.html index 21b4dfc..d3b8ca9 100644 --- a/tag/c.html +++ b/tag/c.html @@ -6,7 +6,7 @@ -Project Euler и остальное
@@ -49,6 +50,20 @@Читая хабр, случайно натолкнулся на идею сделать программу, которая по заданной кроссвордной сетке находит способ её заполнить. В этом посте вкратце напишу про моё решение и первую версию приложения.
+Project Euler и остальное
@@ -49,6 +50,20 @@Читая хабр, случайно натолкнулся на идею сделать программу, которая по заданной кроссвордной сетке находит способ её заполнить. В этом посте вкратце напишу про моё решение и первую версию приложения.
+Project Euler и остальное
diff --git a/tag/wxwidgets.html b/tag/wxwidgets.html new file mode 100644 index 0000000..7d78e81 --- /dev/null +++ b/tag/wxwidgets.html @@ -0,0 +1,83 @@ + + + + + + + + +Project Euler и остальное
+ + +Читая хабр, случайно натолкнулся на идею сделать программу, которая по заданной кроссвордной сетке находит способ её заполнить. В этом посте вкратце напишу про моё решение и первую версию приложения.
+