はじめに
「Ruby力向上のための基礎トレーニング」をテストコード付きで解いてみたに触発されまして、Common Lispで解いてみようと思いました。元ネタの記事はRuby力向上のための基礎トレーニングです。今回はテスト作ってません。あと、追加仕様もまだ実装できていません。。。
問題
AOJ – オンライン プログラミング チャレンジ / Matrix-like Computation
以下の表のように、与えられた表の縦・横の値の合計を、それぞれの行・列で求め出力して終了するプログラムを作成してください。
- | col1 | col2 | col3 | col4 |
---|---|---|---|---|
row1 | 9 | 85 | 92 | 20 |
row2 | 68 | 25 | 80 | 55 |
row3 | 43 | 96 | 71 | 73 |
row4 | 43 | 19 | 20 | 87 |
row5 | 95 | 66 | 73 | 62 |
↓
- | col1 | col2 | col3 | col4 | sum |
---|---|---|---|---|---|
row1 | 9 | 85 | 92 | 20 | 206 |
row2 | 68 | 25 | 80 | 55 | 228 |
row3 | 43 | 96 | 71 | 73 | 283 |
row4 | 43 | 19 | 20 | 87 | 169 |
row5 | 95 | 66 | 73 | 62 | 296 |
sum | 258 | 291 | 336 | 297 | 1182 |
僕の解答例
お恥ずかしながら、Common Lispでプログラムを本格的に書いたのはこれが初めてです。書籍の写経はやっていたのですが、自分で書いてみようと思ってもうまくかけません。数時間かけてやっとこ書けました。関数がいっぱいできてしまったけど、ここまでする必要ないのかしら。
;; リストの合計を求める関数
(defun sum (lst)
(apply #'+ lst))
;; リストの末尾に要素を追加する関数
(defun add-to-last (lst elm)
(append lst (list elm)))
;; リストの末尾に要素の合計を追加する関数
(defun add-sum-to-last (lst)
(add-to-last lst (sum lst)))
;; 2次元リストの行を列に変換する関数
(defun transpose (mtx)
(apply #'mapcar #'list mtx))
;; 2次元リストを受けて合計を追加したリストを返す関数
(defun sum-matrix (mtx)
(transpose
(mapcar #'add-sum-to-last
(transpose
(mapcar #'add-sum-to-last mtx))))
;; 入力値
(setq input
'((9 85 92 20)
(68 25 80 55)
(43 96 71 73)
(43 19 20 87)
(95 66 73 62)))
;; 結果
(setq expected
'((9 85 92 20 206)
(68 25 80 55 228)
(43 96 71 73 283)
(43 19 20 87 169)
(95 66 73 62 296)
(258 291 336 297 1182)))
;; main
(equal expected (sum-matrix input))
;;=> T