F#

Project Euler 50

F#

http://projecteuler.net/index.php?section=problems&id=50 どうしても素数列の遅延評価ができない。

Project Euler 49

F#

http://projecteuler.net/index.php?section=problems&id=49 重複組合せで数字を出して、題意を満たすか調べます。

Project Euler 48

F#

http://projecteuler.net/index.php?section=problems&id=48 多倍長整数を使うと簡単すぎるので、64ビット整数を使って、5桁で区切って掛け算を行いました。

Project Euler 47

F#

http://projecteuler.net/index.php?section=problems&id=47 素数関係のコードをいちいち書いたりコピペするのが面倒なので、別ファイルにします。そのときに、名前空間とモジュールを使います。 // mod1.fs namespace NS1 module Mod1 = let a = 1 // mod2.…

Project Euler 46

F#

http://projecteuler.net/index.php?section=problems&id=46 これも前問と同じアルゴリズムを、奇数ごとに適用します。この問題は有限リストなので素直に書けます。

Project Euler 45

F#

http://projecteuler.net/index.php?section=problems&id=45 この問題はほとんどProject Euler 37と同じです。 Haskellだと簡単に書けます。 polygonal p = [ div (n * ((p - 1) * n + 4 - p)) 2 | n <- [1..] ] coincident (p:ps) (q:qs) | p == q = p:(coi…

Project Euler 44

F#

http://projecteuler.net/index.php?section=problems&id=44 真面目に因数分解すると速いです。

Project Euler 43

F#

http://projecteuler.net/index.php?section=problems&id=43 戻り値の型の違いで、数字のリストから数にする関数を2パターン書いているのですが、一つにまとまらないのでしょうか。

Project Euler 42

F#

http://projecteuler.net/index.php?section=problems&id=42 let read_names (file : string) =は、 let read_names file =ではなぜか動きません。

Project Euler 41

F#

http://projecteuler.net/index.php?section=problems&id=41 順列を逆に出すだけです。

Project Euler 40

F#

http://projecteuler.net/index.php?section=problems&id=40 遅延評価を使うと簡単です。 (fun k -> k <= N)このラムダは、こう書けます。 ((>=) N)これは、(>=)は2つの引数を取る関数とみなせて、 (>=) N kで、 N >= kと同じになります。これをカリー化して…

Project Euler 39

F#

http://projecteuler.net/index.php?section=problems&id=39 配列を使うと簡単。

Project Euler 38

F#

http://projecteuler.net/index.php?section=problems&id=38 nで左辺第1項の範囲が決まるので、あとはpandigitalになっているかチェックするだけ。

Project Euler 37

F#

http://projecteuler.net/index.php?section=problems&id=37 2パターンは数字を右から追加するか左から追加するかなので、数字を追加する関数をそれぞれ作っておきます。 let add_right m d n = m * 10 + d let add_left m d n = m + d * nnはmが3桁なら1000…

Project Euler 36

F#

http://projecteuler.net/index.php?section=problems&id=36 10進の回文数を再帰的に出して、2進で回文数になるかを調べます。パイプライン処理というのを使ってみました。例えば、数字のリストがあってリストを逆にして10進数にする処理というのは通常、 le…

Project Euler 35

F#

http://projecteuler.net/index.php?section=problems&id=35 重複して素数判定したくないのでうまく代表元を選んでそれを回転して素数判定したいところです。それには、回転して最小の数を代表元に選べばよいです。例えば、791なら791→917→179だから、179を…

Project Euler 34

F#

http://projecteuler.net/index.php?section=problems&id=34 Problem 30とほとんど同じです。やはり重複組合せを使います。

Project Euler 33

F#

http://projecteuler.net/index.php?section=problems&id=33 yieldを使うと簡単です。

Project Euler 32

F#

http://projecteuler.net/index.php?section=problems&id=32 yieldを使うと何でも簡単に書けます。値を束縛できないところが問題ですが。

Project Euler 31

F#

http://projecteuler.net/index.php?section=problems&id=31 素直に書くと次のようになるでしょうか。 let coins = [ 1; 2; 5; 10; 20; 50; 100; 200 ] // nポンドをm番目までのコインを使って何通りの表し方があるか let rec num_ways n m = if n = 0 || m …

Project Euler 30

F#

http://projecteuler.net/index.php?section=problems&id=30 重複組合せを自作しました(15 + 25 + 25 = 25 + 15 + 25だから)。yieldを使うと簡単ですね。 let rec repeated_combination a n = seq { if n = 0 then yield [] else if a <> [] then for b in…

Project Euler 29

F#

http://projecteuler.net/index.php?section=problems&id=29 Setは次のように使います。 let s : int Set = Set.empty let s1 = s.Add 1 let s2 = s1.Add 2 let s3 = s2.Add 1 printfn "%A" s3 // seq [1; 2]Addすると新たにSetが作られます。使いにくいです…

Project Euler 28

F#

http://projecteuler.net/index.php?section=problems&id=28 スパイラルの位置の列を作ります。

Project Euler 27

F#

http://projecteuler.net/index.php?section=problems&id=27 こうするとエラーになります。 printfn "%d" (Seq.length (Seq.takeWhile (fun n -> n < 30) Seq.initInfinite (fun n -> n * n)))どうもSequenceを束縛しなければならないようです。 let s = Seq…

Project Euler 26

F#

http://projecteuler.net/index.php?section=problems&id=26 この問題はオイラーの定理を使うと計算が速くなるのですが、コードがかなり長くなってしまいますね。本当は大きいほうから調べるとさらに速いです。

Project Euler 25

F#

http://projecteuler.net/index.php?section=problems&id=25 yieldを使ってフィボナッチ数列を出してもいいですが、前にやったようにunfoldを使うと美しいですね。大きな数になるのでサフィックスIをつけるのを忘れてはいけません。 let count n = Seq.initI…

Project Euler 24

F#

http://projecteuler.net/index.php?section=problems&id=24 この問題は手計算レベルの計算量で済みます。 let rec factorial n = if n = 0 then 1 else n * (factorial (n - 1)) let to_number a = List.fold (fun x y -> x * 10L + int64 y) 0L a let rec …

Project Euler 23

F#

http://projecteuler.net/index.php?section=problems&id=22 必要な範囲の過剰数を全て求めて、それをひっくり返したものと比較しながら和があるかを調べます。

Project Euler 22

F#

http://projecteuler.net/index.php?section=problems&id=22 Fileの入力には.NETを使います。

Project Euler 21

F#

http://projecteuler.net/index.php?section=problems&id=21 Sequenceは遅延評価らしいです。大きなSequenceもメモリを食うことはありません。 let N = int64 1e8 printfn "%d" (Seq.sum (seq { 1L..N }))Seq.toListもListを中に持って一つずつ出していくよ…