История изменений
Исправление LightDiver, (текущая версия) :
-- Локализация системных функций
local abs, floor = math.abs, math.floor
local byte, sub, char = string.byte, string.sub, string.char
local tbl_insert, tbl_concat, error = table.insert, table.concat, error
local _convertTable3 = {
[0] = "0", [1] = "1", [2] = "2", [3] = "3", [4] = "4",
[5] = "5", [6] = "6", [7] = "7", [8] = "8", [9] = "9",
[10] = "A", [11] = "B", [12] = "C", [13] = "D", [14] = "E",
[15] = "F", [16] = "G", [17] = "#", [18] = "$", [19] = "%",
[20] = "(", [21] = ")", [22] = "*", [23] = "+", [24] = "-",
[25] = "/", [26] = ";", [27] = "<", [28] = "=", [29] = ">",
[30] = "@", [31] = "H", [32] = "I", [33] = "J", [34] = "K",
[35] = "L", [36] = "M", [37] = "N", [38] = "O", [39] = "P",
[40] = "Q", [41] = "R", [42] = "S", [43] = "T", [44] = "U",
[45] = "V", [46] = "W", [47] = "X", [48] = "Y", [49] = "Z",
[50] = "^", [51] = "_", [52] = "`", [53] = "a", [54] = "b",
[55] = "c", [56] = "d", [57] = "e", [58] = "f", [59] = "g",
[60] = "h", [61] = "i", [62] = "j", [63] = "k", [64] = "l",
[65] = "m", [66] = "n", [67] = "o", [68] = "p", [69] = "q",
[70] = "r", [71] = "s", [72] = "t", [73] = "u", [74] = "v",
[75] = "w", [76] = "x", [77] = "y", [78] = "z", [79] = "{",
[80] = "|", [81] = "}", [82] = "[", [83] = "]", [84] = "'",
}
-- Обратная таблица конвертации
local _reverseConvertTable3 = {}
for k, v in pairs(_convertTable3) do
_reverseConvertTable3[v] = k
end
-- Максимальное поддерживаемое число (85^12)
local MAX_NUMBER = 85^12
-- Буфер для кодирования
local encode_buffer = {}
-- Кодирование числа в строку
function en85(dec)
if type(dec) ~= "number" then error("Input must be a number") end
if dec == 0 then return "0" end
-- Проверка диапазона
if dec < 0 or dec > MAX_NUMBER then
error("Number out of range: " .. tostring(dec))
end
local idx = 0
repeat
local remainder = dec % 85
dec = floor(dec / 85)
idx = idx + 1
encode_buffer[idx] = _convertTable3[remainder]
until dec == 0
-- Сборка строки в правильном порядке (обратном)
local result = ""
for i = idx, 1, -1 do
result = result .. (encode_buffer[i] or "")
end
-- Очистка буфера
for i = 1, idx do
encode_buffer[i] = nil
end
return result
end
-- Декодирование строки в число
function en10(encoded)
if type(encoded) ~= "string" then return 0 end
if encoded == "0" then return 0 end
local number = 0
local len = #encoded
for i = 1, len do
local symbol = sub(encoded, i, i)
local digit = _reverseConvertTable3[symbol] or 0
number = number * 85 + digit
end
return number
end
Тесты показывают, что лучше всего использовать эти функции и методы напрямую. Нужно что то сделать - делай, сравнивай. Без промежуточных действий и сохранений любых. Без локальных переменных. Любое вмешательство замедляет и жрет память.
Пока по результатам тестов самый быстрый и нежрущий вариант Луа5.1 и параноидальная оптимизация (комментарий) тут второй.
И да, string.match я тоже пробовал. Оно чуть чуть хуже использования саба:
-- Шаблон для доступа к номеру элемента без пробелов
OBJECT_POSITION_PATTERNS = {}
for i = 1, 100 do
OBJECT_POSITION_PATTERNS[i] = "^" .. string.rep("...", i - 1) .. "(...)"
end
Вот по такому паттерну.
Исправление LightDiver, :
-- Локализация системных функций
local abs, floor = math.abs, math.floor
local byte, sub, char = string.byte, string.sub, string.char
local tbl_insert, tbl_concat, error = table.insert, table.concat, error
local _convertTable3 = {
[0] = "0", [1] = "1", [2] = "2", [3] = "3", [4] = "4",
[5] = "5", [6] = "6", [7] = "7", [8] = "8", [9] = "9",
[10] = "A", [11] = "B", [12] = "C", [13] = "D", [14] = "E",
[15] = "F", [16] = "G", [17] = "#", [18] = "$", [19] = "%",
[20] = "(", [21] = ")", [22] = "*", [23] = "+", [24] = "-",
[25] = "/", [26] = ";", [27] = "<", [28] = "=", [29] = ">",
[30] = "@", [31] = "H", [32] = "I", [33] = "J", [34] = "K",
[35] = "L", [36] = "M", [37] = "N", [38] = "O", [39] = "P",
[40] = "Q", [41] = "R", [42] = "S", [43] = "T", [44] = "U",
[45] = "V", [46] = "W", [47] = "X", [48] = "Y", [49] = "Z",
[50] = "^", [51] = "_", [52] = "`", [53] = "a", [54] = "b",
[55] = "c", [56] = "d", [57] = "e", [58] = "f", [59] = "g",
[60] = "h", [61] = "i", [62] = "j", [63] = "k", [64] = "l",
[65] = "m", [66] = "n", [67] = "o", [68] = "p", [69] = "q",
[70] = "r", [71] = "s", [72] = "t", [73] = "u", [74] = "v",
[75] = "w", [76] = "x", [77] = "y", [78] = "z", [79] = "{",
[80] = "|", [81] = "}", [82] = "[", [83] = "]", [84] = "'",
}
-- Обратная таблица конвертации
local _reverseConvertTable3 = {}
for k, v in pairs(_convertTable3) do
_reverseConvertTable3[v] = k
end
-- Максимальное поддерживаемое число (85^12)
local MAX_NUMBER = 85^12
-- Буфер для кодирования
local encode_buffer = {}
-- Кодирование числа в строку
function en85(dec)
if type(dec) ~= "number" then error("Input must be a number") end
if dec == 0 then return "0" end
-- Проверка диапазона
if dec < 0 or dec > MAX_NUMBER then
error("Number out of range: " .. tostring(dec))
end
local idx = 0
repeat
local remainder = dec % 85
dec = floor(dec / 85)
idx = idx + 1
encode_buffer[idx] = _convertTable3[remainder]
until dec == 0
-- Сборка строки в правильном порядке (обратном)
local result = ""
for i = idx, 1, -1 do
result = result .. (encode_buffer[i] or "")
end
-- Очистка буфера
for i = 1, idx do
encode_buffer[i] = nil
end
return result
end
-- Декодирование строки в число
function en10(encoded)
if type(encoded) ~= "string" then return 0 end
if encoded == "0" then return 0 end
local number = 0
local len = #encoded
for i = 1, len do
local symbol = sub(encoded, i, i)
local digit = _reverseConvertTable3[symbol] or 0
number = number * 85 + digit
end
return number
end
Тесты показывают, что лучше всего использовать эти функции и методы напрямую. Нужно что то сделать - делай, сравнивай. Без промежуточных действий и сохранений любых. Без локальных переменных. Любое вмешательство замедляет и жрет память.
Пока по результатам тестов самый быстрый и нежрущий вариант Луа5.1 и параноидальная оптимизация (комментарий) тут второй.
И да, string.match я тоже пробовал. Оно чуть чуть хуже использования саба:
-- Шаблон для доступа к номеру элемента без пробелов
OBJECT_POSITION_PATTERNS = {}
for i = 1, 100 do -- Важно: цикл до 100, а не 10!
OBJECT_POSITION_PATTERNS[i] = "^" .. string.rep("...", i - 1) .. "(...)"
end
Вот по такому паттерну.
Исправление LightDiver, :
-- Локализация системных функций
local abs, floor = math.abs, math.floor
local byte, sub, char = string.byte, string.sub, string.char
local tbl_insert, tbl_concat, error = table.insert, table.concat, error
local _convertTable3 = {
[0] = "0", [1] = "1", [2] = "2", [3] = "3", [4] = "4",
[5] = "5", [6] = "6", [7] = "7", [8] = "8", [9] = "9",
[10] = "A", [11] = "B", [12] = "C", [13] = "D", [14] = "E",
[15] = "F", [16] = "G", [17] = "#", [18] = "$", [19] = "%",
[20] = "(", [21] = ")", [22] = "*", [23] = "+", [24] = "-",
[25] = "/", [26] = ";", [27] = "<", [28] = "=", [29] = ">",
[30] = "@", [31] = "H", [32] = "I", [33] = "J", [34] = "K",
[35] = "L", [36] = "M", [37] = "N", [38] = "O", [39] = "P",
[40] = "Q", [41] = "R", [42] = "S", [43] = "T", [44] = "U",
[45] = "V", [46] = "W", [47] = "X", [48] = "Y", [49] = "Z",
[50] = "^", [51] = "_", [52] = "`", [53] = "a", [54] = "b",
[55] = "c", [56] = "d", [57] = "e", [58] = "f", [59] = "g",
[60] = "h", [61] = "i", [62] = "j", [63] = "k", [64] = "l",
[65] = "m", [66] = "n", [67] = "o", [68] = "p", [69] = "q",
[70] = "r", [71] = "s", [72] = "t", [73] = "u", [74] = "v",
[75] = "w", [76] = "x", [77] = "y", [78] = "z", [79] = "{",
[80] = "|", [81] = "}", [82] = "[", [83] = "]", [84] = "'",
}
-- Обратная таблица конвертации
local _reverseConvertTable3 = {}
for k, v in pairs(_convertTable3) do
_reverseConvertTable3[v] = k
end
-- Максимальное поддерживаемое число (85^12)
local MAX_NUMBER = 85^12
-- Буфер для кодирования
local encode_buffer = {}
-- Кодирование числа в строку
function en85(dec)
if type(dec) ~= "number" then error("Input must be a number") end
if dec == 0 then return "0" end
-- Проверка диапазона
if dec < 0 or dec > MAX_NUMBER then
error("Number out of range: " .. tostring(dec))
end
local idx = 0
repeat
local remainder = dec % 85
dec = floor(dec / 85)
idx = idx + 1
encode_buffer[idx] = _convertTable3[remainder]
until dec == 0
-- Сборка строки в правильном порядке (обратном)
local result = ""
for i = idx, 1, -1 do
result = result .. (encode_buffer[i] or "")
end
-- Очистка буфера
for i = 1, idx do
encode_buffer[i] = nil
end
return result
end
-- Декодирование строки в число
function en10(encoded)
if type(encoded) ~= "string" then return 0 end
if encoded == "0" then return 0 end
local number = 0
local len = #encoded
for i = 1, len do
local symbol = sub(encoded, i, i)
local digit = _reverseConvertTable3[symbol] or 0
number = number * 85 + digit
end
return number
end
Тесты показывают, что лучше всего использовать эти функции и методы напрямую. Нужно что то сделать - делай, сравнивай. Без промежуточных действий и сохранений любых. Без локальных переменных. Любое вмешательство замедляет и жрет память.
Пока по результатам тестов самый быстрый и нежрущий вариант Луа5.1 и параноидальная оптимизация (комментарий) тут второй.
Исходная версия LightDiver, :
-- Локализация системных функций
local abs, floor = math.abs, math.floor
local byte, sub, char = string.byte, string.sub, string.char
local tbl_insert, tbl_concat, error = table.insert, table.concat, error
local _convertTable3 = {
[0] = "0", [1] = "1", [2] = "2", [3] = "3", [4] = "4",
[5] = "5", [6] = "6", [7] = "7", [8] = "8", [9] = "9",
[10] = "A", [11] = "B", [12] = "C", [13] = "D", [14] = "E",
[15] = "F", [16] = "G", [17] = "#", [18] = "$", [19] = "%",
[20] = "(", [21] = ")", [22] = "*", [23] = "+", [24] = "-",
[25] = "/", [26] = ";", [27] = "<", [28] = "=", [29] = ">",
[30] = "@", [31] = "H", [32] = "I", [33] = "J", [34] = "K",
[35] = "L", [36] = "M", [37] = "N", [38] = "O", [39] = "P",
[40] = "Q", [41] = "R", [42] = "S", [43] = "T", [44] = "U",
[45] = "V", [46] = "W", [47] = "X", [48] = "Y", [49] = "Z",
[50] = "^", [51] = "_", [52] = "`", [53] = "a", [54] = "b",
[55] = "c", [56] = "d", [57] = "e", [58] = "f", [59] = "g",
[60] = "h", [61] = "i", [62] = "j", [63] = "k", [64] = "l",
[65] = "m", [66] = "n", [67] = "o", [68] = "p", [69] = "q",
[70] = "r", [71] = "s", [72] = "t", [73] = "u", [74] = "v",
[75] = "w", [76] = "x", [77] = "y", [78] = "z", [79] = "{",
[80] = "|", [81] = "}", [82] = "[", [83] = "]", [84] = "'",
}
-- Обратная таблица конвертации
local _reverseConvertTable3 = {}
for k, v in pairs(_convertTable3) do
_reverseConvertTable3[v] = k
end
-- Максимальное поддерживаемое число (85^12)
local MAX_NUMBER = 85^12
-- Буфер для кодирования
local encode_buffer = {}
-- Кодирование числа в строку
function en85(dec)
if type(dec) ~= "number" then error("Input must be a number") end
if dec == 0 then return "0" end
-- Проверка диапазона
if dec < 0 or dec > MAX_NUMBER then
error("Number out of range: " .. tostring(dec))
end
local idx = 0
repeat
local remainder = dec % 85
dec = floor(dec / 85)
idx = idx + 1
encode_buffer[idx] = _convertTable3[remainder]
until dec == 0
-- Сборка строки в правильном порядке (обратном)
local result = ""
for i = idx, 1, -1 do
result = result .. (encode_buffer[i] or "")
end
-- Очистка буфера
for i = 1, idx do
encode_buffer[i] = nil
end
return result
end
-- Декодирование строки в число
function en10(encoded)
if type(encoded) ~= "string" then return 0 end
if encoded == "0" then return 0 end
local number = 0
local len = #encoded
for i = 1, len do
local symbol = sub(encoded, i, i)
local digit = _reverseConvertTable3[symbol] or 0
number = number * 85 + digit
end
return number
end
Тесты показывают, что лучше всего использовать эти функции и методы напрямую. Нужно что то сделать - делай, сравнивай. Без промежуточных действий и сохранений любых. Без локальных переменных. Любое вмешательство замедляет и жрет память.
Пока самый быстрый и нежрущий вариант Луа5.1 и параноидальная оптимизация (комментарий) тут второй.