10分でカード配りな!

10分でコーディング | プログラミングに自信があるやつこい!!


via トランプを配る - 日々ごちゃごちゃと考える


ということで、気軽に作ってみた。

(defun deal (num cards)
  (let ((x 0)
        (l (make-list num)))
    (dolist (a (coerce (subseq cards 0 (* num (floor (length cards) num))) 'list))
      (push a (elt l x))
      (setq x (mod (1+ x) num)))
    (mapcar (lambda (x) (coerce (reverse x) 'string)) l)))

所要時間問題は問題読む時間込み(5分くらい^^;)で9分45秒ほど。ぎりぎり合格か。時間内にテスト2回しかしてないけど、問題はないはず。

(deal 2 "12121212")
|("1111" "2222")
(deal 3 "12345678")
|("14" "25" "36")
(deal 3 "")
|("" "" "")
(deal 9 "12345678")
|("" "" "" "" "" "" "" "" "")

文字列だと面倒くさいからリストにしてー、余る部分はループ前に省いてー、配った後のリストは先に用意してー、返すときは文字列に戻してー、ひっくり返ってるからそれも直してー、という感じで作った。説明はいまいち苦手だ。


その後、あまりエレガントではないので、再帰で書いたらきれいになりそうだと思って考えたのだが、いい方法が思い浮かばなかった。時間を決めて適当に書いた方が作業がはかどるようだ。