Introduction

ブログ内検索

  • このサイトの記事を検索 by Google

おすすめの一冊!

無料ブログはココログ

« 10分でコーディング | トップページ | ぐりもん on Google Chrome »

2009-12-22

topcoder はとおい

先日やってみた「Topcoder の道」の別の問題にチャレンジ。

やっぱり xyzzy (Common Lisp) です。
主に文字列操作の練習になった感じです。


    -・-        -・-        -・-        -・-


■ その1

文字列を rorate してみなさい、という問題です。

 ⇒ 問題はこちら

書いてみたコードが↓

(let* ((table "ABCDEFGHIJKLMNOPQRSTUVWXYZ") (table-size (length table))) (labels ((rotate-left (c num) (let ((org (position c table))) (if (>= org num) (char table (- org num)) (char table (- table-size (mod (- num org) table-size))))))) (defun foo (str num) (coerce (mapcar #'(lambda (c) (rotate-left c num)) (coerce str 'list)) 'string))))
まぁ、なにもひねらずに書くとこんな感じじゃないかと思われます。 目標時間の10分はちょっとオーバーしてしまいましたが。 いちおう、動きます。
(foo "VQREQFGT" 2) "TOPCODER" (foo "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 10) "QRSTUVWXYZABCDEFGHIJKLMNOP" (foo "TOPCODER" 0) "TOPCODER" (foo "LIPPSASVPH" 4) "HELLOWORLD"
-・- -・- -・- -・- ■ その2 条件を満たす要素をリストから抽出するという問題。   ⇒ 問題はこちら 書いてみたコードが↓
(defun find-user (names perms reports) (let ((table (map0-n #'(lambda (index) (cons (elt names index) (split-string (elt perms index) #\ ))) (1- (length names))))) (labels ((is-allowed (name report) (find report (cdr (assoc name table)) :test #'equal)) (filter (reports candidate) (if (null reports) candidate (mapcan #'(lambda (name) (if (is-allowed name (car reports)) (list name) nil)) (filter (cdr reports) candidate))))) (filter reports names))))
labels でローカル変数を思いつくままに定義しちゃっているので、 あまりよろしくないコードな気がします。 時間も15分をオーバーしちゃいました。 でも、いちおう動きます。
(find-user '("joe" "nick" "ted") '("clients products" "products orders" "clients orders") '("clients" "products")) ("joe") (find-user '("kathy" "john" "dan" "steve" "cheryl" "tony") '("users data" "data orders" "users permissions" "system users controls" "default" "admin users") '("users")) ("kathy" "dan" "steve" "tony") (find-user '("jim" "scott" "barbara") '("users order products" "products shipping" "tracking products orders") '("admin")) nil
敗因は、組み込み関数の split-string を知らずに手書きし始めてしまったこと。 こんな基本的な操作は提供されてるのが当然ですよね・・・

« 10分でコーディング | トップページ | ぐりもん on Google Chrome »