2010-04-01から1ヶ月間の記事一覧

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 23

http://projecteuler.net/index.php?section=problems&id=23 まず28123以下の自然数の配列を作り、過剰数を求めて、それらの和に対し配列の値を0にして、最後に配列の和を取る。 iterableに対してproductがうまく動かなかったので、iterableを修正した。

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 22

http://projecteuler.net/index.php?section=problems&id=22 単語を拾うのをiterableになるように実装して、単語をソートする。しかし、iterableのsortedがあったほうが便利なので作ってみた。 cout << sum(map(score, zip(itertools::count<>(1), sorted(li…

Project Euler 4

F#

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

Project Euler 20

http://projecteuler.net/index.php?section=problems&id=20 これも前にで作った多倍長整数クラスを使えば簡単。掛け算は足し算を繰り返すだけ。ただし、単純に足すだけだと芸がないのでバイナリ法を使った。 #include <iostream> #include "itertools.h" #include "lo</iostream>…

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 19

http://projecteuler.net/index.php?section=problems&id=19 曜日の定義は1900年なのに数えるのは1901年から。何度でも騙される。 1日の曜日を出すiterableを定義する。そして、iterableの長さを得る関数を作った。数えてもいいが、zipを使えば1行で書ける。…

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 18

http://projecteuler.net/index.php?section=problems&id=18 整数をルートに割り当てる。次に左右どちらに行くかを2進数で表して各桁が0か1かで決める。それを関数化するとiterateでルートが作れる。

Project Euler 287(2)

結局、修正して答え出した。 しかし、なんでこれ遅いんだろ。

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 16

http://projecteuler.net/index.php?section=problems&id=16 Problem 13で作った多倍長整数クラスを使えば簡単。足し算を繰り返すだけ。その後各桁の数字をatで拾ってくる。itertools.h #include <iostream> #include "itertools.h" #include "longint.h" using namesp</iostream>…

Project Euler 287

また読むのが大変です。四分木は昔やったことあるけど忘れた。 問題の意味はだいたいわかった。 うまくいなかないなあ。 あれ〜、不正解。どこが間違っているのかわからない。 間違いなおして走らせるも、1時間以上かかりそう。しかも、合っているかどうかわ…

Project Euler 15

http://projecteuler.net/index.php?section=problems&id=15 Combinationは再帰で書くと簡単。なのでメタプログラミングしてみた。 #include <iostream> template<int N, int M> struct C { static const long long value = C<N,M-1>::value * (N - M + 1) / M; }; template<int N> struct C<N, 0> { stat</n,></int></n,m-1></int></iostream>…

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の問題ページに前後のページへのリンクがついてた。これ、前からほしかったんだけど、見落としてただけ?

Project Euler 14(2)

メモ化を使うと速くなる。0に初期化しておき、nextで辿って0でないところに着いたら、そこまで辿った開始数での長さがわかる。このときに最初に0でないところまで辿りたいがtakewhileではその手前で終わってしまう。こういうのはよくあることだが、どうすべ…

Project Euler 1(1)

F#

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

Project Euler 14(1)

http://projecteuler.net/index.php?section=problems&id=14 Haskellで書くとこんな感じ。 import Data.List next n = if mod n 2 == 0 then div n 2 else 3 * n + 1 chain_length n = head [ k | (k,m) <- zip [1..] (iterate next n), m == 1 ] limit = 10…

Project Euler 13

http://projecteuler.net/index.php?section=problems&id=13 1要素で1桁を表す多倍長整数クラスを適当にでっちあげた。

Project Euler 4(5)

この問題をHaskellで書くと、 main = print (foldl1' max (filter is_palindromic [ x * y | x <- [100..999], y <- [100..999] ])) Pythonで書くと、 print reduce(max, ifilter(is_palindromic, (x * y for x, y in product(xrange(100, 1000), xrange(100…

Project Euler 100

http://projecteuler.net/index.php?section=problems&id=100 Pell方程式に帰着される。 pells x = (f x):[ f y | y <- pells x ] where f (a,b) = (a * 3 + b * 4, a * 2 + b * 3) solutions = [ (div (b + 1) 2, div (a + 1) 2) | (a,b) <- pells (1,1) ] …

Project Euler 99

http://projecteuler.net/index.php?section=problems&id=99 指数の計算をする代わりにlogの計算をする。

Project Euler 285

http://projecteuler.net/index.php?section=problems&id=285 もう問題でてるじゃん。しかし、今からでかける準備をしないと。 問題は理解したつもり。午前中のランニングのせいで頭が働かない。 電車の中で考えたら、ただの高校数学であることがわかった。

Project Euler 286

http://projecteuler.net/index.php?section=problems&id=286 285ができたのですぐに286に取り掛かった。ノートに問題番号を書いたら、すぐに解法を思いついた。数学的にもプログラミング的にも難しいところはない。 ネットがある環境に行き、Project Euler…

Project Euler 98

http://projecteuler.net/index.php?section=problems&id=98 ペアを作って、桁数が合う平方数すべてについてマッチするか調べる。

Project Euler 4(4)

ジェネレータの次があるかをexists_next()で問い合わせるようにした。ちょっとコードが煩雑になった。filterとtakewhileはコードがかなり重複しているような気がする。なんとかならないだろうか。 itertools.hを変えただけで、非常に速くなった。Haskellより…

Project Euler 4(3)

Haskellで import Data.List digits 0 = [] digits n = (digits (div n 10)) ++ [mod n 10] is_palindromic n = n == (foldr (\x y -> x + y * 10) 0 (digits n)) main = print (foldl1' max (filter is_palindromic [ x * y | x <- [100..999], y <- [100..…

make_tuple

C++

VC10 β2にmake_tupleがあるんだ。調べようと調べようと思って忘れていた。 #include <iostream> #include <tuple> using namespace std; int main() { auto t = make_tuple(1, 2, 3); cout << get<0>(t) << " " << get<1>(t) << " " << get<2>(t) << endl; } >cl /EHsc tuple.</tuple></iostream>…