Нестандартное решение одной задачи с ProjectEuler (с помощью Solver)

Проект "Эйлер" — это подборка специфических задач по математике и программированию.

 

 Задачки с Project Euler хороши тем, что позволяют развлечься и потренировать мозг на разных уровнях сложности для одной и той же задачи. Самый простенький подход — brute force. Первые два десятка задач на 99% решаются именно таким подходом. После отправки правильного ответа на задачу открывается ветка форума по ней. Любители из десятков стран соревнуются, кто процитирует решение поизощреннее.

Более продвинутые используют встроенные возможности языков, на которых пишут решение, но суть одна и та же — перебор или явный с кучей вложенных циклов или неявный через вызов специальных функций. Особенно красиво это выглядит в языках Python или Ruby (часто в одну-две строчки), помногословнее в Java и C++. Чем дальше, тем натужнее выглядят «силовые» решения, с использованием классов вроде BigInteger. С увеличением номера задачи грубую силу удается успешно применить все реже и все сложнее.

Появляется много задач на чистую математику, где нужно решить задачу на бумаге, а потом закодировать что-то совсем несложное. Иногда писать можно обойтись без написания кода вовсе, таких задач много — например, на применение комбинаторики. Но иногда приятнее найти совсем нестандартное решение.

Пример. Задача 9. Найти пифагорейский триплет целых чисел a, b, c, такой что a + b + c = 1000. Напомню, пифагорейский триплет — это три целых положительны числа a < b < c, являющиеся сторонами прямоугольного треугольника, т.е. a^2 + b^2 = c^2. Самый известный школьный пример: 3, 4, 5.

Переборное решение очевидно. Она сильно сокращается по времени, если знать свойства таких триплетов, можно много итераций сэкономить. Но мы пойдем другим путем.

Будем использовать для решения оптимизационный инструмент Solver в комплекте MS Excel любой версии.

Solver может быть очень мощным инструментом поиска решения, хотя говорят, что в очень многомерных случаях он пасует. До сих пор вспоминаю картину, когда я увидел человека, искавшего Solver-ом решение или хотя бы локальное приближение для огромной системы уравнений на несколько десятков переменных. Писал для магистерского диплома, что-то по экономике. Он точно мог бы написать код на любом из нескольких языков, но было в лом. Поставил настройки в Solver на огромное максимальное число итераций, огромное максимальное время поиска и запустил на своем компе на работе. Что-то там насчитал в результате.

Кстати, Solver мне не удалось приткнуть для решения задачи о максимальной сумме пути — там совсем негладкая получается функция, случайная.

Несколько задачек, как я говорил, удалось решить без кода, аналитически. Один раз пришлось посчитать биномиальный коэффициент, для этого использовал инженерный калькулятор Windows. Одна задача в конце первой сотне решилась с помощью SQL — надо было только скопировать данные в табличу — регулярка в Notepad++, создающая DDL скрипт, после чего заполнение таблицы и запрос в одну строку.

Очень улекательно также посмотреть на статистику projectEuler. Максимально эффективные используемые языки и среды — не C++\Java, а французский матпакет PARI/GP, Mathematica, Python и Haskel. Используется множество экзотических (статистика на момент написания поста):

LanguageNumber of UsersAverage Percent SolvedScore Index
1PARI/GP7923%99
2Mathematica127213%92
3Python268878%81
4Haskell46808%67
5Sage18012%62
6Perl22378%61
7C/C++284546%61
8APL/J/K25411%60
9Java181586%58
10C#91226%54
11ML4369%54
12Maple2659%49
13Ruby42296%49
14Scala12707%49
15MUMPS2216%49
16LISP10967%48
17Delphi4518%48
18F#9367%47
19Scheme7447%46
20Matlab21226%45
21Magma2115%45
22Racket1409%44
23Component Pascal722%42
24BASIC11626%42
25Go4147%41
26Frink1018%41
27Clojure9916%41
28D1638%40
29Pencil/Paper8056%39
30Pascal6016%38
31Tcl659%37
32R4966%37
33RPL1414%36
34Spreadsheet4126%35
35GAP2611%35
36Assembly1527%34
37Lua3326%34
38Fortran3086%34
39Forth399%32
40Smalltalk907%31
41SAS1710%28
42Ada976%27
43ECMAScript8344%26
44Q746%25
45Erlang5804%25
46Julia367%24
47AutoHotkey1210%24
48Prolog1145%23
49PHP24453%23
53Octave635%20
54Boo177%19
55Cobra318%19
56Logo266%19
57Groovy385%18
58SQL375%17
59COBOL196%17
60PowerShell684%16
68Bourne Shell323%10

Больше всего народу, конечно, из Штатов — около 28 тысяч, из Китая и России примерно одинаковое число — около 3000. Но если ткнуть в страну и посмотреть топ 100 по задачам, видно, что китайцы эффективнее — там больше число людей, решивших, более 400, 350, 300, итд. задач. А в Индии наоборот — участников примерно в 2.5 раза больше, но супер-решателей поменьше, чем в РФ. По-моему если нормализовать это все на число населения, то начиная с какого-то статистически значимого числа участников на страну можно получить оценку эффективности высшего образования в ней.

       

 

Понравилась статья? Поделиться с друзьями: