二進数表記に変換してみる

30分プログラム、その568。整数を'+'と' 'の二進数表記に変換してみる。
素数の二進法表記 - 西尾泰和のはてなダイアリー

                                    +
                                    + +
                                  +   +
                                  + + +

というよく分からない記号が書いてあった。
最初はさっぱり意味が分からなかったけど、よくよく考えていみると、立っているビットを'+'で表現していることに気がついた。
というわけで、これをやってみよう。無駄にShowクラスを使ってしまった。

使い方

*Main> fixWidth 8 $ toBinary 3
      ++
*Main> mapM_ (putStrLn.show) $ map (fixWidth 8 . toBinary) [1..8]
       +
      +
      ++
     +
     + +
     ++
     +++
    +

ソースコード

import Data.Bits
newtype Binary = Binary [Bool]

toBinary :: Int -> Binary
toBinary n = Binary $ iter [] n
    where
      iter xs 0 = False:xs
      iter xs 1 = True:xs
      iter xs n = iter (testBit n 0 : xs) $ n `shiftR` 1

fixWidth :: Int -> Binary -> Binary
fixWidth n (Binary xs) = Binary $ replicate (n - length xs) False ++ xs

instance Show Binary where
    show (Binary xs) = map (\b -> if b then '+' else ' ') xs