F#

Project Euler 20

F#

http://projecteuler.net/index.php?section=problems&id=20 他の数値型から多倍長整数型への変換は次のようにします。 let n = 1 printfn "%A" (System.Numerics.BigInteger n)ただ、これだとちょっと名前が長いのが困ります。こう書けば短く済みます。 ope…

Project Euler 19

F#

http://projecteuler.net/index.php?section=problems&id=19 これはライブラリを使う問題ではなく、与えられた1900年1月1日の曜日を元に計算するものです。yieldを使うと記述しやすいでしょう。

Project Euler 18

F#

http://projecteuler.net/index.php?section=problems&id=18 経路を辿るときに座標と経路番号の3要素のタプルで状態を持ってunfoldしています。 2要素のタプルは簡単にアクセスできますが、 let t = (1, 2) printfn "%d" (snd t) // 23つ以上の要素のタプル…

Project Euler 17

F#

http://projecteuler.net/index.php?section=problems&id=17 再帰的にも書けそうですが、ここでは配列を使っています。

Project Euler 16

F#

http://projecteuler.net/index.php?section=problems&id=16 ビット演算子は同じ記号を3つ重ねます。&&&, |||, ^^^, ~~~, >> があります。 多倍長整数もビット演算できます。 let rec digits n = if n = 0I then [] else (digits (n / 10I)) @ [int (n % 10I…

Project Euler 15

F#

http://projecteuler.net/index.php?section=problems&id=15 この問題はcombinationを計算するだけです。 let rec C n m = if m = 0 then 1L else (C n (m - 1)) * (int64 (n - m + 1)) / (int64 m) printfn "%d" (C 40 20)32ビットで収まらないので必要な部…

Project Euler 14

F#

http://projecteuler.net/index.php?section=problems&id=14 コラッツの問題です。配列の要素を0にし、長さが分かるたびにそれを配列に書き込んでいきます。コラッツ列は一定の値以下なら1→2→4→1以外はループしないという実験から来る事実を使っています。 …

Project Euler 13

F#

http://projecteuler.net/index.php?section=problems&id=13 F#には大きな整数を扱えるbigint型があります。末尾にIをつけるとbigint型になります。 let a = [ 37107287533902102798797998220837590246510135740250I; 4637693767749000971264812489697007805…

Project Euler 12

F#

http://projecteuler.net/index.php?section=problems&id=12 素因数分解すれば簡単に約数の個数を数えることができます。n+1を素因数分解して、前に求めてあるnの素因数分解とかけて2で割ります。 これ、エラーになるんですね。 let f a = a.Head printfn "%…

Project Euler 11

F#

http://projecteuler.net/index.php?section=problems&id=11 行列をリストのリストで表してもいいですが、インデックスでランダムアクセスしやすい2次元配列を使いましょう。(リストなら線形時間かかる) 2次元配列はリストのリストがあれば簡単に作れます…

Project Euler 10

F#

http://projecteuler.net/index.php?section=problems&id=10 これはエラトステネスのふるいを使えという問題ですね。 新たに配列を導入します。 let a1 = [| 1; 2; 3 |]範囲でも書けます。 let a2 = [| 1..3 |]内包表記もあります。 let a3 = [| for i in 1.…

Project Euler 9

F#

http://projecteuler.net/index.php?section=problems&id=9 この手の直角三角形の問題はピタゴラス数の生成式を使うのが定番です。 a = l(m2 - n2) b = 2lmn c = l(m2 + n2) a + b + c = 2lmn' n' = m + n m > n mとnは互いに素 500を3つの積で表してそれが…

Project Euler 8

F#

http://projecteuler.net/index.php?section=problems&id=8 文字列は文字の配列らしいです。個々の文字にアクセスするには、 let s = "123" printfn "%c" s.[0] // 1 これを数にするには、intに変換すればコードになるのでそれを用いればよいでしょう。 prin…

Project Euler 7

F#

http://projecteuler.net/index.php?section=problems&id=7 素数判定は2から順に割っていきます。 let count start = Seq.initInfinite (fun n -> n + start) let is_prime n = Seq.forall (fun p -> n % p <> 0) (Seq.takeWhile (fun p -> p * p <= n) (cou…

Project Euler 4

F#

http://projecteuler.net/index.php?section=problems&id=4 全ての組合せに対し、回文数であるかどうか判定し、回文数の中で最大のものを求めます。 回文数の判定は、各桁の数字ごとのリストにし、それを逆にし、数に戻して元の数と同じか調べます。 まず、…

Project Euler 3

F#

http://projecteuler.net/index.php?section=problems&id=3 最大の素数を求めればよいのですが、せっかくなので素因数分解のコードを書きました。あまりうまく書けていません。 let rec calc_exp n p = if n % p = 0 then let t = calc_exp (n / p) p (fst t…

Project Euler 2(2)

F#

http://projecteuler.net/index.php?section=problems&id=2 フィボナッチ数列を次のように定義すると、 let fib = seq { let mutable a = 1 let mutable b = 1 while true do yield b let tmp = b b <- a + b a <- tmp }mutableは使えないと怒られてしまいま…

Project Euler 2(1)

F#

http://projecteuler.net/index.php?section=problems&id=2 Haskellで書くと、 fib = 1:2:[ a + b | (a,b) <- zip fib (tail fib) ] main = print (sum (takeWhile (<=4*10^6) (filter even fib))) フィボナッチ数列の無限リストを作ってtakeWhileでぶった切…

Project Euler 1(2)

F#

sumを再帰的に定義しましょう。 let sum list = match list with | head :: tail -> head + sum tail | [] -> 0 let N = 1000; printfn "%d" (sum (List.filter (fun n -> n % 3 = 0 || n % 5 = 0) [1..N-1]))最後の行、filterはこのように使います。 ラムダ…

Project Euler 1(1)

F#

http://projecteuler.net/index.php?section=problems&id=1 これからProject Eulerの問題を解きながらF#を学んでいきます。F#についてはまだほとんどわかっていません。 環境 F#はVisual Studio 2010 beta2をインストールすると使えます。IDEを使ってもいい…