字符串洗牌和解密(Lua)
2021-8-19 2:52:8
收藏:0
阅读:144
评论:1
我有一个函数可以从另一篇文章中洗牌字符串,该函数使用预定义数字的表来重新排序字符。它完美地工作,因此我也需要一个使用数字表解密该字符串的函数,但是我不知道怎么做,尤其是在尝试并多次失败之后。
洗牌函数:
randomValues = {}
for i = 1, 60 do
table.insert(randomValues, 1, math.random())
end
function shuffle(str)
math.randomseed(4)
local letters = {}
local idx = 0
for letter in str:gmatch'.[\128-\191]*' do
idx = idx + 1
table.insert(letters, {letter = letter, rnd = randomValues[idx]})
end
table.sort(letters, function(a, b) return a.rnd < b.rnd end)
for i, v in ipairs(letters) do
letters[i] = v.letter
end
return table.concat(letters)
end
有什么技巧吗?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我假设你的目标是:
我已经将拆分 Unicode 字符和进行实际洗牌分开了,以使其更易于跟进。
1. 拆分字符
从拆分字符开始:
-- 将字符串拆分为 Unicode 字符的表。 local function splitLetters(str) local letters = {} for letter in str:gmatch'.[\128-\191]*' do table.insert(letters, letter) end return letters end
这主要是从你的函数的第一部分复制过来的。
2. 洗牌字符表
现在我们有了一个好的字符表,可以进行洗牌。可以通过逐个字符地遍历并与任意一个尚未洗牌的项目进行交换来对列表进行洗牌。在这样做的同时,我们还保持了所有被交换的索引的表,我在这里称之为
swapTable
。-- 原地洗牌并返回可用于取消混洗的表。 local function shuffle(items) local swapTable = {} for i = 1, #items - 1 do -- 将第一个条目与随机条目(包括它本身)交换。 local j = math.random(i, #items) items[i], items[j] = items[j], items[i] -- 跟踪每个交换,以便我们可以撤消它。 table.insert(swapTable, j) -- 现在的每一项都是随机的。 -- 最后一次迭代可以跳过,因为它总是会与自己交换。 -- 请参阅循环顶部的#项-1。 end return swapTable end
3. 将字符恢复到原来的位置
现在使用这个
swapTable
,反转整个洗牌过程就非常简单了。-- 原地还原以前的洗牌。 local function unshuffle(items, swapTable) -- 向后遍历交换表,因为我们需要反向执行所有操作。 for i = #swapTable, 1, -1 do -- 与之前相同,但是使用交换表。 local j = swapTable[i] items[i], items[j] = items[j], items[i] end end
使用所有这些功能的完整示例
使用这些函数(和
table.concat
将字母列表构建回字符串)我们可以做到你想要的一切:-- 让我们的输出可重现 math.randomseed(42) -- 将测试字符串拆分为 Unicode 字符表 local letters = splitLetters("Hellö Wörld! Höw are yoü?") -- 洗牌它们,在此同时获取 swapTable。 local swapTable = shuffle(letters) -- 打印洗牌后的字符串 print(table.concat(letters)) --> " rH?doröWüle Hl lwa eyöö!" -- 使用 swapTable 原地取消混洗。 unshuffle(letters, swapTable) -- 我们又回到了原来的字符串。 print(table.concat(letters)) --> "Hellö Wörld! Höw are yoü?"
预先创建 swapTable
在你的示例中,你提前生成了
swapTable
(它还略有不同)。当然,你可以将该部分拆分出来,并使shuffle
函数的工作方式类似于当前实现的unshuffle
。如果需要,告诉我我详细说明。