Lua Разделить строку и поместить вывод в таблицу - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь использовать Lua, чтобы разделить строку наилучшим из возможных способов

Вывод, который я пытаюсь получить, таков:

"is"
"this"
"ents"
"cont"
"_"
etc
etc

Вот мой код так далеко без успеха

local variable1 = "this_is_the_string_contents"

local l = string.len(variable1)
local i = 0
local r = nil
local chunks = {} --table to store output in

while i < l do
r = math.random(1, l - i)

--if l - i > i then
--r = math.random(1, (l - i) / 2)
--else
--r = math.random(1, (l - i))
--end

print(string.sub(variable1, i, r))

chunks = string.sub(variable1, i, r)
i = i+r 

end

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020

Похоже, вы хотите создать случайную длину для каждой строки?

function GetRandomStringList(str)
    local str_table = {}
    while string.len(str)>0 do
        local str_chunk_size = math.random(1,string.len(str))
        table.insert(str_table,string.sub(str,1,str_chunk_size))
        str=string.sub(str,str_chunk_size+1)
    end
    return str_table
end

function DisplayStringList(name, str_table)
    print(name..":")
    for loop=1,#str_table do
        print(str_table[loop])
    end
    print("")
end

do
    local str = "this_is_the_string_contents"
    DisplayStringList("first", GetRandomStringList(str))
    DisplayStringList("second", GetRandomStringList(str))
    DisplayStringList("third", GetRandomStringList(str))
end

Я просто l oop, пока в строке еще есть символы, случайным образом выберите размер куска, вставьте его часть строки в таблицу, а затем удалите эту часть из строки. Повторение. Когда строка пуста, верните таблицу вызывающей стороне для обработки.

Вывод выглядит так:

first:
t
his_is_the_stri
ng_
content
s

second:
this_is_the_s
tring
_contents

third:
this_is_the_string_cont
ent
s
0 голосов
/ 08 февраля 2020

Если я вас правильно понимаю, вы хотите разделить строку на равные части. Следующее будет делать это точно так же, как и сохранять его в таблице.

local variable2 = "this_is_the_string_contents"

math.randomseed(os.time())
local l = #variable2
local i = 0
local r = math.random(1, l/2)
local chunks = {}

while i <= l+5 do
    print(variable2:sub(i, i+r))
    table.insert(chunks, variable2:sub(i,i+r))

    i = i+r+1
end

Полезно менять math.randomseed каждый раз, когда вы запускаете скрипт, чтобы получить больше отклонений в случайных числах. Хотя быстрая разбивка.

local r = math.random(1, l/2): вы можете изменить 2 на то, что вам нужно, но это не дает сценарию назначить #variable2 в качестве длины, что позволяет получить переменная в виде одного куска.

while i <= l+5 do: я добавил +5 для учета некоторых случаев превышения, просто в качестве меры предосторожности.

table.insert(chunks, variable2:sub(i, i+r)): это то, что вам нужно вставить в таблицу. Поскольку мы хотим получить равную сумму, вы будете использовать i+r в качестве конечного элемента.

i = i+r+1: вам не нужны повторные буквы.

Конечные результаты отображаются следующим образом. :

Pass One:
this_is_the
_string_cont
ents   

Pass Two:
thi
s_is
_the
_str
ing_
cont
ents

и так далее. Если это не то, что вы ищете, пожалуйста, сообщите и пересмотрите ваш вопрос. Если вы хотите хранить _ отдельно, а не часть слов, это даже проще, но, как вы описали это, вы сказали равномерно, поэтому я остановился на этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...