ProjectEulerを使用した1つのタスクのカスタムソリューション

Project Eulerの問題は、同じタスクに対してさまざまな難易度で楽しみながら脳を鍛えることができるため、優れています。 最も単純なアプローチはブルートフォースです。 最初の20個のタスクは、このようなアプローチによって99%解決されます。 タスクに正解を送信した後、フォーラムスレッドがそのタスクで開きます。 数十カ国のアマチュアが競い合い、ソリューションをより洗練された形で引用します。 より高度なものは、ソリューションが記述されている言語の組み込み機能を使用しますが、本質は同じです-バスティングまたはネストされたループの束による明示的または特別な関数の呼び出しによる暗黙的です。 PythonまたはRuby(多くの場合1行または2行)で特に美しく見えますが、JavaおよびC ++ではより冗長です。 遠ければ遠いほど、BigIntegerのようなクラスを使用して、より真っ直ぐな「パワー」ソリューションが見えます。 タスク数が増えると、ブルートフォースの使用はますます難しくなります。 純粋な数学には多くの問題があり、紙の問題を解決し、完全に複雑でないものをエンコードする必要があります。 コードをまったく作成せずに作成できる場合もあります。たとえば、組み合わせの使用など、多くのタスクがあります。

しかし、完全に非標準的なソリューションを見つけた方が快適な場合もあります。


例。 タスク9 。 a + b + c = 1000のような整数a、b、cのピタゴラスのトリプレットを見つけます。ピタゴラスのトリプレットは3つの正の整数a <b <cであり、直角三角形の辺である、つまり a ^ 2 + b ^ 2 = c ^ 2。 最も有名な学校の例:3、4、5。

検索ソリューションは明らかです。 時間の大幅な短縮が実現します。このようなトリプレットの特性を知っていれば、多くの反復を節約できます。 しかし、私たちは反対に行きます。

ソリューションのすべてのバージョンのMS Excelスイートでソルバー最適化ツールを使用します。



ソルバーは、解を見つけるための非常に強力なツールになる可能性がありますが、非常に多次元の場合には失敗すると言います。 数十個の変数の巨大な連立方程式の解、または少なくとも局所的な近似を探していた男性を見たとき、私はまだこの写真を覚えています。 彼は経済学の修士号を書きました。 彼は確かにいくつかの言語のいずれかでコードを書くことができましたが、それはスクラップでした。 ソルバーの設定を非常に大きな反復回数、非常に長い検索時間に設定し、職場のコンピューターで起動しました。 そこにあるものが結果としてカウントされました。

ところで、 最大パスの合計の問題を解決するためにソルバーを使用することはできませんでした。そこでは、関数は完全に滑らかではなく、ランダムです。

私が言ったように、いくつかの問題はコードなしで分析的に解決されました。 二項係数を計算しなければならなかったとき、私はこれにWindowsエンジニアリング計算機を使用しました。 最初の100の最後の1つの問題はSQLを使用して解決されました-必要なのは、データをテーブルにコピーすることだけでした-DDLスクリプトを作成するNotepad ++の通常の方法です。その後、テーブルにデータが入力され、クエリが1行になります。

projectEulerの統計を見るのもとても楽しいです。 使用される最も効率的な言語と環境はC ++ \ Javaではなく、フランス語のmatpack PARI / GP、Mathematica、Python、Haskelです。 多くのエキゾチックなものが使用されます(投稿執筆時の統計):

言語ユーザー数平均解決率スコアインデックス
1パリ/ GP7923%99
2Mathematica127213%92
3Python268878%81
4ハスケル46808%67
5セージ18012%62
6Perl22378%61
7C / C ++284546%61
8APL / J / K25411%60
9Java181586%58
10C#91226%54
11ML4369%54
12もみじ2659%49
13ルビー42296%49
14スカラ12707%49
15おたふく風邪2216%49
16Lisp10967%48
17デルファイ4518%48
18F#9367%47
19スキーム7447%46
20Matlab21226%45
21マグマ2115%45
22ラケット1409%44
23コンポーネントパスカル722%42
24ベーシック11626%42
25行く4147%41
26フリンク1018%41
27クロージュア9916%41
28D1638%40
29日鉛筆/紙8056%39
30パスカル6016%38
31Tcl659%37
32R4966%37
33RPL1414%36
34スプレッドシート4126%35
35ギャップ2611%35
36組立1527%34
37ルア3326%34
38Fortran3086%34
39フォース399%32
40Smalltalk907%31
41SAS1710%28
42エイダ976%27
43ECMAScript8344%26
44Q746%25
45アーラン5804%25
46ジュリア367%24
47オートホットキー1210%24
48プロローグ1145%23
49Php24453%23
...............
53オクターブ635%20
54ブー177%19
55コブラ318%19
56ロゴ266%19
57グルーヴィー385%18
58SQL375%17
59COBOL196%17
60Powerhell684%16
...............
68ボーンシェル323%10
...............


もちろん、ほとんどの人は米国から、約2万8千人、中国とロシアからは約同数、約3,000人です。しかし、この国に突っ込んで仕事のトップ100を見ると、中国人がより効果的であることがわかります。 400、350、300など タスク。 また、インドでは、反対に、参加者は約2.5倍多くなりますが、スーパーソルバーはロシアよりも少なくなります。 私の意見では、すべてを人々の数に正規化し、統計的に有意な数の参加者から始めれば、その国の高等教育の有効性の評価を得ることができます。

Source: https://habr.com/ru/post/J196966/


All Articles