同じ問題をみんなで解いてみると面白い

SICP読書会を研究室の有志でやっているのですが、問題を解いてきた答えに個性があって面白かったという話。

例えば問題1.3の「3つの数の中で大きい方の2つの数の二乗和を求める関数」ではこんな感じでした。


(define (>= x y)
  (not (< x y))

(define (xor a b)
  (if a (not b) b))

(define (func1-3 a b c)
  (+ (cond ((and (> a b) (>= a c)) (* a a))
           ((and (> b a) (>= b c)) (*b b))
           (else (* c c)))
     (cond ((xor (> a b) (>= a c)) (* a a))
           ((xor (> b a) (>= b c)) (* b b))
           (else (* c c)))))

なんかごちゃごちゃしててアホっぽい感じ。


Aさん

(define (func1-3 a b c)
  (define (pow2 x) (* x x))
  (+ (pow2 (if (> a b) (if (> a c) a c)
           (if (> b c) b c)))
     (pow2 (if (> a b) (if (> a c) (if (>b c) b c) a)
           (if (> b c) (if (>a c) a c) b)))
  )
)

素直。C言語っぽい感じがした。


Bさん

(define (select-min a b)
  (if (< a b) a b))

(define (select-max a b)
  (if (> a b) a b))

(define (double a) (* a a))

(define (func1-3 a b c)
  (if (< (select-min a b) c)
      (+ (double (select-max a b)) (double c))
      (+ (double a) (double c))))

3人の中では一番スマートな印象。
doubleは意味違うだろってのは置いといて。


比較的単純な問題でさえ、こんなに多様な回答があるって何か面白くないですか?
人の回答を見て、自分のももっとうまくやれたのにと思う事しきり。


と、ここまで書いて、つまりどう書く?orgに繋がる訳かと思った。
ただ、どう書く?orgは他の人の答えが見えるから、洗練させていく事は出来るけど、多様性を見る事はちょっと難しいのかな。
欠点があるって分かってる回答を載せようと思う人は少ないもんねぇ。