Haskell::GR-nの生成(その2)

g ∈{GR-n} で、[x | x <- g, x ≠ max(g)] ∈{GR-(n-1)} なのはGRの定義から自明なので、GR-(n-1)とn以上の自然数の間で直接組み合わせを生成するようにコードを書いてみる。

-- grs.hs
import System
import List
main :: IO ()
main = do { args <- getArgs
; let [n, m] = if length args == 2 then map read args else [4,20]
; putStrLn $ unwords $ map show $ take m $ gr n
}
gr :: Int -> [[Int]]
gr n
| n<1         = []
| n==1        = [[0]]
| n==2        = map (\x -> [0, x]) [1..]
| otherwise   = scanline (gr $ n - 1) 1
where
scanline :: [[Int]] -> Int -> [[Int]]
scanline gs m
| m<1             = []
| otherwise       = let {
gs1 = zip [n..(n+m-1)] $ map (\y -> gs !! y) $ reverse [0..(m-1)]
; gs2 = filter (\(x, gse) -> last gse < x) gs1
; gs3 = map (\(x, gse) -> gse ++ [x]) gs2
} in filter gr_p gs3 ++ (scanline gs $ m + 1)
where
gr_p :: [Int] -> Bool
gr_p ns = let ds = sort $ map (\(x,y) -> (ns !! y) - (ns !! x)) cs
in ds == nub ds
where
cs = [(x,y)|x<-[0..(n-2)],y<-[1..(n-1)],x<y]

--

これなら、GR-22でも先頭の10個を12秒程度で得られる(Celeron 1GHzなホストで確認)。
こんな素朴なコードでも結構計算できるもんだ。

クロノトリガーDS

特典無しを注文したら在庫無しでいつ入荷か不明だったのだが、昨日配達されちゃった。
自分的には年末頃に届けば、お正月にゆっくり実家で遊べるなぁとか思ってたのだが。

(がまんできなかったので、)とりあえず「ただいま」まで遊んだところでは、忠実に再現されている感じですね。

タッチペン対応とか、マルチスクリーン対応になっているがこのあたりは全然いらんなぁ。
普通に十字キーとボタンで十分すよ。それ以外の追加フィーチャーはまだわからんけど。

プレイして改めて思うのはもともとのゲームの完成度が非常に高いんだなぁということ。
ゲームシステム、難易度、音楽いずれも今時のゲームにも見習ってほしいレベル。

対象がライトゲーマ、やり込み派にも向いているところもいいよねぇ。