グレイコードの出力

30分プログラム、その627。anarchy golf - Gray code via はてなグループをやってみる。
最初は、2進数をずらずらと並べればいいと思ってたけれども、グレイコード - Wikipediaを読むとどうもそうではないらしい。
細かいことはよくわからなかったけれども、とりあえずv ^ (v >> 1)で生成できるらしいよ。
もともとはGOLFの問題だけど、そこにはこだわらない方向で。

使い方

$ python graycode.py
000
001
011
010
110
111
101
100

ソースコード

#! /usr/bin/python
# -*- mode:python; coding:utf-8 -*-
#
# graycode.py -
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/07/27 20:50:19
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

def to_graycode(v):
    return v ^ (v >> 1)

def str_binary(n):
    if n <= 1:
        yield str(n)
    else:
        for i in str_binary(n/2):
            yield i
        yield str(n%2)

def padding(width,char,n):
    l = len(n)
    if l >= width:
        return n
    else:
        return char * (width - l) + n

def graycode(n_bits):
    for v in xrange(0,2**n_bits):
        yield padding(n_bits,
                      '0',
                      "".join(str_binary(to_graycode(v))))

for g in graycode(3):
    print g