最終更新日 7月4日 ( ~2.89 )
せっかくだからざっくりでも難易度書いていった方が 後から勉強する人が勉強しやすそうなので 今後問題解くと同時に難易度も書き残していくことにする。
< ご注意 >
・難易度に関しては完全に個人の主観となります。
参考までに僕個人のスペックを記載しておくと、高校2年の数2Bまで終わってるくらいのレベル感です。アカデミックな数学はパッパラパーです。
・また、各Exerciseの難易度に関しては そのExerciseの所まで勉強した時点でのスキルセット・理解度を想定した難易度を書くようにしています( つまり、既に後の章も勉強して記述に慣れた状態での難易度ではないので、前の章の★3つと後の章の★3つのレベル感が大きく異なります )。
第1章 難易度リスト
第2章 難易度リスト
第3章 難易度リスト
第4章 難易度リスト
第5章 難易度リスト
—
2.1 データ抽象入門
2.1.1 例: 有理数の算術演算
2.1 ★★ (慣れるまではちょっと苦戦するかも)
2.1.2 抽象の壁
2.2 ★ (しゅんころ)
2.3 ★★ (データをどう表現するか考えて解く)
2.1.3 データとは何か
2.4 ★★ (ちょっと抽象的だけどそこまで難しくない)
2.5 ★★★ (どう実装しようかなーとちょっと悩んだ)
2.6 ★★★★★ (理屈は割とすんなりわかるけど抽象度が高く実装に悩む)
【概観】
・2.6以外は割りとすんなり。因みにここら辺を解き始める前に 前章でlambda計算に慣れておく必要あり。
—
2.1.4 拡張問題: 区間算術演算
2.7 ★ (しゅんころ)
2.8 ★ (しゅんころ)
2.9 ★★★ (問題文の日本語が理解できた後は割と楽)
2.10 ★★★ (実装は割と楽。不具合の再現がちょっと面倒だった)
2.11 ★★★ (問題の意図がわかれば解ける)
2.12 ★★ (そこまで苦戦しない)
2.13 ★★★ (近似値を単純化)
2.14 ★★★ (時間がかかるけど順を追って考えれば解ける)
2.15 ★★★★ (原理を理解すればスッキリ)
2.16 計測負荷 (単純な答えのある類の問題ではない)
【概観】
・問題同士が密接に繋がっているので正直めちゃくちゃめんどくさい。
モチベーションキラーになりうるので、まとまった時間でさっさと全部やっつけちゃった方が良い。
—
2.2 階層データ構造と閉包性
2.2.1 並びの表現
2.17 ★ (しゅんころ)
2.18 ★★★ (書き方に慣れるまでちょっと大変)
2.19 ★★ (以前の章の問題ゆえ面倒臭い。問題自体はそんな難しくない)
2.20 ★★ (そこまで難しくない)
2.21 ★ (しゅんころ)
2.22 ★★ (そこまで難しくない)
2.23 ★★ (そこまで難しくない)
【概観】
・問題数は多いけど割りとすんなり倒せてさくさく進めるのが多い。
—
2.2.2 階層構造
2.24 ★★ (教科書読んでちゃんと理解すればしゅんころ)
2.25 ★ (しゅんころ)
2.26 ★ (しゅんころ)
2.27 ★★★ (慣れないうちは割と面倒)
2.28 ★★★ (慣れないうちは割と面倒)
2.29 (そもそもモービルが何かググってイメージつければ余裕)
2.29(a) ★ (しゅんころ。list特有の表記に注意)
2.29(b) ★★ (ちょっと時間かかるけどできる)
2.29(c) ★ (しゅんころ)
2.29(d) ★ (しゅんころ)
2.30 ★ (しゅんころ)
2.31 ★ (しゅんころ)
2.32 ★★★ (単純だけど抽象を導きだすのに悩んだ)
【概観】
・ポインタ表現を理解するのがポイント。
・cons表現、list表現それぞれにおいてcar, cdrがどんな風に構造を返すかちゃんと理解してるかどうかが問題を解く鍵。
・木構造でlistとかconsとか使って再帰回すのが、これまでの再帰と若干勝手が違うので 慣れる必要あり。
・二進モービル問題のイメージがつかめない人は「モービル」をGoogleで画像検索すると一発。
—
2.2.3 公認インタフェースとしての並び
2.33 ★ (余裕)
2.34 ★★ (そこまで難しくない)
2.35 ★★ (そこまで難しくない)
2.36 ★★★ (mapの汎用性)
2.37 ★★★★ (事前に数学の行列を理解しておくとわかりやすい)
2.38 ★★ (リストの仕組みを理解していれば楽)
2.39 ★★ (リストの仕組みを理解していれば楽)
2.40 ★★★ (慣れるまではちょっと一苦労)
2.41 ★★★ (慣れるまではちょっと一苦労)
2.42 ★★★★★ (そもそもコードがちょい複雑+pairの定義に悩む)
2.43 ★★★ (これまでの経験則から比較的想像に容易)
【概観】
・enumerate, filter, map, accumulation のように データを集めてフィルタリングして一斉に処理をかけるような考え方は関数型の要の一つとなる考え方なのでしっかり理解しておきたい。
・mapやfilterが絶大な威力を発揮する上、関数型の可能性への光に満ちた扉が開く。ただ、そのあまりの絶大さゆえに、手に余るので、身に染み込むまで2,3度は繰り返したい節だった。
—
2.2.4 例: 図形言語
2.44 ★ (楽々)
2.45 ★★ (具体化されたものから抽象化すれば楽)
2.46 ★ (余裕)
2.47 ★ (リストとconsの違いを理解していれば余裕)
2.48 ★ (しゅんころ)
2.49 ★★ (仕組みが分かれば楽。(d)のwaveが作業ゲー)
2.50 ★★ (そこまで難しくない)
2.51 ★★ (割と簡単)
2.52 ★ (余裕)
【概観】
・この頃になると割と当たり前のように再帰を使いこなしている。
・仰々しい図が載せられていて さぞかし手応えがあるかと思いきや、案外そうでもない。内弁慶みたいな感じ。
・デフォだと図形言語がデバッグできなくて焦るけど、こういうすばらしいライブラリがあるので活用しよう。
—
2.3 記号データ
2.3.1 クォート
2.53 ★ (余裕)
2.54 ★ (余裕)
2.55 ★ (余裕)
【概観】
・ついに出ました、お待ちかねの数値以外のものによるデータ表現。
・この節は簡単で、「次の節からクォートを利用したどんな面白い問題が出てくるんだろう」とか期待した矢先に地獄が待っていることになるので用心した方がいい。
2.3.2 例: 記号微分
2.56 ★★★ (本節の記号微分の一連の手続きに関する挙動を性格に理解している必要がある)
2.57 ★★★★ (本節の記号微分の一連の手続きに関する挙動を性格に理解している必要がある)
2.58 ★★★★ (本節の記号微分の一連の手続きに関する挙動を性格に理解している必要がある)
【概観】
・導入にしては結構重くないか…?
・ここで扱うderivに関しては後々また出てくるのでしっかり理解しておきたい。
2.3.3 例: 集合の表現
2.59 ★★ (そこまで難しくない)
2.60 ★★★ (記述量がそれなりに多い)
2.61 ★★★
2.62 ★★
2.63 ★★★★ (一部計算量に関しては漸化式的な話なので、
数学・木構造アルゴリズムに慣れてないと戸惑うかも)
2.64 ★★★★ (構造を理解するのにちょっと苦労)
2.65 ★★★
2.66 ★★★
【概観】
・このあたりになると 記号データを割とすんなりと扱えるようになっていることに気づくと思う。
2.3.4 例: Huffman符号化木
2.67 ★ (そのまま)
2.68 ★★★ (符号化木の構造をしっかり理解している必要がある)
2.69 ★★★★ (軽率に再帰を組んで深さnの偏った木をつくってしまわないように。
これまでに出てきた手続きを活用しよう)
2.70 ★★ (ここでネット上の皆の解答と値が合わない場合は 前問でコケてるので再チェック)
2.71 ★★★ (図示して解く)
2.72 ★★★ (2.71の図示を使える)
【概観】
・Huffman符号化木SUGEEEEEってなる。こういう最適化技法があるんだね
・Huffman符号化木の実世界での応用に関してはモールス符号がある。暗号論における、一般的な英文内のアルファベットの出現頻度に照らし合わせて Huffman符号化木の要領でモールス符号を追っていくと、本当にモールス符号がこの順で並んでいて「おおっ」てなる。
・手続きがどういう木構造をつくるかをしっかりと理解しなければ問題を解くのは難しい。
・理解するのにはそれなりの時間をかける必要があるので覚悟しておいた方が良い。
—
2.4 抽象データの多重表現
2.4.3 データ主導プログラミングと加法性
2.73
a) ★★ (概念を理解していれば)
b) ★★★★ (概念を理解した後の始めての問題につき苦戦する)
c) ★★ (bがわかればcは問題無い)
d) ★ (SICPの問題で「どのような変更が必要か」が問われるような場合は大抵
「これしか変更せずに済むのかSUGEEEE」っていう気づくための問題)
2.74
a) ★★★★ (パッケージのモデルを理解していないと苦戦する)
b) ★★ (aがわかるくらい理解できていればそこまで苦戦しない)
c) ★★★ (aがわかるくらい理解できていればそこまで苦戦しない)
d) ★ (これは大丈夫)
2.75 ★★ (make-from-real-imagをまねっこするだけ)
2.76 ★★ (これまでの演算の特徴を理解できていればそこまで苦戦しない)
【概観】
・「あれ?問題少なくてスラスラ読めるぜよっしゃあ!」なんて考えないように。節の最後に待ちかまえる問題の所で 理解するまで何度も泣きながら読み返すことになるので。
・一応デバッグする方法はWeb上に転がっているけれど、前の問題との密接な絡みがあったり若干デバッグしづらくなってくる。
・個人的に 2.4 はこれまで( 1.1 ~ 2.4)のSICP史上で一番時間がかかった部分でもある。理屈はわかるんだけど、データ主導のモデルを 他の人に教えられるくらいガチで理解していないと問題に太刀打ちできない。
・飛ばすとえらいことになる(この節で学んだ事をベースに次の節で話が進んでいくので この節でコケると次の節でも痛い目を見るかも)。
・時間的デメリットに対して、データ主導によるパッケージングの威力がわかるというメリットがある(またメッセージパッシング、汎用演算などのメリット・デメリットも相対的に分かるようになる)。
・とりわけ「複数の仕様が混在していて、どうにかして仕様を一つに吸収したい」「それぞれの依存関係を極力少なくしたい」なんて現実世界じゃ本当によくあることなので、このあたりの考え方はとても新鮮でためになる部分もある(特に「パッケージングする」という点において)。
・とはいえ、本節の最後の問題が示しているように データ主導の考え方も銀の弾丸じゃないので、使い所はよく考えた方が良い。
・そうはいってもやはり、こういう考え方は現実世界の複雑さにいかにして立ち向かうかを吟味する上でのヒントになるので、時間をかけてでも習得するメリットは大きい。
2.5 汎用演算のシステム
2.5.1 汎用算術演算
2.77 ★★ (丁寧に手順を追う)
2.78 ★★ (問題の意味が分かれば)
2.79 ★★ (これまで通りの手順で)
2.80 ★★ (特に迷う部分は無い)
2.5.2 異る型のデータの統合
2.81 ★★
2.82 ★★★
2.83 ★★
2.84 ★★★
2.85 ★★★
2.86 ★★★★
2.5.3 例: 記号代数
2.87 ★★
2.88 ★★★
2.89 ★★★★
2.90 ~ スキップ
Written by Nisei Kimura ( 木村 仁星 )