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

中置記法から前置記法の変換

僕はSchemerなので、演算子の優先順位とかよくわかりません。だから、悪の中置記法を前置に変えてしまえばハッピーになると思うんだよ。 と思ったけど、これが結構むじぃ。 まずは定義。 式 ::= 項 ([+-] 項)* 項 ::= 因子 ([*-] 因子)* 因子 ::= 数 | '(' …

遅延評価のお勉強

遅延評価のお勉強に、SchemeでHaskellライクなインタプリタを作ってみる。足し算とifしかない。 (define (skell src) (define (forever) (forever)) (define (reader src) (fold (lambda (m cont) (cont (cond ((integer? m) (lambda (x) m)) ((pair? m) (la…

ふつける 5章 - 遅延評価

遅延評価の解説。スゲーわかりやすいっす。もしもSchemeを遅延評価にすると、 (define (squere x) (* x x)) (square (+ 1 1)) ; squereを簡約 (* (+ 1 1) (+ 1 1)) ; 前の+を簡約 (* 2 (+ 1 1)) ; 後ろの+を簡約 (* 2 2) ; かける 4 +を2度やることになるの…

ふつける 4章 - ユニークにならない

久しぶりにふつける読み。はまりまくりっすよ。はまりまくり。 uniqを作れ (ヒント: group使えばいいよ!!) って書いてあるんだけど、全然ユニークにならない。groupは隣接してれば、グループにまとめるみたい。 Prelude> import List Prelude List> group …

ghc -e

そうそう、これを探してた。hoge.hsがあって、 hello = "Hello, eval" えばる。 % ghc -e hello hoge.hs "Hello, eval"おし。 Vimに繋いで・・・。 nmap <C-CR> :w<CR>:!ghc -e <cword> %<CR> とりあえず単語だけでいいや。 ctrl + えんたー。 ふふぅん。快適。</cr></cword></cr></c-cr>

Problem 79 - セキュリティキーを解読せよ

これは面白かった。Problem 79 - Project Euler A common security method used for online banking is to ask the user for three random characters from a passcode. For example, if the passcode was 531278, they may asked for the 2nd, 3rd, and 5th…

Problem 45 - 三角数、五角数、六角数

同じような問題があった気がする。Problem 45 - Project Euler Triangle, pentagonal, and hexagonal numbers are generated by the following formulae: Triangle Tn=n(n+1)/2 1, 3, 6, 10, 15, ... Pentagonal Pn=n(3n−1)/2 1, 5, 12, 22, 35, ... Hexagon…

Problem 53 - 組み合わせ

40問達成!!Problem 53 - Project Euler There are exactly ten ways of selecting three from five, 12345:123, 124, 125, 134, 135, 145, 234, 235, 245, and 345In combinatorics, we use the notation, 5C3 = 10.In general,nCr = n!/r!(n−r)!,where r …

パスカルの三角形の横列

パスカルの三角形があって、 0: 1 1: 1 1 2: 1 2 1 3: 1 3 3 1 4: 1 4 6 4 1 5: 1 5 10 10 5 1 6: 1 6 15 20 15 6 1横列を求めたい。 例えば、6の横列を求めたいとする。1はとりあえず置いといて。6/1倍して、6 5/2倍して、15 4/3倍して、20 3/4倍して、15 2…

Problem 52 - n倍しても同じ数が現れる

英語の簡単なものからProblem 52 - Project Euler It can be seen that the number, 125874, and its double, 251748, contain exactly the same digits, but in a different order.Find the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and 6…

Problem 42 - 三角数

段々翻訳されてない所に入ってきた。英語力が無い僕には辛くなりそう。Problem 42 - Project Euler The n^th term of the sequence of triangle numbers is given by, tn = ½n(n+1); so the first ten triangle numbers are:1, 3, 6, 10, 15, 21, 28, 36, 45…

SICPを読む(104) 問題 3.21 - 3.22 - キュー(2)

もうちょい。 問題 3.21 Benのわがままを聞け。 (define print-queue car) (print-queue q) ; () な、消えてるだろ。データ構造がリストなんだからしょうがないじゃん。 問題 3.22 んじゃデータ構造変えてやればいいじゃないかと、次の問題へ。 (define (mak…

SICPを読む(103) 3.3.2 - キュー

キューなんて簡単だと思ってたら、SICPの実装が面白い。メモっておこう データ構造は(cons 先頭ポインタ 最後のポインタ) リストはポインタとしても使えるよねという発想。いただき。 挿入は(list 新規データ)として、最後のポインタを更新すればいい。 削除…

SICPを読む(102) 問題 3.16 - 3.20 対の数

ガンガンいくぞー。 問題 3.16 Benの手続きがうまくいかい理由。 (define a (cons 0 1)) (define b (cons 2 3)) (count-pairs (cons a b)) ; 3 (set-car! b a) (count-pairs (cons a b)) ; 4 (set-car! b a) (set-cdr! b a) (count-pairs (cons b b)) ; 7 無…

SICPを読む(101) 問題 3.12 - 3.15 - ポインタ

サックリと。 問題 3.12 append!について。予想が当ってて良かった。append!,last-pairはSRFI-1にあるみたい。last-pairは使ったこと無かった。活用できそう。 問題 3.13 ポインタがわかってれば大丈夫だと思う。要するに、nullのあったポインタの所に、先頭…

SICPを読む(100) 問題 3.11 - 内側ののdefine

とうとう100回を迎えてしまったが、SICPは半分も進んでいない。長い戦いになりそうだ。 問題 3.11 銀行口座手続きの説明をせよ。という問題。とりあえず、内側のdefineについてfactで考える。内側のdefineはletrecと同様と考えればいい。じゃぁ、letrecはど…

SICPを読む(98) 問題 3.9 - 評価モデル

どうもSICPの評価モデルの解説が曖昧だ。返された値がどうなるかについて解説されていないので、おかしな図になってる。 Scheme実装中なので、僕の実装で書いてみよう。 問題 3.9 階乗の再帰と反復を環境モデルで表せ。という問題。 (factional 3)で先に反復…

SICPを読む(97) 問題 3.8 - 命令プログラミングの落とし穴

問題を読み取れているのかわからない。 問題 3.8 最初に関数が呼ばれたのであれば、その値を返す。二度目以降なら0を返す。という関数にしてみた。 (define f (let ((flag #f)) (lambda (n) (if flag 0 (begin (set! flag #t) n))))) フラグが立っていなけれ…

SICPを読む(96) 問題 3.7 - 共同口座

ムズイな。 問題 3.7 パスワードつき銀行口座を改造して、共同口座を作れ。という問題。口座は同じで、パスワードが違うように設定する。 問題は、パスワードを変更してしまうと、引きずられて、元のパスワードまで変わってしまう点。ユーザーオブジェクトを…

SICPを読む(95) 3.1.3 - 代入を取り入れた対価

代入を取り入れた対価に関する解説を読む。 関数型プログラミングの素晴らしさのひとつは、デバッグのしやすさだ。 (define (square x) (* x x)) と定めたら、(square 2)は4。変わらない。絶対変わらない保障がある。バグをはっきり追える。 命令型プログラ…

SICPを読む(94) 問題 3.6 - 乱数発生器改

嗚呼、Schemeすることは難しい事じゃない。ただ脳に身を任せ・・・(謎 問題 3.6 乱数発生器を改造して、resetを付ける問題。generateは要らないと思うので、無くした。 (define random-init 12345) (define (rand-update x) (modulo (+ (* 214013 x) 253011…

SICPを読む(94) 問題 3.5 - モンテカルロ法による定積分

出ました。セキブン。 問題 3.5 モンテカルロ法を使って、定積分せよという問題。前前回の応用編。 まず、x1,x2,y1,y2という範囲を設定する。x1 範囲x1〜x2までの範囲をランダムにプロットしたいので、0〜1 * (x1 - x2) - x1として、x1〜x2を作る。 f(x1〜x2…

SICPを読む(99) 問題 3.10 - 局所変数の入れ物とフレーム

うぅん。SICPの説明がなんか納得いかない。 問題 3.10 make-withdrawのletをlambdaに書き直して、環境モデルを書き直す問題。 (define (make-withdraw internal-amount) ((lambda (balance) (lambda (amount) (if (>= balance amount) (begin (set! balance …

SICPを読む(93) 3.1.2 (3) - モンテカルロ法 (2)

難航するかと思ったら、それほどでもなくて良かった。互いに素 - Wikipediaふむふむ。なんとなく理解出来る自分がいることに驚く。 aとbが互いに素であることと 2^a-1 と2^b-1 が互いに素であることは同値。 因数分解してみるとわかる。オイラー入門1章を。 …

SICPを読む(92) 3.1.2 (2) - モンテカルロ法(1)

かなりゆっくり進んでおります。前回、M系列乱数を作ったので、モンテカルロ法を試しながら性能実験です。SICPのモンテカルロ法がよくわからないので、とりあえず単純な奴を。 単純なモンテカルロ法を使って、円周率を量る 三平方の定理から、単位円上の円は…

パターンマッチ使ってみた。

Schemeにもパターンマッチがあるらしい。 8 Pattern Matching Gauche ユーザリファレンス: 11.46 util.match - パターンマッチング 知らなかった・・・使ってみる。 (require (lib "match.ss")) (match '(1 2 3) ((a b c) (list c b a)) (_ 'else)) ; (3 2 1…

M系列乱数を作ってみた。

M系列乱数を作ってみた。 M系列乱数は、R(n) = R(n-p) xor R(n-q)の漸化式で作れる。 と言っても最初が必要なので、既存のアルゴリズムを使用して、乱数テーブルを作っておく必要がある。nを1個ずつ進めながらxorで計算していく。nの余りを取っていけば、テ…

SICPを読む(90) 問題3.1 - 3.4

簡単だったので、やっちまおう。 問題 3.1 アキュムレータを作れ。 (define ((make-accumulator n) x) (set! n (+ n x)) n) (define A (make-accumulator 5)) (A 10) ; 15 (A 10) ; 25 lambdaイラネー。 問題 3.2 これは面白い。関数の呼び出し回数を数える…

SICPを読む(91) 3.1.2 - 乱数

randの解説があるけど、randのソースが書いてなくてハマった。 (define random-init 12345) (define rand (let ((x random-init)) (lambda () (set! x (rand-update x)) x))) (define (rand-update x) (modulo (+ (* 214013 x) 253011) 32767)) (rand) ; 109…

Problem 31 - コインの両替問題

SICPでやった気がする。Problem 31 イギリスでは硬貨はポンド£とペンスpがあり,一般的な流通ではこれらの8つの硬貨がある.1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p).以下の方法で£2を作ることが可能である.1×£1 + 1×50p + 2×20p + 1×5p + 1×2p…