我正在努力编写一个程序,该程序接受用户的字符输入,然后检查一个预设单词列表,该单词可以由给定的字符组成。它要求5个单独的字符,并根据这些字符创建一个列表,重复5次,总共25个字符。这意味着表示组合锁的功能,该组合锁具有5个单独的表盘,每个表盘包含5个字母。
征求意见并定义一些列表:`
letters <- list()
possible <- list()
for (i in 1:5){
var1 = as.character(readline(prompt = 'First Letter: '))
var2 = as.character(readline(prompt = 'Second Letter: '))
var3 = as.character(readline(prompt = 'Third Letter: '))
var4 = as.character(readline(prompt = 'Fourth Letter: '))
var5 = as.character(readline(prompt = 'Fifth Letter: '))
tmp <- list(var1, var2, var3, var4, var5)
letters <- tmp
}
`
key <- list(some 5 letter words)
有了这个程序,字符的顺序就很重要了。例如,如果第一组输入是(a,r,v,s,t(,我只想检查每个单词的第一个字母是否是其中之一。现在我只使用R(和一般的编码(大约一周了,所以如果我试图创建这个程序冒犯了那些更有经验的人,我很抱歉:
`
for (j in keys){
for (i in letters){
for (k in 1:5){
if (letters[[i]][k] %in% substr(keys[[j]], 1, 1){
possible <- rep(keys[[j]]
{
}
}
}
}
`
我碰到了一堵墙,不知道该怎么继续。我确信有更有效的方法可以做到这一点,但我完全陷入了困境。
虽然这个程序是围绕组合锁建模的,但我不打算用它来解决实际的组合锁。这只是一个思想实验,所以我可以进行一些编码练习
以下是我理解您的问题的有效解决方案:
find_possible_words = function(dictionary, n_dials) {
dials = character(n_dials)
for(i in 1:n_dials) {
dials[i] = readline(prompt = paste0("Please input the letters on dial #", i, " "))
}
regex_pattern = paste("[", dials, "]", sep = "", collapse = "")
grep(pattern = regex_pattern, x = dictionary, ignore.case = TRUE, value = TRUE)
}
find_possible_words(dictionary = c("cat", "dog", "rat", "try"), n_dials = 3)
# Please input the letters on dial #1 abcd
# Please input the letters on dial #2 aor
# Please input the letters on dial #3 tgb
# [1] "cat" "dog"
其主要思想是使用正则表达式来搜索字典。CCD_ 2的正则表达式模式匹配";x〃"y"z";,并且[xyz][abc]
的模式将匹配x或y或z,然后是a或b或c,依此类推。因此,我们将每个字母的选择放在方括号中,并将它们粘在一起,然后使用grep
在字典中查找与模式匹配的单词。