Project Euler の最初の25問を解くための考え方を紹介してきました。その25問について、難易度とその難しさについて考察します。
25問解くとレベル1になる。
Project Euler では、25問を解くとレベル1になります。
以下、2022年9月8日時点での情報です。
- 1038012 人が、少なくとも1問解いている。
- 1人あたり、平均 12.2 問正解している。
- 123818 人(11.93%)が、25問以上正解している。
レベル1になると以下のアイコンが表示されます。
もし、あなたが紹介した25問について解き方が理解できていれば、8人に1人以上の腕前だと考えてよいと思います。おめでとう!
問題を解いた人数
Project Euler では、アカウント作成直後から、すべての問題に挑戦することができます。そのため、すべての人が問1から解いているわけでありません。問題の取り組みやすさは、解いた人数に現れてきます。
以下は、最初の25問を解いた人数です(2022年9月8日時点)。
問題No | タイトル | 問題を解いた人数 |
1 | 3と5の倍数 | 968976 |
2 | 偶数のフィボナッチ数 | 773136 |
3 | 最大の素因数 | 556518 |
4 | 積となる最大の回文数 | 492638 |
5 | 最小の倍数 | 495983 |
6 | 和の2乗と2乗の和の差 | 499028 |
7 | 10001番目の素数 | 427317 |
8 | 積の最大値 | 358277 |
9 | 特別なピタゴラス数 | 363302 |
10 | 素数の和 | 333024 |
11 | マス目の最大の積 | 239327 |
12 | 多くの約数を持つ三角数 | 225933 |
13 | 大きな和 | 231247 |
14 | 最長のコラッツ数列 | 231512 |
15 | 格子状の道 | 191141 |
16 | 累乗の桁の和 | 233740 |
17 | 数字の文字数 | 155224 |
18 | 最大の経路和Ⅰ | 148600 |
19 | 日曜日を数える | 138047 |
20 | 階乗の桁の和 | 202384 |
21 | 友愛数 | 149890 |
22 | 名前スコア | 137907 |
23 | 過剰数の和でない数 | 107070 |
24 | 辞書式順列 | 117622 |
25 | 1000桁のフィボナッチ数 | 159003 |
問1(3と5の倍数)は、取り組みやすい問題で、一番多くの人が解いています。問23(過剰数の和でない数)の正解者は、問1の約 1/9 になっています。
最初の25問を解くための難しさ
Project Euler の問題は、プログラミングとしての難しさを持つ場合と数学的な難しさを持つ場合があります。
以下は、最初の25問についてのコメントです。問題No は各問題を解く記事のリンクです(複数記事があるものは、最初の記事のリンクです)。なお、コメントは基本的なプログラムで解くためのコメントです。いくつかの記事で、応用的な考察も紹介していますが、その考察については以下のコメントの対象外にしました。
問題No | コメント |
1 | 基本的なプログラムが書ければ解けます。 |
2 | 基本的なプログラムが書ければ解けます。 |
3 | 32bitを超える整数を使います。基本のアルゴリズムでも解けます。 |
4 | 10進数表記の仕組みが分かり、逆さの数を求めることができれば解けます。 |
5 | 素因数分解と最小公倍数が理解できれば解けます。 |
6 | 基本的なプログラムが書ければ解けます。 |
7 | 素数の判定ができれば解けます。 |
8 | 1000桁の数字の入力が必要です。32bitを超える整数を使います。 |
9 | 少し工夫が必要ですが、プログラムは基本的な文法で解けます。 |
10 | 素数の判定ができれば解けます。32bitを超える整数を使います。 |
11 | 20×20の数字の入力が必要です。プログラムは基本的な文法で解けます。 |
12 | 約数を求める方法を工夫しないと時間がかかります。 |
13 | 100個の50桁の数字の入力が必要です。多倍長整数の演算が必要です。 |
14 | 問題は興味深いですが、プログラムは基本的な文法で解けます。 |
15 | 場合の数を求める考え方はやや難しい。多倍長整数の演算が必要です。 |
16 | 多倍長整数の演算が必要です。演算自体はそれほど難しくありません。 |
17 | ある程度のプログラムを正しくコーディングする技術が必要となります。 |
18 | bit全検索の考え方が必要となります。 |
19 | カレンダーに関係する演算を正確に行う必要があります。 |
20 | 多倍長整数の演算が必要です。演算自体はそれほど難しくありません。 |
21 | 約数を求める方法を工夫しないと時間がかかります(問題12と同様)。 |
22 | 長い文字の行の入力が必要です。文字列の処理が必要になります。 |
23 | 問題21のコメントに追加して、演算を一工夫する必要があります。 |
24 | ライブラリで順列の対応できていれば、解きやすい問題です。 |
25 | 多倍長整数の演算が必要です。演算自体はそれほど難しくありません。 |
問題の難易度は、使うプログラミング言語によって差がでます。Python や Ruby のように整数の大きさに制限がない言語は、難易度が下がります。
逆に C や C++ で大きな整数を使う場合は、標準の機能に含まれていないライブラリを使う必要がでてくるため、難易度が上がります。このブログでは、64ビット整数を超えるような場合は、GMPライブラリを活用しました。
一部の問題で、高校数学の知識を使います。特に高校1年で履修する「整数」についての知識が必要な問題は複数ありました。
最初の10問については、この記事でもう少し詳しい考察をしています。
最後に
Project Euler の最初の25問について、以下の観点でまとめました。
- どれくらいの人が解いているのか。
- どのような難しさがあるのか。
よい問題が多く、自分でも新しく学ぶことが多かったです。次の25問(問題26から問題50)も、ぼちぼちと紹介していくことにします。目指せレベル2!