iterate

アルファベットの繰り上がりです。ZZ→AAAに対応したかったのですが良い方法が考えられませんでした。

import Char
import List

main = putStr $ concat $ List.intersperse ", " $ take 100 $ map toAlphaStr [1..]

toAlphaStr :: Int -> String
toAlphaStr n = let (x, y) = divMod (n-1) 26
               in if x > 0 then [toAlpha (x-1)] ++ [toAlpha y] else [toAlpha y]

toAlpha :: Int -> Char
toAlpha n = Char.chr(n + 65)

投稿されているものを見るとiterateを使っているものを発見、iterateを知らなかったので自分でも書いてみました。

import Char
import List

main = putStr $ concat $ List.intersperse ", "  $ take 100 $ iterate next "A"

next :: String -> String
next [] = "A"
next s = let r = reverse s
             h = head r -- 一桁目
             u = (reverse.tail) r -- 二桁目以降
         in if h == 'Z'
              then next(u) ++ "A"
              else u ++ [Char.chr(Char.ord(h) + 1)]

これは何回もreverseしていて無駄な感じがしますが、投稿されていたものはreverseの回数を抑えていました。