理系学生日記

おまえはいつまで学生気分なのか

SICP

問題2-74d (2.4.3 Data-Directed Programming and Additivity)

買い取った企業の各事業所(あれば)について、get-recordをテーブルに入れとけ!!

問題2-74c (2.4.3 Data-Directed Programming and Additivity)

全部署のファイルから、従業員のレコードを探してこいって問題です。 なんかもう、都合のいいように仮定しまくった。 (define (find-employee-record employee-name files) (if (null? files) #f (let ((top-file (car files))) (let ((result (get-record (…

問題2-74b (2.4.3 Data-Directed Programming and Additivity)

メンドくなってきた!! 各部署には独自のフォーマットで従業員レコードがファイルに格納されているんですから、たぶんですけど各部署には、やっぱしそのレコードから給料を抜き出す関数が定義されているんだろうと。 そしたらその抜き出し関数を部署をキーと…

問題2-74a (2.4.3 Data-Directed Programming and Additivity)

問題が長いけど、部署ごとで使われているファイルのデータ構造が違うから、なんとかしろという話。 各部署にはたくさん人事ファイルがあるんだろうけど、さすがにその部署内ではデータ構造が一緒だろうという想定。 で、各部署ではファイル名と、取り出した…

問題2-73d (2.4.3 Data-Directed Programming and Additivity)

こんな風に呼び出したいんだけど、変更箇所どこか。 ((get (operator exp) 'deriv) (operands exp) var) putを変更すりゃいいよ!

問題2-73c (2.4.3 Data-Directed Programming and Additivity)

(define (install-exponential) (define (deriv-exponential exp var) (print exp) (make-product (exponent exp) (make-product (deriv (base exp) var) (make-exponentiation (base exp) (- (exponent exp) 1))))) (put 'deriv '** deriv-exponential) 'do…

問題2-73b (2.4.3 Data-Directed Programming and Additivity)

b. 加算と乗算を微分する関数書け。その関数をテーブルにインストールするコードも書け. (define (install-sum-and-product) (define (deriv-sum exp var) (make-sum (deriv (addend exp) var) (deriv (augend exp) var))) (define (deriv-product exp var)…

問題2-73a (2.4.3 Data-Directed Programming and Additivity)

微分する関数として以前こんなのを書かされた。 (define (deriv exp var) (cond ((number? exp) 0) ((variable? exp) (if (same-variable? exp var) 1 0)) ((sum? exp) (make-sum (deriv (addend exp) var) (deriv (augend exp) var))) ((product? exp) (mak…

問題2-72 (2.3.4 Example: Huffman Encoding Trees)

encode-symbolの計算量を計算すればいいっぽい。 encode-symbolはsymbol-in-tree?とelement-of-set?を呼び出しているので、このへんも考慮する。 (define (element-of-set? x set) (cond ((null? set) #f) ((equal? x (car set)) #t) (else (element-of-set?…

問題2-71 (2.3.4 Example: Huffman Encoding Trees)

n個のシンボルがあって、それぞれの出現頻度がのときの符号木はどうなるかって話で、n=5のときはこんなになる。 n=10はメンドいので省略しました! 一番出現頻度が大きいシンボルに何ビット必要かは、他のシンボルの出現頻度の和が なので、1ビットですむ。 …

問題2-70 (2.3.4 Example: Huffman Encoding Trees)

こういう単語とその頻度を用いて、 ((A 2) (BOOM 1) (GET 2) (JOB 2) (NA 16) (SHA 3) (YIP 9) (WAH 1)) この歌詞をエンコードする。 Get a jobSha na na na na na na na naGet a jobSha na na na na na na na naWah yip yip yip yip yip yip yip yip yipSha…

問題2-69 (2.3.4 Example: Huffman Encoding Trees)

今日はいよいよHuffman符号木をつくる。ワクワクはするんですけど、だんだんと1問解くのにかかる時間が増えています。 今の1日1問ペースを2日1問とかにできたらなーと妄想して喜んでいますが、そんなことすると1日目を休んで結局2日目で同じ事になるので意味…

問題2-67 (2.3.4 Example: Huffman Encoding Trees)

情報理論とかで必ず習うHuffman符号を作るからがんばれって話のようですが、2-67はサンプルとして渡された符号木でサンプルのコードをデコードしろと。 (decode sample-message sample-tree) ; (A D A B B C A)

問題2-66 (2.3.3 Example: Representing Sets)

データをどう表現するかでプログラムの性能に大きな影響があるよというお話がなされてきたのだけど、最初はクソ簡単で直感的な表現にして後から性能を上げるようにするのも一つの手だよとおっしゃられておられる。たぶんその例なんだろうけど、問題2-66は順…

問題2-65 (2.3.3 Example: Representing Sets)

順序付き2分木で表現された集合を対象に、のunion-setとintersection-setを定義しろって問題ですけど、2-61、2-63、2-64を組み合わせるとかなり小さくできる予感。tree->list-2がであるかどうかとかの厳密な解析はしてないですけどふいんき(なぜか変換でき…

問題2-64 (2.3.3 Example: Representing Sets)

拙いながらもpartial-treeの動作説明。 partial-treeはリストから平衡木を作成し、その平衡木を第1要素、木に含まれない要素を第2要素にリストとして返すような関数になっている。 (define (partial-tree elts n) (if (= n 0) (cons '() elts) (let ((left-s…

問題2-63(a) (2.3.3 Example: Representing Sets)

今度は集合をbinary treeで構成するお話で、でも2-63はbinary treeを配列に変換する関数についての問題という。。 どれも{1,3,5,7,9,11}という集合をbinary treeで表現したものですが、 (define first (make-tree 7 (make-tree 3 (make-tree 1 '() '()) (mak…

問題2-62 (2.3.3 Example: Representing Sets)

要素数nに対して、でunionをとる。 (define (union-set set1 set2) (cond ((null? set1) set2) ((null? set2) set1) (else (let ((x1 (car set1)) (x2 (car set2))) (cond ((< x1 x2) (cons x1 (union-set (cdr set1) set2))) ((= x1 x2) (cons x1 (union-se…

問題2-61 (2.3.3 Example: Representing Sets)

順序リストでadjoin。 じつは悩みまくったんですけど。 (define (adjoin-set x set) (cond ((null? set) (list x)) ((< x (car set)) (cons x set)) ((= x (car set)) set) (else (cons (car set) (adjoin-set x (cdr set)))))) (adjoin-set 3 '(1 2 4 5)) ;…

問題2-60 (2.3.3 Example: Representing Sets)

あんまし変わってないけど、重複を許す集合上の演算。 (define (element-of-set? x set) (cond ((null? set) #f) ((equal? x (car set)) #t) (else (element-of-set? x (cdr set))))) (define (adjoin-set x set) (cons x set)) (define (union-set set1 set…

問題2-59 (2.3.3 Example: Representing Sets)

抽象化はとても大事、という例がどんどん出てくるんですけど、2.3.3は集合をどう抽象化するか、という話みたいです。まずは単にリストで表現すればいいんじゃね?というところなんですけど、クソ効率が悪いという旨も書いてある。 とりあえずリスト表現で頑…

問題2-58 (2.3.2 Example: Symbolic Differentiation)

記号的微分を中置記法に対して行えるように変更しろって言う課題で、変更点は以下な感じ。 (define (make-sum a1 a2) (cond ((=number? a1 0) a2) ((=number? a2 0) a1) ((and (number? a1) (number? a2)) (+ a1 a2)) (else (list a1 '+ a2)))) (define (mak…

問2-56 (2.3.2 Example: Symbolic Differentiation)

数値的微分じゃなくて、記号的微分(Symbolic Differentiation)やろうぜって章に入りました。 最初はどうやってやるんだっていうか無理じゃねみたく思っていたのですが、簡単なヤツなら結構簡単にできるみたいです。簡単って言うのも、コロンブスの卵だと思…

問2-55 (2.3.1 Quotation)

'はquoteのシノニムだそうなので、 ''abracadabra # 'abracadabra は (quote (quote abracadabra)) とおなじ。外側のquoteが、(quote abracadabra)というリストをつくってるてことかな。というわけで、 (car ''abracadabra) ; quote (cdr ''abracadabra) ; (…

問題2-54 (2.3.1 Quotation)

同じ要素が同じ順番に並んでるリストはequalだそうで、それを判定する関数作る。 (define (equal? list1 list2) (cond ((and (null? list1) (null? list2)) #t) ((eq? (car list1) (car list2)) (equal? (cdr list1) (cdr list2))) (else #f))) 下の各リスト…

問題2-52 (2.3.1 Quotation)

実行してみるだけ。 (list 'a 'b 'c) ;; (a b c) (list (list 'george)) ;; ((george)) (cdr '((x1 x2) (y1 y2))) ;; ((y1 y2)) (cadr '((x1 x2) (y1 y2))) ;; (y1 y2) (pair? (car '(a short list))) ;; #f (memq 'red '((red shoes) (blue socks))) ;; #f …

問題2-51 (2.2.4 Example: A Picture Language)

こっちでも、 (define (below painter1 painter2) (let ((split-point (make-vect 0.0 0.5))) (let ((paint-top (transform-painter painter1 split-point (make-vect 1.0 0.5) (make-vect 0.0 1.0))) (paint-bottom (transform-painter painter2 (make-vect…

問題2-50 (2.2.4 Example: A Picture Language)

kiririmodeを逆にする。 (define (transform-painter painter origin corner1 corner2) (lambda (frame) (let ((m (frame-coord-map frame))) (let ((new-origin (m origin))) (painter (make-frame new-origin (sub-vect (m corner1) new-origin) (sub-vect…

問題2-49 (2.2.4 Example: A Picture Language)

(a) 正方形 (b) クロス。 (c) ダイヤ (d) 面白くないので好みなヤツ作った。後悔はしていない。

問題2-48 (2.2.4 Example: A Picture Language)

webにおけるSICP(笑)への流れが。。流れが。。 (define (make-segment start-point end-point) (cons start-point end-point)) (define (start-segment segment) (car segment)) (define (end-segment segment) (cadr segment))