6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

「Ruby力向上のための基礎トレーニング」をCommon Lispで解いてみた

Last updated at Posted at 2015-04-05

はじめに

「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  

6
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?