ノート・プリント・参考書などは持ち込み可である。
携帯電話などの通信機能を持つものは試用不可である。
プログラミング問題を解答するときは、 ネットワークに接続して WWW を閲覧しても良いが、掲示板、チャット、 メールなどで生身の人間と通信することは禁じる。 また、人間と区別のつかないもの(対話型の AI など)と通信することも禁じる。
テストの配点は50点である。 合格はレポートの得点を加点して、100 点満点中 60 点以上とする。
以下の問に答えよ。
Ⅰ. (Haskell プログラミング問題)
引数として与えられる整数のリストの要素のなかで、 3 の倍数となるものの和を返す関数
を定義せよ。
例えば、foo [2,1,2,-3,7,12] は 9 であり、
foo [-2,3,5,-1,15] は 18 であり、
foo [4,3,2,5,-12,-6,9] は -6 である。
この問では map, filter, foldl,
foldr などのリストに関するライブラリ関数や内包表記を使わず、
if 〜 then 〜 else 〜 式、算術演算子、
論理演算子、比較演算子、パターンマッチング、ガード、再帰のみを使って定義せよ。
また、Haskell で“余り”を表す算術演算子
は `mod` である。例えば (-7) `mod` 4(あるい
は mod (-7) 4)の値は
1 である。
正の整数 \(n\) を引数として受け、 \(1 \le x \le n\) かつ \(x^2 \le y \le 2 x^2\) で \(x + y\) が 奇数となる 整数の組 \((x,y)\)を列挙する関数
を(リストの内包表記を用いて)定義せよ。
例えば、bar 2 は [(1,2),(2,5),(2,7)]、
bar 3 は [(1,2),(2,5),(2,7),(3,10),(3,12),(3,14),(3,16),(3,18)] で、
bar 4 は [(1,2),(2,5),(2,7),(3,10),(3,12),(3,14),(3,16),(3,18),(4,17),(4,19),(4,21),(4,23),(4,25),(4,27),(4,29),(4,31)] となる。
(リストの要素の順番はこの通りでなくても良い。)
なお、\(m\) から \(n\) まで(ただし \(m \le n\))の整数のリストは、
[m..n] という式で得ることができる。例えば、[0..5]
は [0,1,2,3,4,5] である。
また、Haskell で“余り”を表す算術演算子は `mod`
である。例えば 7 `mod` 4(あるいは mod 7 4)の値は
3 である。
あるいは odd, even という関数を使っても良い。