Open Source WEB

2006-07-18 [Haskell] 入試問題(その 2)

2006-07-14の問題で,状態遷移関数の番号から,実際に 状態遷移関数を構成するプログラムがあると便利かも.というわけで作成して みた.

type Fun a b = a -> b                        -- 関数

add :: Eq a => a -> b -> Fun a b -> Fun a b  -- 対応の追加
add x y f k = if x == k then y else f k

type StateFun = Fun (Int,Int,Int) Int        -- 状態遷移関数の型

gen :: Int -> StateFun                       -- 状態遷移関数の生成関数
gen n = foldr (uncurry add) (error "out of domain") (zip domain (conv 8 n))

conv :: Int -> Int -> [Int]                  -- 整数の二進数表現
conv d n = reverse $ take d $ map snd $ iterate f dm
  where dm      = divMod n 2
        f (d,_) = divMod d 2

domain :: [(Int,Int,Int)]                    -- 状態遷移関数の定義域
domain =  map (toTriple . conv 3) [7,6..0]
  where toTriple [x,y,z] = (x,y,z)

255 番の状態遷移関数は gen 255 で作れる.これで domain をマップすれば [1,1,1,1,1,1,1,1] なるだろう.また,gen 94 で domain をマップすれば [0,1,0,1,1,1,1,0] になるはず.

*Main> map (gen 255) domain
[1,1,1,1,1,1,1,1]
*Main> map (gen 94) domain
[0,1,0,1,1,1,1,0]

パチパチ

--nobsun


Name:
Comment:

There is no comment.

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us