44 lines
921 B
R
44 lines
921 B
R
blocks <- rbind(c("B","O"),
|
|
c("X","K"),
|
|
c("D","Q"),
|
|
c("C","P"),
|
|
c("N","A"),
|
|
c("G","T"),
|
|
c("R","E"),
|
|
c("T","G"),
|
|
c("Q","D"),
|
|
c("F","S"),
|
|
c("J","W"),
|
|
c("H","U"),
|
|
c("V","I"),
|
|
c("A","N"),
|
|
c("O","B"),
|
|
c("E","R"),
|
|
c("F","S"),
|
|
c("L","Y"),
|
|
c("P","C"),
|
|
c("Z","M"))
|
|
|
|
canMake <- function(x) {
|
|
x <- toupper(x)
|
|
used <- rep(FALSE, dim(blocks)[1L])
|
|
charList <- strsplit(x, character(0))
|
|
tryChars <- function(chars, pos, used, inUse=NA) {
|
|
if (pos > length(chars)) {
|
|
TRUE
|
|
} else {
|
|
used[inUse] <- TRUE
|
|
possible <- which(blocks == chars[pos] & !used, arr.ind=TRUE)[, 1L]
|
|
any(vapply(possible, function(possBlock) tryChars(chars, pos + 1, used, possBlock), logical(1)))
|
|
}
|
|
}
|
|
setNames(vapply(charList, tryChars, logical(1), 1L, used), x)
|
|
}
|
|
canMake(c("A",
|
|
"BARK",
|
|
"BOOK",
|
|
"TREAT",
|
|
"COMMON",
|
|
"SQUAD",
|
|
"CONFUSE"))
|