2010/06/26

Series で L-99 P09-11

pack はもうちょっと何とかなりそうなんだけどね。

;; P09 (**) Pack consecutive duplicates of list elements into sublists.
;; If a list contains repeated elements they should be placed in separate sublists.
;;
;; Example:
;; * (pack '(a a a a b c c a a d e e e e))
;; ((A A A A) (B) (C C) (A A) (D) (E E E E))
(defun pack (x)
(%pack (catenate x (scan (list (gensym)))))) ; #z(a b c) => #z(a b c #:G1)
(defun %pack (x &aux acc)
(choose
(mapping ((a x)
(b (previous x (collect-first x))))
(if (eql a b)
(progn (push a acc) nil)
(prog1 acc
(setf acc (list a)))))))
(pack #z(a a a a b c c a a d e e e e))


;; P10 (*) Run-length encoding of a list.
;; Use the result of problem P09 to implement the so-called run-length encoding data compression method. Consecutive duplicates of elements are encoded as lists (N E) where N is the number of duplicates of the element E.
;;
;; Example:
;; * (encode '(a a a a b c c a a d e e e e))
;; ((4 A) (1 B) (2 C) (2 A) (1 D)(4 E))
(defun encode (x)
(#M(lambda (x) (list (length x) (car x)))
(pack x)))
(encode #z(a a a a b c c a a d e e e e))


;; P11 (*) Modified run-length encoding.
;; Modify the result of problem P10 in such a way that if an element has no duplicates it is simply copied into the result list. Only elements with duplicates are transferred as (N E) lists.
;;
;; Example:
;; * (encode-modified '(a a a a b c c a a d e e e e))
;; ((4 A) B (2 C) (2 A) D (4 E))
(defun encode-modified (x)
(mapping ((e (pack x)))
(let ((length (length e))
(car (car e)))
(if (= 1 length)
car
(list length car)))))
(encode-modified #z(a a a a b c c a a d e e e e))

Series で L-99 P07-08

夏風邪だかリンゴ病だかですっかり体調と生活のリズムを崩していたが、そろそろ戻さないと。リハビリがてらに Series で L-99 を。

Common Lisp には flatten がなく Series には scan-lists-of-lists-fringe がある。これが Series の好きなところの一つ。

previous は一つ前の値を必要とする際のパターンで、2番目の引数に最初の穴を埋める値を指定できる。

(#Meql ...)(map-fn t #'eql ...) に同じ((series::install) が必要)。

;; P07 (**) Flatten a nested list structure.
;; Transform a list, possibly holding lists as elements into a `flat' list by replacing each list with its elements (recursively).
;;
;; Example:
;; * (my-flatten '(a (b (c d) e)))
;; (A B C D E)
;;
;; Hint: Use the predefined functions list and append.
;; しかたない、入力はリストで。
(defun my-flatten (x)
(scan-lists-of-lists-fringe x))
(my-flatten '(a (b (c d) e)))


;; P08 (**) Eliminate consecutive duplicates of list elements.
;; If a list contains repeated elements they should be replaced with a single copy of the element. The order of the elements should not be changed.
;;
;; Example:
;; * (compress '(a a a a b c c a a d e e e e))
;; (A B C A D E)
(defun compress (x)
(choose (#Mnot (#Meql x (previous x (gensym)))) x))
(compress #z(a a a a b c c a a d e e e e))
(compress #z(nil nil a a a a b c c a a d e e e e))

2010/06/20

Series で L-99 P06

これも reverse 依存としてしまったから、華麗さがない。

;; P06 (*) Find out whether a list is a palindrome.
;; A palindrome can be read forward or backward; e.g. (x a m a x).
(defun palindrome-p (x)
(collect-and
(mapping ((a x)
(b (scan (collect-fn t
(constantly nil)
#'(lambda (x y) (cons y x))
x))))
(eql a b))))
(palindrome-p #z(x a m a x))

2010/06/19

Series で L-99 P01-P05

おとなしく、やってみることにする。

(eval-when (:compile-toplevel :load-toplevel :execute)
(require :series))
(eval-when (:compile-toplevel :load-toplevel :execute)
(series::install))

;; L-99: Ninety-Nine Lisp Problems
;; Based on a Prolog problem list by werner.hett@hti.bfh.ch
;; Working with lists
;; P01 (*) Find the last box of a list.
;; Example:
;; * (my-last '(a b c d))
;; (D)
(defun my-last (x)
(collect-last x))
(my-last #z(a b c d))


;; P02 (*) Find the last but one box of a list.
;; Example:
;; * (my-but-last '(a b c d))
;; (C D)
(defun my-but-last (x)
(subseries x (- (collect-length x) 1)))
(my-but-last #z(a b c d)) ;; => #Z(D)


;; P03 (*) Find the K'th element of a list.
;; The first element in the list is number 1.
;; Example:
;; * (element-at '(a b c d e) 3)
;; C
(defun element-at (x n)
(collect-nth (1- n) x))
(element-at #z(a b c d e) 3)


;; P04 (*) Find the number of elements of a list.
(collect-length #z(a b c d))


;; P05 (*) Reverse a list.
(defun my-reverse (x)
(scan (reverse (collect x)))) ; これはひどい
(my-reverse #z(a b c d))

Series で sort や reverse はどうするんだろう?ストリーム的なところになじまないということだろうか。

2010/06/16

Stumpwm のときのネットワーク設定

gnome-panel とか nm-applet とか使いたくないと思ってたけど、どうすればいいかよく分からなかった。

NetworkManager を活用する - いますぐ実践! Linuxシステム管理 / Vol.173 にヒントがあった。

まず普通に Gnome でログインして、「システム」→「設定」→ 「ネットワーク接続(Network Connections)」といき、目的の接続を選らんで "Available to all users" にチェックを付けておく。

以上で、Stumpwm のときも全てうまくいくようになった。ありがとう。

2010/06/06

シミュレーションバレエコンペティション

ここ数ヶ月、毎日お母さんに怒鳴られながらバレエの練習にはげんできた娘。上手だった。

初のコンクールだというのに全く緊張しなかったらしい。「本番が一番楽しかった」と。素晴しい。ま、どこかのネジが抜け落ちているような気もするが。

さて、次はどうするかね。お父さんもがんばらないとな。

2010/06/05

ANSI Common Lisp (gethash に push)

ポール グレアム の ANSI Common Lisp をひさしぶりに読んでいるんだけど、おもしろいな。

知らないことがいっぱいでてくる。 gethash にいきなり push できるとか。

(setf hash (make-hash-table))

(push 1 (gethash 'a hash))
(push 2 (gethash 'a hash))
(gethash 'a hash)
;; => (2 1)

もうちょっと setf について考えた方がいいのかもしれないw