Разделение строки на двумерную таблицу в Lua

Скажем, у меня есть эта строка:

map_data = "     *-*  ;    /|x|\ ;   *-*-*-*;  /|x|x|x|;-*-*-*-*-*;  \|x|x|x|;   *-*-*-*;    \|x|/ ;     *-*  ;"

Я хотел бы разбить строку на упорядоченную таблицу с точкой с запятой. После того, как я это сделал, я хотел бы взять каждый элемент таблицы и разделить каждый символ на упорядоченную таблицу (вложенную в первую таблицу). Идея состоит в том, чтобы создать двухмерную таблицу для карты ascii.

Я пробовал это (но это не работает, и я также подозреваю, что есть более простой способ):

map_data = "     *-*  ;    /|x|\ ;   *-*-*-*;  /|x|x|x|;-*-*-*-*-*;  \|x|x|x|;   *-*-*-*;    \|x|/ ;     *-*  ;"

map = {}

p = 1
pp = 1
for i in string.gmatch(map_data, "(.*);") do
    map[p] = {}
    for ii in string.gmatch(i, ".") do
        map[p][pp] = ii
        pp = pp + 1
    end
    p = p + 1
end

person Eli Bell    schedule 10.01.2016    source источник
comment
Не изменяйте исходный код таким образом, это делает текущий ответ недействительным.   -  person Yu Hao    schedule 10.01.2016


Ответы (2)


Прошли годы с тех пор, как я коснулся Lua, но если вы исправите проблему с escape-символом, не могли бы вы просто сделать что-то вроде...

map = {{}} -- map initially contains one empty line 
for i = 1, #map_data do
    local c = map_data:sub(i,i)
    if c == ';' then
        map[#map+1] = {} -- add another line to the end of map
    else
        map[#map][ #map[#map] + 1] = c -- add c to last line in map
    end
end
person Mark Feldman    schedule 10.01.2016
comment
Однако еще один быстрый вопрос. Допустим, я хотел сохранить символы в таблице, например: map[y][x].value вместо непосредственно в map[y][x]. Как мне нужно изменить код, чтобы не получить ошибку с нулевым значением? - person Eli Bell; 10.01.2016

Начнем с того, что строка map_data недействительна, потому что \ нужно экранировать. Или вы можете использовать синтаксис длинной строки [[ ... ]]:

map_data = [[     *-*  ;    /|x|\ ;   *-*-*-*;  /|x|x|x|;-*-*-*-*-*;  \|x|x|x|;   *-*-*-*;    \|x|/ ;     *-*  ;]]

Проблема шаблона (.*); в том, что модификатор * жадный. Вместо этого используйте ленивый модификатор -:

for i in string.gmatch(map_data, "(.-);") do
person Yu Hao    schedule 10.01.2016
comment
Итак, я внес изменения, и по какой-то причине он захватывает только первую строку: -. Есть ли что-то еще, что я сделал неправильно? - person Eli Bell; 10.01.2016
comment
@EliBell - pp = 1 следует переместить во внешний цикл. - person Egor Skriptunoff; 10.01.2016