Hatena::Groupcadr

kozima の日記

2009-05-15

「10分でコーディング」やってみた

20:42

http://ameblo.jp/programming/entry-10001721422.html やってみました。i 番目の人に配られる j 枚目のカードは、全体の n * j + i 番目のカード、ということがわかればすぐにできますね。ただ、気を抜いてケアレスミスしがちなタイプの問題かな。

とりあえず最初に思いついたアルゴリズムをささっと書いてみたコード。ちなみに最初 floor引数の順番間違えました。

(defun deal (n deck)
  (loop for i below n collect
    (coerce (loop for j below (floor (length deck) n)
              collect (aref deck (+ (* n j) i)))
            'string)))

正確に測ってませんけど、問題文読み始めてからすべての例について正しい答えが返ることを確認するまでだいたい 3±1 分ぐらい。

説明付き

なんとなく、何を考えて書いたのか思い出しながら説明をする試み。

(defun deal (n deck)

トランプを配る関数を書くよ。引数の n は人数で、deck がカードの文字列だよ。

  (loop for i below n collect

n 人それぞれに配られるべきカードを順番に計算してリストにするよ。

    (coerce ... 'string)

文字列ってループじゃ作りにくいんだよね。 i さんに配るカードをループで集めたいんだけど……まあ collect でリストにしといて型変換するか。

            (loop for j below (floor (length deck) n)

上の ... の部分その一。とりあえず一人当たりのカードの枚数は (全体の枚数/人数) で余りは切捨てだから、それだけループを回せばいいはずだ。

              collect (aref deck (+ (* n j) i)))

その二。 i, n + i, 2n + i, ... 番目のカードを順番に集める。

おわり。