スタバで自由課題
全員で昼のカレーを食べた後、興にまかせてスタバでさらにコード書きをしてみた。
「ピラミッドが一行で書けたー」というのを聞いて、お、それなら一行はともかくいけるかも? と思って、ピラミッドに挑戦。こういうのを表示させたい:
* *** ***** *******
その1(再帰)
で、うんうん唸ってなんとか動くようにしたのがこれ。
main = do putStr $ pyrStep 7 1 pyrStep :: Int -> Int -> String pyrStep 0 n = [] pyrStep m n = replicate (m - 1) ' ' ++ replicate (2 * n - 1) '*' ++ ['\n'] ++ pyrStep (m - 1) (n + 1)
再帰を使って、7段のピラミッドを表示する。改行文字をリストにしてなくて随分ハマってしまった。えらく型を意識させられるなぁ。
2つある引数を1つにできそうなのと、段数が埋め込みなのが気にいらない。
その2(一桁で段数指定)
引数の処理どこかで見たなぁ、と本を見返して、引数で段指定できるようにし(てみようとし)た版がこれ。合わせて、pyrStep を短かくするために、再帰を map に変更した。
import System import Char main = do args <- getArgs putStr $ concatMap (pyrStep $ argToInt args) [1..argToInt args] argToInt :: [String] -> Int argToInt str = digitToInt $ head $ head str pyrStep :: Int -> Int -> String pyrStep m n = replicate (m - n) ' ' ++ replicate (2 * n - 1) '*' ++ ['\n']
やっぱり引数が減らせない。のと、[String] で取得した引数を、バラして数字として使うのが大変だった。結局、引数リスト先頭の数字1文字だけを段数と見なすようになっている。
Char -> Int はあるけど、String -> Int が見つからないのよね……。ともあれこっちは宿題ということにして、15時過ぎくらいに撤収した。ちょっと甘えて引っ張りすぎたかな。