15.12.2021, 21:24
(This post was last modified: 15.12.2021, 22:29 by Erwin van der Zwart.)
Well it's by far not a simple script that is why i took the challenge as i like that (:
Create your ASCII objects and add the tag "Scramble" to it and run this script to scramble all the object values without any duplicates
Still curious to your use case (:
BR,
Erwin
Create your ASCII objects and add the tag "Scramble" to it and run this script to scramble all the object values without any duplicates
Code:
-- get objects to scramble by tag
scrambled = grp.tag('Scramble')
-- set randomseed
math.randomseed(os.time())
-- function to scramble strings
function scramble(str)
local chars = {}
for char in str:gmatch'.[\128-\191]*' do
table.insert(chars, {char = char, rnd = math.random()})
end
table.sort(chars, function(a, b) return a.rnd < b.rnd end)
for i, v in ipairs(chars) do
chars[i] = v.char
end
return table.concat(chars)
end
-- create new values table with unique values
newvalues = {}
for i, object in ipairs(scrambled) do
-- Set max retries for unique values to avoid script lockout
max_retry = 100
-- Goto marker when value is already in the table or the same as old value
::retry::
if #newvalues < 1 then
value = scramble(object.value)
if value == object.value then
max_retry = max_retry - 1
if max_retry < 1 then
return
else
goto retry
end
end
table.insert(newvalues, {address = object.address, value = value})
else
value = scramble(object.value)
if value == object.value then
max_retry = max_retry - 1
if max_retry < 1 then
return
else
goto retry
end
end
for j, newvalue in ipairs(newvalues) do
if value == newvalue.value then
max_retry = max_retry - 1
if max_retry < 1 then
return
else
goto retry
end
end
end
table.insert(newvalues, {address = object.address, value = value})
end
end
--Check if tables are same lenght
if #newvalues == #scrambled then
-- update objects
for _, object in ipairs(newvalues) do
grp.checkupdate(object.address, object.value)
end
end
BR,
Erwin