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 (37)

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

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

P37

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

(defun phi (m)
  (apply #'*
	 (mapcar #'(lambda (list) 
		     (destructuring-bind (p m)
			 list
		       (* (1- p) (expt p (1- m)))))
		 (prime-factors-mult m))))

;; Scheme
(use util.match)
(load "prime-factors-mult")

(define phi
  (lambda (m)
    (let loop ((ls (prime-factors-mult m))
	       (retval 1))
      (if (null? ls)
	  retval
	  (loop (cdr ls)
		(* retval (match-let (((p m) (car ls)))
				     (* (- p 1) (expt p (- m 1))))))))))

前に作成したφ関数の進化版を実装するのが今回のお題。

前回の問題は、今回の前振りだった様子。

scheme版は、mapだと面白くないかなと思って、無理に

ループにしてみた。

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の合成という感じ。