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

Haskell で Project Euler を解く素人遊び

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個の素数を見つけ、その和を求める。 これまた…

Problem 36

10進法でも2進法でも回文となる数のうち、1,000,000以下のものの和を求める。 今回は自信作である。解説する力量が自分にはないかも知れないが、最初のコードが20秒近い計算時間を要したものが、Data.Mapを使うことで0.2秒まで劇的に早くなった。 まず10進法…

Problem 35

197は素数だが、その循環である971, 719 もまた素数である。1,000,000までの中に、そのような循環素数はいくつあるか。 素数を探索しなければならない時点で、速さはある程度諦めざるを得ない。色々と考えたが、やっぱり素数探索は簡単には早くならない。 循…

Problem 34

145 は 階乗(!)を用いて 1! + 4! + 5! = 145 となる数である。このような数を全て求めてその和を計算する。 似たような計算の繰り返しになるので、連想リストを使ったら早くなるのではと思って試したが、結果から言えばどストレートに計算するのが一番早かっ…

Problem 33

49/98はその値が1/2に等しいが、分子分母に共通する数字"9"を除いた4/8もまた1/2に等しい。このように分子分母から共通の数字を取り除いても値が変わらない(2桁)/(2桁)の分数が、自明な物(10/40 = 1/4 のように分子分母が10の倍数のもの)を除いて4つあ…

Problem 32

39 × 186 = 7254は1から9までの全ての数字が1回ずつ出てくる。このように積の形で書ける数(この例では7254)を1から9のPandigitalと呼ぶ。全ての1から9のPandigitalな数の和を求めよ。 素直に問題をコードに書き下すだけで答えが出る。計算が重たいので、効…

Problem 31

英国の通貨(1p, 2p, 5p, 10p, 20p, 50p, £1 (100p), and £2 (200p) :pはペンス)を使って£2 (200p)を両替する方法は何通りあるか いわゆる両替問題である。普通に漸化式をhaskellに書き下しても解けることは解ける。例えば100円を50円玉、10円玉、5円玉、1…

Problem 30

1634 = 14 + 64 + 34 + 44 は4乗の和だが、このように各桁の5乗の和が元の数と等しくなる数を全て足すといくつになるか。 設定をコードにするのは比較的簡単である。問題は検索範囲、つまりどこまでの数を調べれば良いかというところだろうか。しかしこれも…

Problem 29

ab ; 2 ≦ a, b ≦100 の範囲で異なる値となるものはいくつあるか この手の設定は計算効率さえ気にしなければHaskellの得意とするところなのではないか。問題文をそのままコードにするだけである。そして今回は計算効率を気にする必要がない。素直に書くだけで…

Problem 28

右回りに数字を配置していき正方形を作ったときの対角線の和を求める。 うーん…。これはハッキリ言って手計算で答えが出ちゃうんだよな…。数字を規則的に並べて和を取るのだから、何らかの公式が作れそうだと考えるべきで、実際簡単に公式が導出できる。なの…

Problem 27

n2 + an +b に n = 0,1,2,...と順に代入したときに、連続して素数を生成する式を作りたい。|a| <= 1000, |b| < 1000の範囲で、最も連続して素数を生成する組み合わせ (a,b)を探しだし、その積 ab を求める。 注意:a,bは負の数でも良い。 まず、n=0において…

Problem 26

1000以下の自然数の逆数で、循環少数の周期が一番長い数を求める。 はじめは与えられたdに対して、循環少数の表記を返す関数を考えたが、なんとなくしっくりこないものしか作れなかった。1/14のように、途中から周期的になる数の扱いが煩雑になりそうなので…

Problem 25

1,1,2…で始まるフィボナッチ数列でFnが始めて1000桁を超えるn。 桁数を数えるのにData.Char.digitToIntを使用。これはProject Euler あるあるかも知れない。あとは普通。 フィボナッチ☆

Problem 24

0123456789の順列を昇順に並べたときに、1000番目に来る並びを求める。 順列をどのように実装するかというのが出題者の意図なのかもしれないなー…と思いつつも、面倒なので、ありがたくData.List.permutationsを使わせていただく。 先人に感謝☆

Problem 23

約数の和が自分自身より大きな数をabundant numberと呼ぶ。28123より大きな数は全て2つのabundant numberの和として表せるが、28123以下の数では必ずしもそうではない。2つのabundant numberの和で表せない全ての数の和を求める。 abundant number はリスト…

Problem 22

名前に対して所定の計算方法で点数をつける。与えられたリストにある名前の点数の合計を求める。 これはストレートに処理するだけ。当然名前をリスト形式 [String] にしないと処理がややこしいが、与えられたテキストファイルの名前を普通に読み込んでも [St…

Problem 21

10,000未満の友愛数を全て足すといくつになるか 友愛数とは数のペアで、自分自身を除く約数の和がお互いに等しいものをいう。 まずは何も考えずにスタンダードに攻めてみる。 これで任意の数の約数の和が求められるので、あとは [1..10000] をfilter [友愛数…