Comment detail

制限時間内のキー入力検査 (Nested Flatten)
お題の意図としては標準入力が必須ではないようですので、キーボードイベントをフックしました。
イベントハンドラーの親環境が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"))

Index

Feed

Other

Link

Pathtraq

loading...