2008/07/21

競速 Reprise

承接兩年前的 C/C++/Java/Ruby 大亂鬥,這次我寫了 Haskell 版本:


 1: import Control.Monad.State
 2: 
 3: cycleLength 1 k = k
 4: cycleLength n k | even n    = cycleLength (n `div` 2) $! (k + 1)
 5:                 | otherwise = cycleLength (3 * n + 1) $! (k + 1)
 6: 
 7: driver :: State [Int] (IO ())
 8: driver = do eof <- gets null
 9:             if eof then return (return ())
10:                    else do this <- commit
11:                            remains <- driver
12:                            return (this >> remains)
13: 
14: commit :: State [Int] (IO ())
15: commit = do i <- nextInt
16:             j <- nextInt
17:             return $ print
18:               (maximum . map (flip cycleLength 1) $ [min i j .. max i j])
19:          where nextInt = State $ \(x : xs) -> (x, xs)
20: 
21: main = getContents >>= evalState driver . map read . words
用 ghc 編譯並開 -O 最佳化,執行時間大約是 1.1 秒,是 C++ 版本的 5 倍多。其實還勉強可以接受啦 XD。(偏心?XD)至於程式碼我覺得有一點點彆扭,總覺得 IO monad 和 State monad 沒有搭配得很好。

--
現在在讀 Real World Haskell 的線上 beta 版

Labels:

Blogger yen37/21/2008 3:59 pm 說:

看的出來有偏心...XD

 
Blogger Thundermyth O.7/21/2008 4:51 pm 說:

看到這篇我突然想起一件事…

"Fundamental C++"

我應該沒記錯書名吧 XD

 
Blogger Josh Ko7/21/2008 4:55 pm 說:

現在可以正式回應了:因為後來譯了《C++ Primer》4/e,覺得我想達成的目標都已經被它達成了,所以就不用重造輪子啦 XD。

 

<< 回到主頁