2015-11-01 3 views
0

мне нужно это для игрового сервера с использованием 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 

и т.д.

+1

Вам действительно нужно создавать все такие комбинации или просто хотите проверить, присутствует ли новая строка во всех таких комбинациях другой строки? Это две разные задачи с различными решениями. – dlask

+0

все комбинации yeah – sarin

+1

Если вы хотите использовать его как 'if exists (string)', если я его правильно понимаю, вам не нужны все комбинации. Итак, что именно ожидается? –

ответ

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") 

Вам нужно только сохранить промежуточные результаты вместо их печати.

+0

Это работает: D Thx много. Теперь я только надеюсь, что он не будет слишком сильно отставать в игре. – sarin

+0

Хорошо, я стараюсь писать более подробно, но это слишком сложно для моего мозга: D Итак, у вас есть эта игра с неофициальным модулем LUA сервера. Я добавил к серверу гоночный таймер, люди могут отправлять карты и т. Д., И записи сохраняются для каждой карты, теперь проблема заключается в том, что я могу заблокировать людей от загрузки карт или B, как-то сделать так, чтобы все карты, которые были отправлены сервер рассматривается как нечувствительный к регистру. Существует только версия Linux-сервера, поэтому, если у сервера есть карта с именем RACE1, какой-то игрок может отправить карту с именем rACE1, которая затем поделится счетом или будет 2 отдельными картами, что не очень хорошо. – sarin

+0

Как сохранить эти файлы с * нормализованными * именами, например. в нижнем регистре? – dlask

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")) 
+0

thx, но это действительно должно быть примерно так: http://stackoverflow.com/questions/11144389/find-all-upper-lower-and-mixed-case-combinations-of--string, в то время как обычно проходит номера и специальные символы или это http://unix.stackexchange.com/questions/168181/get-all-possible-combinations-of-a-word-in-lower-uppercase-letters – sarin

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 

Capitals

Вы в основном придется с каждой перестановки, все возможные комбинации капиталов с ним.

Это не должно быть слишком сложно, я уверен, что вы можете написать код :)


Вы шутите?

После этого вам, вероятно, должно быть интересно. Все это действительно необходимо? Кажется, это немного!

Ответ на этот вопрос заключается в том, что вы делаете. Вам действительно нужны все комбинации заданных символов? Я так не думаю. Вы говорите, что вам нужно это для чувствительности к регистру в комментариях ... Но знаете ли вы, что можете просто преобразовать его в нижний/верхний регистр? Это очень просто

local str = "hELlO" 
print(str:lower()) 
print(str:upper()) 

Это КАК вы должны хранить имена, иначе вы должны оставить его чувствительным к регистру.


Вы решили

Теперь вы выбираете то, что вы собираетесь делать. Какое бы направление вы ни выбрали, я желаю вам удачи!

Смежные вопросы