2011年09月08日

F#:どう書く?org 「制限時間内のキー入力検査」

   このエントリーをはてなブックマークに追加 Clip to Evernote

どう書く?org 「制限時間内のキー入力検査」 をF#で解いてみました。

ちょっと長いですが、そのまま引用させていただきます。

ユーザーの入力を検査する関数 InputCheckerを作成して 3回連続実行してください。
関数 InputCheckerは、以下の仕様を満たしてください。

引数に 時間(秒) Nと文字列 S を受け取ること。
ユーザからの標準入力とあらかじめ指定された S を比較し、 一致すれば「OK」、一致しなければ「NG」を標準出力へ出力すること。
ユーザーの入力がN秒以内に完了しなかった場合は、比較せず 「TIME OUT」を標準出力へ出力すること。
経過時間はユーザーが入力を開始した地点から計測すること。
ENTER キーの入力によってユーザー入力が完了したと仮定すること。
ユーザの入力が完了するまでは、完了を待ち続けること
たとえば、「InputCheker(5, "ABCDEF")」と指定した場合、 出力例はこんな感じです。

1. input(ABCDEF) =>ABCDEF<ENTER>
    1. result => OK
    2. result => NG
    3. result => TIME OUT

1. input(ABCDEF) =>

と出力して入力待ちをし、ユーザーが「ABCDEF<ENTER>」を入力したとき、 入力開始から5秒以内ならば「OK」、
5秒をこえていれば「TIME OUT」を出力します。 このとき、ユーザーがキーを押下しなければ1. を出力してから
たとえ10秒たっていても「TIME OUT」にはならないので注意してください。
時間計測はあくまでユーザーが入力を開始してからです。

 

入力が開始されたかどうかをどうやって判断するのかがわかれば、それほど難しくはありませんね。
Console.KeyAvailable プロパティで、その判断ができます。このプロパティが、trueになるまで繰り返し、待ちます。

キーが入力されたならば、ReadLineで 1行読み込み、Enterキーが押されるまでの時間を計測します。
制限時間をオーバーしていれば、"TIME OUT"を表示します。
制限時間内ならば、入力値と引数の値を比較し、"OK", "NG" のいずれかを表示します。

inputChecker関数では、制限時間と、比較する文字列を受け取ります。

あまり、F#らしい箇所がないので、C#プログラマーにも雰囲気で何をやっているかがわかると思います。

ENTERキーを押す前に、"TIME OUT"と表示するとなると、また違ったアプローチが必要ですね。
ReadLine じゃなくて、ReadKeyを使うことになるのかな?



 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52188510