のてすきあ − 完全独習非プログラマー −

Haskell で Project Euler を解く素人遊び

2020-05-01から1ヶ月間の記事一覧

Problem 67

頂点から下へ降りていく中で通った数の和が最大となるときの和はいくつか。 Problem 18 のコードを全くそのまま再利用すれば完了である。Problem 18の時に悩んでおいて良かった。 mitstream.hatenablog.jp 再利用☆

Problem 66

次の形式の2次のディオファントス方程式; x2 - Dy2 = 1 においてxを最小とするD(≦1000)を求める。 力技でリスト内包表記をぶつけてみても答えは返ってこない。問題でディオファントス方程式とあるが、与えられた式は特別なディオファントス方程式で、名前…

Problem 65

ネイピア数eの連分数展開による有理数近似。 多分プログラミング的にアレコレやることも可能なのだろう。しかし考えるのが面倒(問題としてあまり魅力を感じない)ので、数学の知識を使ってストレートに漸化式を解くことにする。 無理数の有理数近似について…

Problem 64

無理数の連分数展開 Project Euler を解き続けて60問。今回初めて諦めようかと思ってしまった。難しい。 無理数の連分数展開はそんなに難しくない。しかしそれを数値計算でやろうとすると、誤差の問題でうまく行かないのである。引き算を回避したり割り算を…

Problem 63

mnの形をしたn桁の数は全部でいくつあるか 一行日記である。考えどころは探索範囲だが、数xの桁数はlog_10 x で調べることができることを踏まえれば、mとnをどの範囲まで調べれば良いか判断することができる。 以下のプログラムではmとnが逆になっているが…。…

Problem 62

3乗数でお互いに数字の並べ替えとなる5組の数を見つけ、その最小値を求める。 3乗数を小さい方から順番に調べつつ、[使っている数字の順列が同じ]という分類で同値類にまとめていく。元の数が5つになったところでそれを出力すれば完了である。各3乗数に「使…

Problem 61

三角数, 四角数, 五角数, 六角数, 七角数, 八角数は多角数であり, それぞれ以下の式で生成される. 三角数P3,n=n(n+1)/21, 3, 6, 10, 15, ...四角数P4,n=n21, 4, 9, 16, 25, ...五角数P5,n=n(3n-1)/21, 5, 12, 22, 35, ...六角数P6,n=n(2n-1)1, 6, 15, 28, 45…

Problem 60

3,7,109,673 の素数の組は、それぞれをつなぎ合わせた数(例:7109, 1097, 673109など)も全て素数になる。そのように連結可能な5つの数の組を探し、その中で5数の和が最も小さくなるものを見つける。 ある条件を満たす素数を見つけるパターンは、計算に時間…

Problem 58

1から順に数字を半時計回りに並べていくと奇数の二乗の長さの正方形を順に作ることができる。このときに、対角線に現れる数のうちの素数の割合が10%を下回るのは、正方形の一辺の長さがいくつになったときか。 原理的には難しくない。数字を規則的に並べると…

Problem 57

√2の連分数表記を有限で打ち切り、既約分数の形にする操作を連分数の展開という。1000回までの展開のうち、分子の桁数が分母の桁数より多い形は何回現れるか。 連分数を再帰的に定義して計算することもできるのではないかと思ったが、最後に分数の形にする手…

Problem 56

ab ( 1 ≦ a,b ≦ 100)で与えられる数の各桁の和を比べたときに、値が最大となる数を探し、その和を求める。 Haskellは大きな数も、数字⇔文字列の行き来もなんの制約もないので、この手の問題はお茶の子である。 Integer様様☆

Problem 55

例えば47に対して47:→47+74=121 のように、反転した数を足すことで新しい数を得る操作を50回繰り返してもそれまでの間に一度も回分数を踏まないものが、10,000より小さい数の中にいくつあるか調べる。 特に悩むところはない。与えられた手続きに従って数を評…

Problem 54

与えられたカードの組み合わせ(1,000通り)でポーカーの勝負をした際に、Player 1 が勝つ組み合わせはいくつあるか。 これまで50問以上を解いてきて、Project Euler はプログラミング素人でも日本の高校数学程度の素養があればなんとかなる…と思っていた。…

Problem 53

コンビネーション nCr の数が100万を超える (n,r) の組は何組あるか。( 1 ≦ n ≦ 100 ) 方針は立ちやすい。(n,r)を振ってコンビネーションを計算して、100万以上のものを拾う(問題文まんまやんけ)のみである。問題はコンビネーションを定義どおりに計算する…

Problem 52

ある数xに対して、その倍数 x,2x,3x,4x,5x,6x のすべてが順列(同じ数字の組の並べ替え)となるようなxを求める。 前問からは一転、何も悩む必要のない問題である。数字列と文字列を自在に行き来できるようになると、この手の問題はお茶の子である。 イージ…

Problem 51

2桁の数 *3 の*に数字を入れると、13,23,43,53,73,83 の6つの素数を得る。同様に5桁の数 56**3 の*に同じ数字を入れたもののうち、56003, 56113, 56333, 56443, 56663, 56773, 56993 の7つが素数となる。同じルールで数のうちのいくつかの数字を同じ数…

Problem 50

41は連続する6個の素数の和で表すことのできる素数(41 = 2 + 3 + 5 + 7 + 11 + 13)である。100以下では41の持つ6連続が最長である。100万以下で最も長い連続する素数の和で表される素数を求める。 100万以下の素数の列から2つ選んで総当りで答えを求めるこ…

Problem 49

4桁の素数3つからなる等差数列で、各々が他の並べ替え(同じ4つの数字を使っている)になっている組を見つける。 コードは普通に書くだけであるが、4桁の素数が同じ数字の組み合わせであることから、等差数列の公差が9の倍数でなければならないと分かる…

Problem 48

11 + 22 + ... + 10001000 の答えの最後の10桁を求める。 Use Integer オンリーである。Haskell 様様 である。 Integer…☆

Problem 47

4つ連続した数で、それぞれが相異なる4つの素因数を持つものを見つける。 虱潰しに当たれば、所望の数は見つかる。ただし時間がかかる。少しでも早くしたいと思ってごちゃごちゃといじくり回しているうちに、見るもおぞましいコードになってしまった。努力は…

Problem 46

もう一つのゴールドバッハ予想; 素数でない奇数は素数+2×(整数)2 の形で表される。 この予想は正しくない。最小の反例を見つけよ。 予想をどのように表現するか…である。今回は {(与えられた数)ー(素数)}/ 2 = (平方数) となるかどうかを判定する…

Problem 45

三角数、五角数、六角数に共通して現れる最小の数は40755である。次に共通する数を求める。 多角数についてはコチラ([ウィキペディア:多角数])。 まず、全てに共通する数をHとする。これは六角数でもあるはずなので、HexagonalのHを取った。これが、ある…

Problem 44

五角数同士の和と差がいずれも再び五角数になるものを探し、その差が最小となるものを見つける。 五角数についてはコチラ(ウィキペディア:五角数)。 英語版の方が情報が充実しており、今回は英語版から五角数の判定法を拝借した。 さて、この問題は随分と…

Problem 43

1406357289は10桁のpandigitな数(0から9の数字が1回ずつ使われている)である。この2桁目以降より連続する3つの数を取り出すと、406,063,635,357,572,728,289 となるが、それぞれは2,3,5,7,11,13,17で割り切れる。同様の性質を持つ10桁のpandigitな数をすべ…

Problem 42

三角数列とは一般項が n(n+1)/2 で与えられる数列である。与えられたファイルに羅列された単語を所定の方法で数値に変換した際に、三角数となる単語がファイルにいくつ含まれているか調べる。 テキストファイルを読み込んで単語を文字列のリストとする処理は…

Problem 41

ある数が n-digit pandigital であるとは、1からnまでの数字を1回ずつ使って構成されていることを意味する。例えば2143は4-digit pandigital であり、かつ素数でもある。最大のn-digit pandigitalな素数を求める。 存在するn-digit pandigital 素数の中で最…

Problem 39

3つの辺の長さが全て整数の直角三角形で、3辺の長さの和(周長)が所定の値となる辺の組を考える。例えば周長が120となる直角三角形は(20,48,52), (24,45,51), (30,40,50) の3つである。周長1000以下の直角三角形で、最も多くの異なる辺の組を作れるのは周長…

Problem 40

0.1234567891011121314... と続く小数の小数第1位,10位,100位,1000位,10000位,100000位,1000000位の数を全てかけ合わせるといくらになるか。 言語によっては相当難しいのかも知れない。しかしHaskellには無限リストという武器がある。ゆえに本問は小数である…

Re:Problem 34

先日あげたこの問題; 145 は 階乗(!)を用いて 1! + 4! + 5! = 145 となる数である。このような数を全て求めてその和を計算する。 mitstream.hatenablog.jp その後も効率化できないか気になっていたが、結局はバカの一つ覚えのData.Mapでやれるところまでや…

Problem 37

3797は切り捨て可能(truncatable)な素数である。すなわち、それ自身も素数でありながら、右から順次切り捨てた379,37,3も全て素数であり、また左から順次切り捨てた797,97,7もまた全て素数である。このような11個の素数を見つけ、その和を求める。 これまた…