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

L-99 (49)

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

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

P49

解答
;;; Common Lisp
(defun bin->gray (n)
  (logxor (ash n -1) n))

(defun nbit-gray (n)
  (do ((i 0 (1+ i))
       (retlst '() `(,@retlst ,(format nil (format nil "~~~d,'0b" n) (bin->gray i)))))
      ((= i (expt 2 n) retlst))))

;;; Scheme
(define (bin->gray n)
  (logxor (ash n -1) n))

(define (nbit-gray n)
  (let loop ((i 0) (retlst '()))
    (if (= i (expt 2 n))
	retlst
	(loop (1+ i)
	      `(,@retlst ,(format #f (format #f "~~~d,'0b" n) (bin->gray i)))))))

今回のお題は、2進数値->グレイコードへの変換。グレ

イコードが何だか分からなかったので、調べつつ作成。

グレイコードには面白い特徴があるっぽい。この問題集

は色々ためになるな。

参考にしたページに2進数値からの変換は、右ビットシ

フトしてXORを取れば良いとあったのでそのままお気軽

に実装。

なんとなく問題の意図を無視してしまっている気はすれ

ど良しとしよう。

また、キャッシュを取って効率を上げる点についても、

今回の方法だと成り立つような成り立たないような。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20070404