携帯の入力的なアレ
Noahです。
授業後に後輩と演習室で話し込んでたときに、ふと彼がAOJの問題をC++で解き始めたのでその隣で同じ問題をHaskellで実装してました
もともと競プロをやっていたとかではなくて、純粋にHaskellを書きたかっただけです。はい。
Revisionを見ると分かるんですけど、最初は愚直な実装をしてて、
toChar :: Char -> Int -> Char toChar x n = case x of '1' -> solve1 n '2' -> solve2 n '3' -> solve3 n '4' -> solve4 n '5' -> solve5 n '6' -> solve6 n '7' -> solve7 n '8' -> solve8 n '9' -> solve9 n solve1 :: Int -> Char solve1 1 = '.' solve1 n = iSolve1 n '.' where iSolve1 1 s = s iSolve1 n s = case s of '.' -> iSolve1 (n-1) ',' ',' -> iSolve1 (n-1) '!' '!' -> iSolve1 (n-1) '?' '?' -> iSolve1 (n-1) ' ' ' ' -> iSolve1 (n-1) '.' solve2 ...
なんていうコードを solve9
までやるという愚直ぶりだったのですが、後に
preset :: []String preset = [".,!? ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"] toChar :: Char -> Int -> Char toChar x n = solveEx (n - 1) $ preset !! (ord x - ord '0' - 1) solveEx :: Int -> [Char] -> Char solveEx n xs = xs !! (n `mod` length xs)
とすることで、愚直な実装を回避することができました🎉
最近仕事でGolangしか書いていないので、他の言語を触る機会がほぼほぼなかったので新鮮な気分だった👀