Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2009-05-17

「15分でコーディング」を18分で

22:32 | 「15分でコーディング」を18分で - わだばLisperになる を含むブックマーク はてなブックマーク - 「15分でコーディング」を18分で - わだばLisperになる

一部で地味流行りつつあるので自分もまたやってみました。

とりあえず、問題を読んでノープランでコーディングを始めたんですが、どんどん後半にツケが回ってきて辻褄合せに必死なコードになりました(笑)

それでも3分位超過。果して時間内に解ける日は来るのか!

(defun who-can-see (user-names allowed-data report-data)
  (let ((ht (make-hash-table :test #'equal)))
    (mapc (lambda (u a)
            (setf (gethash u ht) (ppcre:split " " a)))
          user-names
          allowed-data)
    (if (null (cdr report-data))
        (let (ans)
          (mapc (lambda (r)
                  (maphash (lambda (k v)
                             (when (member r v :test #'equal)
                               (push k ans)))
                           ht)
                  ans)
                report-data)
          ans)
        (apply #'intersection 
               (mapcar (lambda (r)
                         (let (ans)
                           (maphash (lambda (k v)
                                      (when (member r v :test #'equal)
                                        (push k ans)))
                                    ht)
                           ans))
                       report-data)))))

一応OKみたいですが…

(who-can-see '("joe" "nick" "ted")
             '("clients products" "products orders" "clients orders")
             '("clients" "products"))
;=> ("joe")

(who-can-see
 '("kathy"  "john"  "dan"  "steve"  "cheryl"  "tony")
 '("users data"  "data orders"  "users permissions"  "system users controls"  "default"  "admin users")
 '("users"))
;=> ("kathy" "dan" "steve" "tony")

(who-can-see
 '("jim"  "scott"  "barbara")
 '("users order products"  "products shipping"  "tracking products orders")
 '("admin"))
;=> NIL

上のはちょっと酷いのでもう一回alistでだらだら書きました。

こういうのはあせらず最初に良く考えてから取り組んだ方が良いんでしょうなー。

(defun who-can-see (user-names allowed-data report-data)
  (let ((data (mapcar (lambda (u a) (cons u (ppcre:split #\Space a))) 
                      user-names 
                      allowed-data)))
    (labels ((pick (rd ad)
               (if (endp rd)
                   ad
                   (pick (cdr rd) 
                         (remove-if-not (lambda (a)
                                          (member (car rd) (cdr a) :test #'equal))
                                        ad)))))
      (mapcar #'car (pick report-data data)))))

のsubsetpを使うというのは思い付きませんでした。これはsubsetpがぴったりはまった用法ですね!

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20090517