スタバで自由課題

全員で昼のカレーを食べた後、興にまかせてスタバでさらにコード書きをしてみた。

「ピラミッドが一行で書けたー」というのを聞いて、お、それなら一行はともかくいけるかも? と思って、ピラミッドに挑戦。こういうのを表示させたい:

    *
   ***
  *****
 *******

その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時過ぎくらいに撤収した。ちょっと甘えて引っ張りすぎたかな。