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-27

L-99 (11)

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

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

P11

解答
;;; Common Lisp
(defun encode-modified (list)
  (flet ((list-but-single (item count)
	   (if (= count 1)
	       item
	       (list count item))))
    (labels ((encode1 (l c a)
	       (cond ((null l) (cons (list-but-single a c) ()))
		     ((equal (car l) a) (encode1 (cdr l) (1+ c) (car l)))
		     ('t (cons (list-but-single a c)
			       (encode1 (cdr l) 1 (car l)))))))
      (encode1 list 0 (car list)))))

;; Common Lisp - doを使ってみた版
(defun encode-modified/do (list)
  (let ((r '())
	(c 0))
  (flet ((list-but-single (item count)
           (if (= count 1)
	       `(,item)
	     `((,count ,item)))))
    (do ((l list (cdr l))
	 (a (car list) (car l)))
	((null l) (append r (list-but-single a c)))
      (if (equal (car l) a)
	  (setq c (1+ c))
	(psetq c 1
	       r (append r (list-but-single a c))))))))

;;; Scheme
(define encode-modified
  (lambda (l)
    (let ((list-but-single 
	   (lambda (n l)
	     (if (= n 1)
		 `(,l)
		 `((,n ,l))))))
      (letrec ((encode1 
		(lambda (l xcar c item)
		  (cond ((null? l)
			 (append item (list-but-single c xcar)))
			((equal? (car l) xcar) 
			 (encode1 (cdr l) (car l) 
				  (+ c 1) item))
			(else 
			 (encode1 (cdr l) (car l) 
				  1 (append item (list-but-single c xcar))))))))
	(encode1 l (car l) 0 '())))))

何となく何がなんだか良く分からなくなってきた。