制限時間内のキー入力検査
Posted feedbacks - R
お題の意図としては標準入力が必須ではないようですので、キーボードイベントをフックしました。 イベントハンドラーの親環境がGlobalEnvになってしまってInputChekerの変数を触れないため、 強制的にハンドラーの親環境をInputChekerにセットしています。 (Rの作法に反するか分かりませんが、そもそもRでこういうコードを書くことはないでしょう・・・) > replicate(3, InputCheker(5, "ABCDEF")) input(ABCDEF) => input(ABCDEF) => input(ABCDEF) => [1] "OK" "NG" "TIME OUT"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | keybd <- function(key){
if(!as.logical(start)) start <<- Sys.time()
if(key == "ctrl-J") return(end <<- Sys.time()) # Enter is handled as Ctrl-J
str <<- c(str, key)
return(NULL) # loop until a non-NULL value is returned
}
InputCheker <- function(n, s){
start <- 0
end <- 0
str <- character(0)
env.old=environment(keybd)
environment(keybd) <- new.env(parent=environment())
getGraphicsEvent(paste("input(", s, ") =>", sep=""), onKeybd=keybd)
dev.off()
environment(keybd) <- env.old
if(end - start > n) return("TIME OUT")
return(ifelse((paste(str, collapse="") == s), "OK", "NG"))
}
replicate(3, InputCheker(5, "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 ]