1 |
Exercise 1.1 Interpreter result |
1.211 |
2 |
459 |
2 |
Exercise 1.2 Prefix form |
0.001 |
1 |
2 |
3 |
Figure 1.1 Tree representation, showing the value of each su |
0.007 |
1 |
10 |
4 |
Exercise 1.4 Compound expressions |
0.003 |
1 |
4 |
5 |
Exercise 1.5 Ben’s test |
0.008 |
1 |
11 |
6 |
Exercise 1.6 If is a special form |
0.969 |
2 |
118 |
7 |
Exercise 1.7 Good enough? |
0.949 |
3 |
436 |
8 |
Exercise 1.8 Newton’s method |
0.197 |
2 |
193 |
9 |
Exercise 1.10 Ackermann’s function |
3.038 |
2 |
379 |
10 |
Exercise 1.11 Recursive vs iterative |
0.037 |
1 |
54 |
11 |
Exercise 1.12 Recursive Pascal’s triangle |
0.012 |
1 |
17 |
12 |
Exercise 1.13 Fibonacci |
0.092 |
1 |
132 |
13 |
Exercise 1.9 Iterative or recursive? |
3.722 |
2 |
65 |
14 |
Exercise 1.14 count-change |
1.038 |
2 |
50 |
15 |
Exercise 1.15 sine |
0.267 |
2 |
195 |
16 |
Exercise 1.16 Iterative exponentiation |
0.032 |
1 |
46 |
17 |
Exercise 1.17 Fast multiplication |
0.019 |
1 |
28 |
18 |
Exercise 1.18 Iterative multiplication |
0.497 |
2 |
23 |
19 |
Exercise 1.19 Logarithmic Fibonacci |
1.374 |
2 |
93 |
20 |
Exercise 1.20 GCD applicative vs normal |
0.099 |
1 |
142 |
21 |
Exercise 1.21 smallest-divisor |
0.027 |
1 |
39 |
22 |
Exercise 1.22 timed-prime-test |
0.042 |
1 |
61 |
23 |
Exercise 1.23 (next test-divisor) |
0.383 |
2 |
5 |
24 |
Exercise 1.24 Fermat method |
0.067 |
1 |
96 |
25 |
Exercise 1.25 expmod |
0.051 |
1 |
74 |
26 |
Exercise 1.26 square vs mul |
0.003 |
1 |
4 |
27 |
Exercise 1.27 Carmichael numbers |
0.333 |
2 |
102 |
28 |
Exercise 1.28 Miller-Rabin |
0.110 |
1 |
158 |
29 |
Exercise 1.29 Simpson’s integral |
0.464 |
2 |
68 |
30 |
Exercise 1.30 Iterative sum |
0.030 |
2 |
10 |
31 |
Exercise 1.31 Product |
0.028 |
1 |
40 |
32 |
Exercise 1.32 Accumulator |
0.017 |
1 |
24 |
33 |
Exercise 1.33 filtered-accumulate |
0.092 |
1 |
133 |
34 |
Exercise 1.34 lambda |
0.006 |
1 |
8 |
35 |
Exercise 1.35 fixed-point |
0.265 |
2 |
87 |
36 |
Exercise 1.36 fixed-point-with-dampening |
0.035 |
1 |
50 |
37 |
Exercise 1.37 cont-frac |
0.569 |
2 |
348 |
38 |
Exercise 1.38 euler constant |
0.000 |
1 |
0 |
39 |
Exercise 1.39 tan-cf |
0.025 |
1 |
36 |
40 |
Exercise 1.40 newtons-method |
0.205 |
2 |
6 |
41 |
Exercise 1.41 double-double |
0.010 |
1 |
15 |
42 |
Exercise 1.42 compose |
0.004 |
1 |
6 |
43 |
Exercise 1.43 repeated |
0.019 |
1 |
27 |
44 |
Exercise 1.44 smoothing |
0.099 |
2 |
142 |
45 |
Exercise 1.45 nth-root |
0.056 |
1 |
80 |
46 |
Exercise 1.46 iterative-improve |
0.033 |
1 |
48 |
47 |
Exercise 2.1 make-rat |
1.608 |
2 |
109 |
48 |
Exercise 2.2 make-segment |
0.024 |
1 |
34 |
49 |
Exercise 2.3 make-rectangle |
2.183 |
2 |
174 |
50 |
Exercise 2.4 cons-lambda |
0.007 |
1 |
10 |
51 |
Exercise 2.5 cons-pow |
0.041 |
1 |
59 |
52 |
Exercise 2.6 Church Numerals |
0.024 |
1 |
34 |
53 |
Exercise 2.7 make-interval |
0.019 |
1 |
28 |
54 |
Exercise 2.8 sub-interval |
0.124 |
1 |
58 |
55 |
Exercise 2.9 interval-width |
0.006 |
1 |
8 |
56 |
Exercise 2.10 div-interval-better |
0.010 |
1 |
15 |
57 |
Exercise 2.11 mul-interval-nine-cases |
0.052 |
1 |
75 |
58 |
Exercise 2.12 make-center-percent |
0.393 |
2 |
43 |
59 |
Exercise 2.13 formula for tolerance |
0.003 |
1 |
5 |
60 |
Exercise 2.14 parallel-resistors |
0.047 |
1 |
68 |
61 |
Exercise 2.15 better-intervals |
0.007 |
1 |
10 |
62 |
Exercise 2.16 interval-arithmetic |
0.002 |
1 |
3 |
63 |
Exercise 2.17 last-pair |
0.966 |
2 |
89 |
64 |
Exercise 2.18 reverse |
0.006 |
1 |
9 |
65 |
Exercise 2.19 coin-values |
0.021 |
1 |
30 |
66 |
Exercise 2.20 dotted-tail notation |
0.311 |
2 |
156 |
67 |
Exercise 2.21 map-square-list |
0.013 |
1 |
19 |
68 |
Exercise 2.22 wrong list order |
0.007 |
1 |
10 |
69 |
Exercise 2.23 for-each |
0.006 |
1 |
9 |
70 |
Exercise 2.24 list-plot-result |
0.111 |
2 |
75 |
71 |
Exercise 2.25 caddr |
0.037 |
1 |
54 |
72 |
Exercise 2.26 append cons list |
0.011 |
1 |
16 |
73 |
Exercise 2.27 deep-reverse |
0.433 |
2 |
40 |
74 |
Exercise 2.28 fringe |
0.026 |
1 |
37 |
75 |
Exercise 2.29 mobile |
0.058 |
1 |
83 |
76 |
Exercise 2.30 square-tree |
0.100 |
2 |
122 |
77 |
Exercise 2.31 tree-map square tree |
0.019 |
1 |
27 |
78 |
Exercise 2.32 subsets |
0.010 |
1 |
15 |
79 |
Exercise 2.33 map-append-length |
0.375 |
2 |
96 |
80 |
Exercise 2.34 horners-rule |
0.006 |
1 |
8 |
81 |
Exercise 2.35 count-leaves-accumulate |
0.011 |
1 |
16 |
82 |
Exercise 2.36 accumulate-n |
0.006 |
1 |
9 |
83 |
Exercise 2.37 matrix-*-vector |
0.017 |
1 |
24 |
84 |
Exercise 2.38 fold-left |
0.372 |
2 |
65 |
85 |
Exercise 2.39 reverse fold-right fold-left |
0.005 |
1 |
7 |
86 |
Exercise 2.40 unique-pairs |
0.029 |
1 |
42 |
87 |
Exercise 2.41 triple-sum |
2.195 |
2 |
57 |
88 |
Figure 2.8 A solution to the eight-queens puzzle. |
0.001 |
1 |
2 |
89 |
Exercise 2.42 k-queens |
3.299 |
2 |
122 |
90 |
Exercise 2.43 slow k-queens |
0.019 |
1 |
28 |
91 |
Exercise 2.46 make-vect |
2.578 |
5 |
535 |
92 |
Exercise 2.47 make-frame |
0.083 |
1 |
10 |
93 |
Exercise 2.48 make-segment |
0.054 |
1 |
78 |
94 |
Exercise 2.49 segments->painter applications |
0.294 |
2 |
139 |
95 |
Exercise 2.50 flip-horiz and rotate270 and rotate180 |
0.019 |
1 |
27 |
96 |
Exercise 2.51 below |
1.801 |
4 |
524 |
97 |
Exercise 2.44 up-split |
1.169 |
2 |
89 |
98 |
Exercise 2.45 split |
0.113 |
2 |
23 |
99 |
Exercise 2.52 modify square-limit |
0.450 |
2 |
58 |
100 |
Exercise 2.53 quote introduction |
0.008 |
1 |
11 |
101 |
Exercise 2.54 equal? implementation |
0.050 |
1 |
72 |
102 |
Exercise 2.55 quote quote |
0.000 |
1 |
0 |
103 |
Exercise 2.56 differentiation-exponentiation |
0.393 |
2 |
65 |
104 |
Exercise 2.57 differentiate-three-sum |
0.560 |
3 |
147 |
105 |
Exercise 2.58 infix-notation |
0.112 |
1 |
161 |
106 |
Exercise 2.59 union-set |
0.277 |
2 |
6 |
107 |
Exercise 2.60 duplicate-set |
0.012 |
1 |
17 |
108 |
Exercise 2.62 ordered-union-set (ordered list) |
0.973 |
2 |
14 |
109 |
Exercise 2.61 sets as ordered lists |
0.004 |
1 |
6 |
110 |
Exercise 2.63 tree->list (binary search tree) |
0.078 |
1 |
113 |
111 |
Exercise 2.64 balanced-tree |
2.740 |
3 |
106 |
112 |
Exercise 2.65 tree-union-set |
9.785 |
2 |
47 |
113 |
Exercise 2.66 tree-lookup |
0.035 |
1 |
50 |
114 |
Exercise 2.67 Huffman decode a simple message |
0.303 |
3 |
108 |
115 |
Exercise 2.68 Huffman encode a simple message |
0.023 |
1 |
33 |
116 |
Exercise 2.69 Generate Huffman tree |
0.608 |
2 |
160 |
117 |
Exercise 2.70 Generate a tree and encode a song |
0.072 |
2 |
57 |
118 |
Exercise 2.71 Huffman tree for frequencies 5 and 10 |
0.258 |
2 |
202 |
119 |
Exercise 2.72 Huffman order of growth |
0.050 |
2 |
26 |
120 |
Exercise 2.73 data-driven-deriv |
0.605 |
2 |
189 |
121 |
Exercise 2.74 Insatiable Enterprises |
0.410 |
4 |
171 |
122 |
Exercise 2.75 make-from-mag-ang message passing |
0.019 |
1 |
28 |
123 |
Exercise 2.76 types or functions? |
0.003 |
1 |
5 |
124 |
Exercise 2.77 generic-algebra-magnitude |
0.772 |
3 |
190 |
125 |
Exercise 2.78 Ordinary numbers for Scheme |
0.212 |
2 |
67 |
126 |
Exercise 2.79 generic-equality |
1.786 |
2 |
28 |
127 |
Exercise 2.80 Generic arithmetic zero? |
0.056 |
1 |
80 |
128 |
Exercise 2.81 coercion to-itself |
0.749 |
3 |
330 |
129 |
Exercise 2.82 three-argument-coercion |
0.433 |
2 |
230 |
130 |
Exercise 2.83 Numeric Tower and (raise) |
0.717 |
3 |
116 |
131 |
Exercise 2.84 Using raise (raise-type ) in apply-generic |
0.865 |
2 |
135 |
132 |
Exercise 2.85 Dropping a type |
3.089 |
5 |
507 |
133 |
Exercise 2.86 Compound complex numbers |
0.274 |
2 |
108 |
134 |
Exercise 2.87 Generalized zero? |
0.919 |
4 |
389 |
135 |
Exercise 2.88 Subtraction of polynomials |
0.646 |
3 |
50 |
136 |
Exercise 2.89 Dense term-lists |
0.083 |
1 |
120 |
137 |
Exercise 2.90 Implementing dense polynomials as a separate p |
0.400 |
2 |
148 |
138 |
Exercise 2.91 Division of polynomials |
0.111 |
2 |
103 |
139 |
Exercise 2.92 Ordering of variables so that addition and mul |
4.556 |
11 |
964 |
140 |
Exercise 2.93 Rational polynomials |
0.378 |
3 |
198 |
141 |
Exercise 2.94 Greatest-common-divisor for polynomials |
0.091 |
1 |
131 |
142 |
Exercise 2.95 Illustrate the non-integer problem |
0.450 |
2 |
149 |
143 |
Exercise 2.96 Integerizing factor |
0.325 |
2 |
275 |
144 |
Exercise 2.97 Reduction of polynomials |
0.201 |
1 |
140 |
145 |
Exercise 3.1 accumulators |
0.425 |
2 |
53 |
146 |
Exercise 3.2 make-monitored |
0.027 |
1 |
39 |
147 |
Exercise 3.3 password protection |
0.010 |
1 |
14 |
148 |
Exercise 3.4 call-the-cops |
0.010 |
1 |
15 |
149 |
Exercise 3.5 Monte-Carlo |
0.528 |
2 |
98 |
150 |
Exercise 3.6 reset a prng |
0.479 |
2 |
68 |
151 |
Exercise 3.7 Joint accounts |
0.059 |
1 |
85 |
152 |
Exercise 3.8 Right-to-left vs Left-to-right |
0.026 |
1 |
38 |
153 |
Exercise 3.9 Environment structures |
21.030 |
10 |
1100 |
154 |
Exercise 3.10 Using let to create state variables |
4.933 |
2 |
138 |
155 |
Exercise 3.11 Internal definitions |
0.994 |
2 |
219 |
156 |
Exercise 3.12 Drawing append! |
2.966 |
3 |
347 |
157 |
Exercise 3.13 make-cycle |
0.010 |
1 |
14 |
158 |
Exercise 3.14 mystery |
0.385 |
2 |
77 |
159 |
Exercise 3.15 set-to-wow! |
1.942 |
3 |
117 |
160 |
Exercise 3.16 count-pairs |
0.171 |
1 |
118 |
161 |
Exercise 3.17 Real count-pairs |
0.029 |
1 |
42 |
162 |
Exercise 3.18 Finding cycles |
0.012 |
1 |
17 |
163 |
Exercise 3.19 Efficient finding cycles |
0.934 |
2 |
205 |
164 |
Exercise 3.20 Procedural set-car! |
0.633 |
2 |
121 |
165 |
Exercise 3.21 queues |
0.021 |
1 |
30 |
166 |
Exercise 3.22 procedural queue |
0.294 |
2 |
67 |
167 |
Exercise 3.23 dequeue |
0.049 |
2 |
71 |
168 |
Exercise 3.24 tolerant tables |
0.780 |
3 |
33 |
169 |
Exercise 3.25 multilevel tables |
2.103 |
2 |
486 |
170 |
Exercise 3.26 binary tree table |
0.013 |
1 |
18 |
171 |
Exercise 3.27 memoization |
0.802 |
2 |
2 |
172 |
Exercise 3.28 primitive or-gate |
1.316 |
2 |
783 |
173 |
Exercise 3.29 Compound or-gate |
0.001 |
1 |
2 |
174 |
Exercise 3.30 ripple-carry adder |
0.009 |
1 |
13 |
175 |
Exercise 3.31 Initial propagation |
0.013 |
1 |
18 |
176 |
Exercise 3.32 Order matters |
0.007 |
1 |
10 |
177 |
Exercise 3.33 averager constraint |
9.460 |
3 |
198 |
178 |
Exercise 3.34 Wrong squarer |
0.042 |
1 |
61 |
179 |
Exercise 3.35 Correct squarer |
0.012 |
1 |
17 |
180 |
Exercise 3.36 Connector environment diagram |
3.319 |
3 |
263 |
181 |
Exercise 3.37 Expression-based constraints |
0.037 |
1 |
53 |
182 |
Exercise 3.38 Timing |
0.061 |
1 |
88 |
183 |
Exercise 3.39 Serializer |
1.266 |
4 |
269 |
184 |
Exercise 3.40 Three parallel multiplications |
5.973 |
3 |
332 |
185 |
Exercise 3.41 Better protected account |
4.229 |
2 |
97 |
186 |
Exercise 3.42 Saving on serializers |
0.023 |
1 |
33 |
187 |
Exercise 3.43 Multiple serializations |
0.040 |
1 |
58 |
188 |
Exercise 3.44 Transfer money |
0.005 |
1 |
7 |
189 |
Exercise 3.45 new plus old serializers |
0.004 |
1 |
6 |
190 |
Exercise 3.46 broken test-and-set! |
0.007 |
1 |
10 |
191 |
Exercise 3.47 semaphores |
1.044 |
2 |
53 |
192 |
Exercise 3.48 serialized-exchange deadlock |
0.022 |
1 |
31 |
193 |
Exercise 3.49 When numbering accounts doesn’t work |
0.008 |
1 |
11 |
194 |
Exercise 3.50 stream-map multiple arguments |
0.317 |
3 |
96 |
195 |
Exercise 3.51 stream-show |
0.007 |
1 |
10 |
196 |
Exercise 3.52 streams with mind-boggling |
0.034 |
1 |
49 |
197 |
Exercise 3.53 stream power of two |
0.016 |
1 |
23 |
198 |
Exercis |
7 Comments
loevborg
Wonderful report! So now we know how long it takes to solve all of the problems: 729 hrs.
SICP is hard to work through even if you're just reading but wow, the exercises are on another level! I wonder how it compares to, say, a physics or biology textbook
wk_end
This is an interesting post in its way, but I hate how it's presented. The subject doesn't really call for this impersonation of academic rigor, since it's fundamentally an unscientific, subjective exercise – "How long did I, one particular computer scientist, take to work through this massive and occasionally open-ended task?" That's asking for an introspective essay, not a battery of tables and graphs.
But I think this is a useful critique of SICP, for those trying to teach from it or in particular for those trying to self-study it: it wasn't really designed to be done front-to-back (contrary to the nonsensical justifications given here); it's not a realistic demand of any student, or even necessarily a particularly productive use of their time unless they intended to move into compiler development. Its problem sets occasionally give the illusion that SICP itself will teach you what you need to solve these incredibly difficult problems and perform these incredible accomplishments, which is partially what's responsible for its legendary status. Not recognizing that – and it'd be hard to blame a solo learner for that – can be incredibly discouraging when one finds that they can't do things with the tools SICP has given and blame themselves for not appreciating those tools rather than SICP for asking too much and giving too little.
0cf8612b2e1e
Is there a modern SICP book? I tried to go through it once, but immediately got stuck because my math/physics was so rusty that I would have to spend more time researching the background than actually solving the CS puzzle
noelwelsh
SICP is a sprawling book. It's been rightly criticised; it is inaccessible without a strong maths and (electronic) engineering background, it's somewhat unfocused, and its code is archaic. But it blew my mind some 20 years ago when I worked through it over many train journeys. A more focused, more accessible book would be objectively better, but I think it would lose something. SICP, with its wild rambling through so many disparate topics, really did leave me feeling that I could make the computer do anything.
fsdkfdsf
[dead]
mk12
Kudos for finishing it. I’ve gone on a similar quest with https://mk12.github.io/sicp, but I’m still on chapter 3. I keep getting distracted by new ways of improving the website rather than making progress in the book.
zeckalpha
There's probably more nuance with 2.29 than is led onto here. The problem appears straightforward and there seems to be simpler solutions out there than the one described in the article.
Did the author overthink it or are the simple solutions not correct?