Open5

Codewars 演習記録 in Haskell

えとあるえとある

<8 kyu> Multiply

2つの数を引数に取る乗算関数 multiply を定義せよ。

題意はどちらかというと「そのままの状態だとうまく動作しないから、解答する言語仕様に合うように直してね」という感じで、Codewars ではチュートリアル的な問題として有名?

2つ解答してみた。個人的には2つ目の方が Haskell っぽくて好き。

解答例1(仮引数を置くパターン)
multiply :: Int -> Int -> Int
multiply a b = a * b
解答例2(ポイントフリースタイル)
multiply :: Int -> Int -> Int
multiply = (*)
えとあるえとある

<8 kyu> Convert a String to a Number!

数値としてパース可能な文字列を数値型に変換する関数 stringToNumber を作成せよ。ただし与えられる文字列は負数も含み、かつ常に数値として有効な文字列のみが与えられるものとする。

💡Hint: show の逆っぽいことをやるには…?

解答例1(返り値の型を指定するパターン)
stringToNumber :: String -> Integer
stringToNumber s = read s :: Integer
解答例2(関数の型を指定するパターン)
stringToNumber :: String -> Integer
stringToNumber = read :: String -> Integer

型指定せず単に read でもイケるっぽい。その場合の変換先の方は自動で推論される…?

解答例3(返り値の型を推論させるパターン)
stringToNumber :: String -> Integer
stringToNumber s = read s + 0
えとあるえとある

<7 kyu> Waiting room

題意要約:

ある待合室には 1 から n までの番号が振られた n 脚の椅子が置かれていて、利用者は以下のルールに従って順番に席に座っていく。

  • 既に座っている人からなるべく距離(間隔)の空いた椅子に座る
  • 他の人との間隔が同じ席が複数ある場合、その中で入り口に近い(=番号の若い)椅子に座る

椅子の数 n (> 2) を引数として、この待合室が満席となるときに最後に埋まる席番号を返す関数 lastChair を実装せよ。

Rust で解いたとき の思索を経ているので、求める計算結果は分かっている。さて、Haskell ではどう書こうか?

解答例

せっかくなので IntOrd 型のクラスであることを利用したポイントフリースタイルで書いてみた。succ の逆は pred だそうです。

lastChair :: Int -> Int
lastChair = pred