制限時間内のキー入力検査
Posted feedbacks - Smalltalk
Squeak Smalltalk で。
残念ながら Squeak Smalltalk には自身の標準入力やホスト OS のそれとの連携といった概念が(少なくともデフォルト状態では…)ないので、マウスポインタ付近にプロンプトを表示して入力を促すことで対応させていただきました。標準入出力のしかたを問うことが題意でしたら、どうぞあしからず。
残念ながら Squeak Smalltalk には自身の標準入力やホスト OS のそれとの連携といった概念が(少なくともデフォルト状態では…)ないので、マウスポインタ付近にプロンプトを表示して入力を促すことで対応させていただきました。標準入出力のしかたを問うことが題意でしたら、どうぞあしからず。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | | inputChecker |
inputChecker := [:timeLimitSec :expecStr |
| char stream start resultMsg initPosition |
stream := WriteStream with: 'input(', expecStr, ') => '.
initPosition := stream position.
start := nil.
[ stream contents, ' ' displayAt: Sensor cursorPoint + 10 asPoint.
[Sensor keyboardPressed] whileFalse.
(char := Sensor keyboard) = Character cr
] whileFalse: [
start ifNil: [start := Time millisecondClockValue].
char == Character backspace
ifTrue: [stream position: (stream position - 1 max: initPosition)]
ifFalse: [stream nextPut: char]].
resultMsg := (Time millisecondClockValue - start) / 1.0e3 <= timeLimitSec
ifFalse: ['TIME OUT']
ifTrue: [(stream contents last: expecStr size) = expecStr
ifTrue: ['OK'] ifFalse: ['NG']].
#result -> resultMsg].
inputChecker value: 5 value: 'ABCDEF'
|


raynstard
#3420()
Rating0/2=0.00
関数 InputCheckerは、以下の仕様を満たしてください。
たとえば、「InputCheker(5, "ABCDEF")」と指定した場合、 出力例はこんな感じです。
1. input(ABCDEF) =>と出力して入力待ちをし、ユーザーが「ABCDEF<ENTER>」を入力したとき、 入力開始から5秒以内ならば「OK」、5秒をこえていれば「TIME OUT」を出力します。 このとき、ユーザーがキーを押下しなければ1. を出力してから たとえ10秒たっていても「TIME OUT」にはならないので注意してください。 時間計測はあくまでユーザーが入力を開始してからです。
このお題はraynstardさんの投稿です。ご協力ありがとうございます。
[ reply ]