![]() |
|
Simple scripting help - Printable Version +- LogicMachine Forum (https://forum.logicmachine.net) +-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1) +--- Forum: Scripting (https://forum.logicmachine.net/forumdisplay.php?fid=8) +--- Thread: Simple scripting help (/showthread.php?tid=3754) |
Simple scripting help - Jayce - 15.12.2021 Hello, I'm having some issues finding a solution to my problem, i'm sure it is very easy but I'm not very good at scripting. Let's say I have 5 ASCII objects with some value like value1, value2 etc.. I would like to take these values and use math.random function to "scramble" them randomly and write the randomly scrambled values into another set of 5 ASCII objects. Is something like that possible? Also the values cannot repeat, same value cannot be assigned to two of the new scrambled ASCII objects. EDIT: Also separate question, is there a way to let's say I have ASCII group objects with values, in script i'd like to grp.getvalue them to val1, val2, val3 etc.. and after that use some cycle function to do the random scramble operation above? How would I make it so the cycle knows to move val1 to val2? Let me show example script which might make it more clear but definitely will NOT work. val1 = "val1" val2 = "val2" val3 = "val3" for (i=1, i<= 3, i++) do val[i] = grp.write('1/1/[i]') end Basically this is exactly what I need to do with the first question above about scrambling them. I'd like to take val1,val2,val3 and randomize those values into 3 group addresses 1/1/1, 1/1/2, 1/1/3 without val1,val2 or val3 repeating in any of those 3 group addresses. Sorry I know it makes no sense scripting wise but that's what I need to do. Thank you in advanced! RE: Simple scripting help - Erwin van der Zwart - 15.12.2021 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 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
endBR, Erwin RE: Simple scripting help - admin - 16.12.2021 @Erwin, I think you over-complicated the task there ![]() Use this if you simply want to scramble already set values for tagged objects: Code: math.randomseed(os.time())
objects = grp.tag('Scramble')
values = {}
for _, obj in ipairs(objects) do
values[ #values + 1 ] = obj.value
end
for _, obj in ipairs(objects) do
index = math.random(1, #values)
obj:write(values[ index ])
table.remove(values, index)
endRE: Simple scripting help - Jayce - 16.12.2021 Thank you both guys! Works flawlessly, I've also learned some stuff too. RE: Simple scripting help - Erwin van der Zwart - 16.12.2021 (16.12.2021, 06:31)admin Wrote: @Erwin, I think you over-complicated the task there Well i don't fully agree, your version is just rotating the values between the objects, my version is realy scrambling the values and checks there are no duplicted values at any time.. RE: Simple scripting help - admin - 16.12.2021 @Erwin, sure thing The problem here is that the task is not defined clearly.
RE: Simple scripting help - Erwin van der Zwart - 16.12.2021 I think both where asked
|