キミならどう書く 2.0 - ROUND 2 -

日記のネタによさげなものがあったので書いてみる。
とりあえず何も考えずに書いてみたバージョン。


import System
import List

main = do args <- getArgs
print $ h $ read (head args)

h :: Int -> Int
h n = let gs = concatMap (\x -> [g(x)]) [1 .. n]
in case elemIndex (maximum gs) gs of
Just n -> n + 1
Nothing -> 0

g :: Int -> Int
g n = countStep 1 n
where
countStep :: Int -> Int -> Int
countStep counter index
| index == 1 = counter
| even index = countStep (counter + 1) (index `div` 2)
| otherwise = countStep (counter + 1) (3 * index + 1)

「なんかHaskellっぽくなくね?」という意見もあるがキニシナイ。
これをcollatz.hsとでもしてコンパイルして実行。


$ collatz 100
97

$ collatz 1000
871

他の人のを見る限り、とりあえず合ってはいるようだ(こんなの手で計算確認したくない)
他言語バージョンや最適化バージョンはまた後日。