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