我需要使用Lua的游戏服务器..
我希望能够保存名称的所有组合 到一个字符串,然后可以用于:
if exists (string)
示例:
ABC_-123
aBC_-123
AbC_-123
ABc_-123
abC_-123
等
在游戏中只有数字,字母和_ -
。可以用作名字。
(A_B-C, A-B.C, AB_8 ... etc)
我理解我不知道如何编写代码的逻辑:D
0-Lower
1-Upper
然后
000
001
等
答案 0 :(得分:1)
您可以使用递归生成器。第一个参数包含到目前为止生成的字符串的左侧部分,第二个参数是原始字符串的剩余右侧部分。
function combinations(s1, s2)
if s2:len() > 0 then
local c = s2:sub(1, 1)
local l = c:lower()
local u = c:upper()
if l == u then
combinations(s1 .. c, s2:sub(2))
else
combinations(s1 .. l, s2:sub(2))
combinations(s1 .. u, s2:sub(2))
end
else
print(s1)
end
end
因此以这种方式调用函数。
combinations("", "ABC_-123")
您只需存储中间结果而不是打印它们。
答案 1 :(得分:0)
如果您只对exists
功能感兴趣,那么您不需要所有组合。
local stored_string = "ABC_-123"
function exists(tested_string)
return stored_string:lower() == tested_string:lower()
end
您只需以不区分大小写的方式比较存储的字符串和测试的字符串。
可以轻松测试:
assert(exists("abC_-123"))
assert(not exists("abd_-123"))
答案 2 :(得分:0)
如何做到这一点?
Lua中的原生函数可以生成字符串的所有排列,但这里有一些可能有用的东西。
<强> 子串 强>
可能是最简单的解决方案,但也是最不灵活的。您可以检查给定字符串中是否存在子字符串,而不是组合。
if str:find(substr) then
--code
end
如果这解决了你的问题,我非常推荐它。
获取所有排列
更昂贵,但仍然是一个有效的解决方案。这几乎完全符合您的要求。
function GetScrambles(str, tab2)
local tab = {}
for i = 1,#str do
table.insert(tab, str:sub(i, i))
end
local tab2 = tab2 or {}
local scrambles = {}
for i = 0, Count(tab)-1 do
local permutation = ""
local a = Count(tab)
for j = 1, #tab do
tab2[j] = tab[j]
end
for j = #tab, 1, -1 do
a = a / j
b = math.floor((i/a)%j) + 1
permutation = permutation .. tab2[b]
tab2[b] = tab2[j]
end
table.insert(scrambles, permutation)
end
return scrambles
end
您提出的问题
基本上这正是你最初要求的。它与上面的代码相同,除了字符串的每个子字符串。
function GetAllSubstrings(str)
local substrings = {}
for i = 1,#str do
for ii = i,#str do
substrings[#substrings+1]=str:sub(ii)
end
end
return substrings
end
<强> 资本 强>
对于每一个排列,你基本上都必须用它来完成所有可能的资本组合。
这应该不会太难,我相信你可以编码:)
你在开玩笑吗?
在此之后你可能会想知道。所有这些真的是否必要?好像有点多了!
答案就在于你在做什么。你真的需要给定字符的所有组合吗?我不这么认为。你说你在评论中需要它不区分大小写......但是你知道你可以简单地将它转换成大写/小写吗?这很简单
local str = "hELlO"
print(str:lower())
print(str:upper())
这是你应该如何存储名称,否则你应该区分大小写。
您决定
现在你选择你将要做的事情。无论你选择哪个方向,我祝你好运!