Anonymous
сортировать как?
Anonymous
мне нужно, чтобы в ассоциативном массиве записи были в том порядке, в котором я их добавил
Anonymous
в почти всех языках это так
Anonymous
ну или, в крайнем случае, чтобы была хоть какая-то логика при итерации через pairs()
Anonymous
а не доверять всё ёбаному рандому
fgntfg
` local t = { [223]="asd", [23]="fgh", [543]="hjk", [7]="qwe" } local tkeys = {} —populate the table that holds the keys for k in pairs(t) do table.insert(tkeys, k) end —sort the keys table.sort(tkeys) — use the keys to retrieve the values in the sorted order for _, k in ipairs(tkeys) do print(k, t[k]) end `
fgntfg
pfpfpfplfp
Anonymous
да, чёт типа того и приходится изобретать
fgntfg
какой тут тег для кода?
Anonymous
`
Anonymous
жопа
Snusmumriken
Потому что для ускорения поиска в 100500 раз используются хеши. Для того чтобы держать порядок, можно или прицепить метатаблицу с проксей (на __index/__newindex и методом __pairs возвращающим ключи-значения-индекс, которая хранит в замыкании порядок), или типа такого: function add(tbl, key, v) tbl[key] = v tbl[#tbl + 1] = v end function remove(tbl, key, index) local removed_now local v = tbl[key] index = index or 1 for i = 1, #tbl do if removed_now then tbl[i] = tbl[i + 1] else if tbl[i] = v then tbl[i] = nil end removed_now = true end end end tbl[key] = nil end t = {} add(t, 'yoyo', 10) remove(y, 'yoyo')
fgntfg
тут явно не о производительности речь
Snusmumriken
Где именно? Да, для того чтобы в словаре был порядок - нужно где-то ДЕРЖАТЬ ЭТОТ ПОРЯДОК, что жрёт память и замедляет удаление, если удалять без индекса + ключа, а ещё тут проблемы с удалением ключей, ибо все остальные надо сдвигать назад.
Snusmumriken
Да. Там где нужен порядок - объективно не особо нужны словари. Инфа сотка. Лучше уж список типа: { {a = 10, b = 20}, {a = 20, b = 30}, } Если уж так нужны ключи. И порядок сохраняется )))
Danil
Danil
Я не знаю с чего начать
Danil
Помогите, пожалуйста.
Danil
Первую решил
Danil
И третью решил
Danil
На втором застрял
Anonymous
о, я такие лет 5 назад решал)
Anonymous
на олимпиадках по программированию))
Danil
(на Lua)
Anonymous
я на сишечке писал
Anonymous
выебнулся тип
Danil
А мне что делать то?
Anonymous
а меня не приняли :(
Danil
У нас на луа....
Anonymous
А мне что делать то?
мне за тебя это решить?
Anonymous
бля, сорь, не сдержался
Anonymous
a,b,c,d,e = io.read("*number", "*number", "*number", "*number", "*number") -- проверять не надо же? arr = {a,b,c,d,e} -- лол table.sort(arr) res = (arr[2]+arr[3]+arr[4])/3
Anonymous
ну, это же как бы неправильное решение (:
Anonymous
так делать ни в коем случае нельзя!
Anonymous
не примут скорее всего, и правильно сделают(:
Anonymous
ну эээ да
fgntfg
Пишите на брейнфаке, 4tehlulz
Anonymous
но это читерство немножко
Snusmumriken
Ммм. Вариант для детей. ratecount = 5 rate = {} min, max = math.huge, -math.huge for i = 1, ratecount do -- get rates print('Enter '..i..' rate') local v = io.read('*n') -- пока не введут число, запрашивать снова while not v do print('Enter '..i..' rate') v = io.read('*n') end if v < min then min = v end if v > max then max = v end rate[i] = v end removed_min, removed_max = false, false -- удаляем то что не нужно (даже если оценки повторяются) for i = #rate, 1, -1 do if removed_min and rate[i] == min then removed_min = true table.remove(rate, i) end if removed_max and rate[i] == min then removed_max = true table.remove(rate, i) end end answer = 0 for i = 1, #rate do answer = answer + rate[i] end answer = answer/#rate -- average print('Average: '..answer)
Anonymous
я думаю, суть задачки всё-таки в ручной сортировке, нет?
Snusmumriken
А у меня - для детей, чтобы мог объяснить потом.
Anonymous
да, одинаково
Anonymous
боюсь, time показывает время запуска интерпретатора, а исполняется оно мгновенно в любом случае :)
Snusmumriken
Это детский вариант простой задачи :< Известны 10 преимуществ Паскаля перед Си. Я приведу только одно, но самое важное. На Си вы можете написать: for(;P("\n").R--;P("\ "))for(e=0x3DC;e--;P("_ "+(*u++/8)%2))P("| "+ (*u/4)%2); На Паскале Вы НЕ МОЖЕТЕ такого написать. P.S. Это преимущество.
Anonymous
добавлял тут в луарокс сишный модуль это оказалось офигенно просто и понятно!
Anonymous
один из первых более-менее заметных контрибьютов в опенсурс я няша! (нет)
Snusmumriken
a,b,c,d,e = io.read("*number", "*number", "*number", "*number", "*number") -- проверять не надо же? arr = {a,b,c,d,e} -- лол table.sort(arr) res = (arr[2]+arr[3]+arr[4])/3
Тогда уж arr = {io.read("*n", "*n", "*n", "*n", "*n")} table.sort(arr) res = (arr[2] + arr[3] + arr[4])/3 У тебя целая строчка лишняя, на преобразование в массив.
Snusmumriken
Ничего. Это обидно. Возвращал бы сортированную таблицу - можно было бы в две строки.
Anonymous
о, не знал, что так можн
Anonymous
точнее, лень проверять было %)
Snusmumriken
У нас на луа....
Кстати, что за заведение, где на луа заставляют писать? : )
Snusmumriken
Я пока не видел школ где учат по opencomputers из майнкрампфта, и задачи не мкпфтские а обычные, "школьно/колледже-первокурсные".
Anonymous
посоны, медленная генерация текстового файла из таблички :(
Anonymous
есть способ пофиксить?
Anonymous
peers = { peer = { key=value, key=value, key=value }, peer2= {key=value, key=value } }
Anonymous
for peer,options in pairs(peers) do config = config..peer for k,v in pairs(options) do config = config..k..'='..v..'\n' end end
Alexey
local buf = {} for peer,options in pairs(peers) do buf[#buf + 1] = peer for k,v in pairs(options) do buf[#buf + 1] = k..'='..v..'\n' end end config = table.concat(buf)
B
звините глуп вопрос мож но как оно работает?
B
if val > 1 then return end
Snusmumriken
1. val > 1 - логическое выражение, возвращает true или false. 2. return - прерывает текущую функцию и возвращает из неё nil.
mva
кстати, да. не возвращает ничего. Просто выходит.
mva
> function a() if 2 > 1 then return end end > return a() >
B
я просто решил на love2d глянуть там столкнулся с такой вещицей для ограничения дельты в случае когда мы цепляем окно и апдейт не вызывается делали как то так if dt > 0.040 then return end и вот и стало интересно а как оно работает
B
я просто не въеду дельта постоянно аккумулируеться и когда мы делаем return из чего конкретно мы выходим? love.update(dt) if dt > 0.040 then return end if x > 400 then dir = -1 elseif x < 100 then dir = 1 end x = x + dir * 60 * dt end потому что если : 2. return - прерывает текущую функцию и возвращает из неё nil. то мы же и так не вызываем ее когда таскаем окно
Snusmumriken
я просто не въеду дельта постоянно аккумулируеться и когда мы делаем return из чего конкретно мы выходим? love.update(dt) if dt > 0.040 then return end if x > 400 then dir = -1 elseif x < 100 then dir = 1 end x = x + dir * 60 * dt end потому что если : 2. return - прерывает текущую функцию и возвращает из неё nil. то мы же и так не вызываем ее когда таскаем окно
Нет, это "защита" от слишком кривого fps. Ну, знаешь, когда ты как раз таскаешь окно, кадры не рендерятся, игра ставится на "паузу", но dt как раз аккумулируется. Допустим, ты привязал движение к dt. Прыгнул персонажем, схватил окно мышкой, подержал десять секунд, и в игре - к координатам персонажа прибавился вектор движения умноженный на dt = 10. Персонаж пролетел вверх вообще всю карту, а если есть потолок и коллизия не continious - вообще за пределы карты нафиг.
B
а логика работы куска какая?
Snusmumriken
Но способ кривой, по хорошему, игра должна не зависеть от размера dt, и интегрировать по долям от него, т.е. например подержали окно 10 секунд - обновили игру примерно 30 * 10 раз, или обновили 5 раз, а остальное отбросили, типа пауза.
Snusmumriken
Логика работы - если dt слишком большой - кадр пропускается.
Elias
Ага, fixed delta - самый стабильный и надёжный подход, из моего опыта
Elias
Особенно для физики
Elias
Кратко говоря, зафиксированный dt делится на какой-то fixed dt (например 1/60 секунды для 60 ФПС), и потом столько раз вызывается update
Elias
При этом вместо dt в логике используется 1/60 секунды эти
Snusmumriken
Не совсем. На тормозах, всё остальное тоже начинает тормозить. Если делать dt гибким - должно быть норм, по хорошему. Ну, примерно так: if dt > 0.04 then dt = 0.04 end — будет тормозить только если fps реально низкий, в противном случае, даже если fps = 10000000, оно всё равно не будет ни слишком быстрым, ни слишком медленным.
Elias
Да, при тормозах, когда dt приходит большой, лучше не делать апдейтов, либо ограничивать их количество сверху
Elias
Некоторые крупные игры так делают (может даже много таких) Если что-то тормозит, то они по сути ставятся на паузу, пока не восстановится производительность Не лучший метод, но не ломает игру по крайней мере (иначе можно получить огромный dt и летать через стены)
brestows
Народ, привет, подскажите можно ли подключить lua файл название которого хранится в переменной, например local hostname=gethostname(); require hostname; Как это правильно сделать?
brestows
Аааа
brestows
Скобки етид их