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 |

2007-01-24

L-99 (10)

| 00:29 | L-99 (10) - わだばLisperになる を含むブックマーク はてなブックマーク - L-99 (10) - わだばLisperになる

L-99 10問目に挑戦 - L-99:Ninety-Nine Lisp Problems

P10

解答
;;; Common Lisp
(defun encode (l &optional (c 0) (a (car l)))
  (cond ((null l) 
	 `((,c ,a)))
	((equal (car l) a) 
	 (encode (cdr l) (1+ c) (car l)))
	('t (cons 
	     (list c a) 
	     (encode (cdr l) 1 (car l))))))

;; Common Lisp - doを使ってみた版
(defun encode/do (list)
  (do ((l list (cdr l))
       (c 0 (1+ (if (equal (car l) a) c 0)))
       (a (car list) (car l))
       (r '() (if (equal (car l) a) 
		  r
		(append r `((,c ,a))))))
      ((null l) (append r `((,c ,a))))))

;;; Scheme
(define encode
  (lambda (l)
    (letrec ((encode1 
	      (lambda (l c a la)
		(if (null? l)
		    la
		    (if (equal? (car l) a)
			(encode1 (cdr l) (+ c 1) (car l) la)
			(encode1 (cdr l) 1 (car l) (append la `((,c ,a)))))))))
      (encode1 l 0 (car l) '()))))

今回CLは関数内関数ではなくて、ラムダリストパラメータ

を使ってみた。