あどけない話

インターネットに関する技術的な話など

横向きのピラミッドを作る

LL Futureの「キミならどう書く?」に出題されている問8を Haskell で解いてみます。

与えられた自然数 n について、横向きで n 段のピラミッドを作ってください。たとえば、 n に 4 が与えられた場合は以下のようなピラミッドを作ります。
*
**
***
****
***
**
*
与える自然数についてはリテラルで与える、標準入力で与える、引数で与えるなどは自由とします。

これは、[1,2,3,4,3,2,1] という整数の列を作る問題と等価です。

このセッションでは、すべての桁が 1 である数値を二乗して解く方法が紹介されていました。

1 → 1
11 → 121
111 → 12321
1111 → 1234321

この方法を Haskell で実装してみましたが、Haskell では数値と文字列が厳密に区別されているので、すっきりとは書けませんでした。そもそも、この方法には桁溢れの問題もあるので、会場で感じた程、素敵な方法ではないと思いました。

そこで、素直に Haskell で書くことにしました。[1,2,3,4,3,2,1] を生成するのは、こんなに簡単に書けます。

incdec n = [1..n] ++ [n-1,n-2..1]
incdec 4 → [1,2,3,4,3,2,1]

次に、文字 '*' を n 個くっ付けて文字列を作る関数を書きます。Perl の "x" 演算子に相当します。

x c n = take n $ repeat c
'*' `x` 4"****"

というわけで、pyramid ができました。

pyramid n = mapM_ putStrLn $ map ('*' `x`) $ incdec n
pyramid 4*
**
***
****
***
**
*