競技プログラミングのためのF#入門
文字列がもっと長いと気になってはくるものの, (末尾再帰ではない)再帰でさっと書いてしまえばいいでしょう. HaskellではfoldM
などで豪快な処理が書けるものの, (今の私のF#の腕前では)シンプルな移植ができないのも理由の一つです.
計算用の再帰関数は次のように実装できます.
1 2 3 |
|
入力の文字列を一桁数値のリストに変換する処理は次のように書けます.
1 |
|
ここで1
を単にint64 c
だけにすると49L
が返ってきてはまり倒します. 上のようにint64 '0'
を引いて整数として1L
が返るようにするか, c |> string |> int64
のように文字列にしてからint64
を通しましょう. 例を見るとわかるようにInt32
の範囲を飛び越えるため, オーバーフロー対策でInt64
を使うのは必須です.
逐次計算していくのではなく, いったん文字列から必要な数を切り出す(ベキ集合を作る)タイプの実装でHaskellコードを見ると, replicateM
を使ってブーリアンのベキ集合を使ってどの文字を取ってくるか判定しています. Reference.fsxをreplicateM
かベキ集合
で検索すれば対応する関数のリスト版実装があります. これを参考にHaskellコードの移植を考えてもいいでしょう.