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-03-22

L-99 (36)

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

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

P36

解答
;; Common Lisp
(load "prime-factors")

(defun prime-factors-mult (n)
  (do ((l (prime-factors n) (cdr l))
       (c 1 (if (eql (car l) prevl)
		(1+ c)
		1))
       (retlist '() (if (eql (car l) prevl)
			retlist
			`(,@retlist (,prevl ,c))))
       (prevl (gensym) (car l)))
      ((endp l) (cdr `(,@retlist (,prevl ,c))))))

;; Scheme
(use srfi-8)
(load "prime-factors")

(define prime-factors-mult
  (lambda (n)
    (let loop ((l (prime-factors n))
	       (c 1)
	       (retlist ())
	       (prevl #f))
      (if (null? l)
	  (cdr `(,@retlist (,prevl ,c)))
	  (receive (c1 retlist1)
		   (if (eqv? (car l) prevl)
		       (values (+ 1 c) retlist)
		       (values 1 `(,@retlist (,prevl ,c))))
		   (loop (cdr l)
			 c1
			 retlist1
			 (car l)))))))

今回のお題は、素因数分解の結果を、(3 3 5 7)という

形式ではなく、((3 2) (5 1) (7 1) )のように素数と出

現回数で構成されたリストにして返すというもの。

P12のencodeと、P35のprime-factorsの合成という感じ。