Alex Фэils?︙
07.06.2016
14:20:48
это которые по их баг-трекеру
Snusmumriken
07.06.2016
14:25:47
Я, если честно, хотел бы в качестве фич к следующей версии больше метаметодов, возможность переопределения типов таблиц и прочей лабуды.
В общем, превращение таблицы во что угодно.
И так делаю ООП в смешном стиле, с конструктором объекта в __call-метаметоде класса.
Плюшка
07.06.2016
14:32:56
я делаю в стиле JS
Google
Плюшка
07.06.2016
14:33:16
MyClass = function(a,b,c)
...
end
Snusmumriken
07.06.2016
14:33:55
А методы?
Плюшка
07.06.2016
14:34:06
методы класса?
Snusmumriken
07.06.2016
14:34:10
Ага
Плюшка
07.06.2016
14:34:12
хз
я пока не юзал
Snusmumriken
07.06.2016
14:34:59
Хм. Ну вот, например, методы.
Плюшка
07.06.2016
14:35:36
просто у меня ничего серьёзного на луа нет
я пилил одну либу для OC
но забросил
Мерлин
07.06.2016
14:36:26
А в 5.3 integer вроде есть?
Snusmumriken
07.06.2016
14:36:34
Дальше можно:
c = require 'constructor'
d = c:new('int', 10, 20)
Есть но не нужно.
Даблов хватает же.
Google
Snusmumriken
07.06.2016
14:38:17
Ну, если добавить лишний метаметод конструктору, то вместо
d = c:new('int', 10, 20)
Можно писать
d = c('int', 10, 20)
Типа вызов таблицы как функции.
Люблю такие штуки.
Минимизируется куча фигни.
Alejandro
07.06.2016
14:51:07
Alex Фэils?︙
07.06.2016
14:51:43
Snusmumriken
07.06.2016
14:52:15
Это уже есть. Метаметод __call.
Alejandro
07.06.2016
14:53:11
Выпустили новую версию, что изменилось? Добавили новые неизвестные баги.
Snusmumriken
07.06.2016
14:54:01
Ага.
И не исправили ещё не обнаруженные, потому что их НЕ НАШЛИ.
The Dude
07.06.2016
14:54:31
Мне кажется дальше 5.1 в луа ничё не поменялось.
И будет он как питон 2.7 ещё 3000 лет.
Alejandro
07.06.2016
14:55:18
В 5.2 чото добавляли важное
The Dude
07.06.2016
14:56:05
Нужно ещё только в луагите 2 гига лимит фиксануть.
Snusmumriken
07.06.2016
15:21:16
На тему метаметодов, которые сейчас есть.
Ну, это просто самое типичное. Через это легко сделать, например, свою длинную арифметику, или свой класс строк.
На тему функций которые добавили в lua 5.2-5.3, есть метаметоды типа __pairs, которые вызываются при проходе по таблице. Это очень удобно. Возможность легко делать хеш-таблицы с заданным порядком (не только сортирующиеся в процесе).
Свои итераторы кто-нибудь мутил?
The Dude
07.06.2016
15:36:56
@Snusmumriken расскажи что пишешь на луа?
Snusmumriken
07.06.2016
15:38:45
О, кстати, задачка на алгоритмическую сообразительность.
Есть список объектов.
Надо пройти по списку, и удалить часть объектов, которые соответствуют некоторому условию. Как это сделать в один проход, без ошибок выхода за пределы списка и без пропуска элементов?
Google
Snusmumriken
07.06.2016
15:38:52
@Snusmumriken расскажи что пишешь на луа?
Всё что нужно.
Игрушки, сетевые либы, пакеры, пробиватели NAT. Даже веб-сервер на коленке. С другой стороны, гитхаба у меня нет, и я могу давать линк только на свой гугл-драйв.
The Dude
07.06.2016
15:41:02
Alex Фэils?︙
07.06.2016
15:42:34
Snusmumriken
07.06.2016
15:43:17
А чего не заведешь?
Лень обыкновенная. И я пишу одновременно на куче компьютеров, одни и те же файлы. Синхронизация гугл-драйва - самое удобное.
The Dude
07.06.2016
15:44:44
Snusmumriken
07.06.2016
15:46:03
Не использую плагинов.
Зиробрейн неплох, но я пишу на большом количестве языков. Notepad++.
Alex Фэils?︙
07.06.2016
15:46:10
Snusmumriken
07.06.2016
15:46:34
Давай :3
Считай что тебе надо стереть часть динамического вектора. Ну, или динамического же списка. Если брать самый грубый вариант, количество строк то же что и у обычного цикла.
Мерлин
07.06.2016
15:47:36
Snusmumriken
07.06.2016
15:49:54
оч нужно
У тебя есть хотя бы один комп с белым айпи?
Мой NAT pusher регистрирует пользователя по udp, поддерживая соединение, и на запрос об айди выдает реальный айпишник.
Формат сообщений - json.
Uncel
07.06.2016
15:50:05
В dynasm avx-512 завезли?
Мерлин
07.06.2016
15:50:26
Disinterpreter
07.06.2016
15:50:41
Мерлин
07.06.2016
15:51:02
Snusmumriken
07.06.2016
15:51:06
Не совсем прокся. Через эту 'проксю' только получаем адрес и линкуемся напрямую.
Зато оно может обслуживать кучу всего, выдавать список серверов по маске id и так далее.
Главное - чтобы твое приложение отвечало на пинги хоть чем-то, иначе оно будет убито.
Я буду чутка его перепиливать в сторону масштабируемости на манер DNS-сетей.
Совсем напрямую обход NAT невозможен
Google
Snusmumriken
07.06.2016
15:56:06
с v6 работает?
Luasocket не работает с ipv6.
Да и когда его таки распространят, надобность в моём пушере отвалится. Use teredo, Luke.
Через тередо - работает.
Alex Фэils?︙
07.06.2016
15:56:24
надо б им патч выслать)
Snusmumriken
07.06.2016
15:58:34
Примеров решения простой задачки не будет? :3
Alex Фэils?︙
07.06.2016
16:00:12
чтоб ипв6 работал)
Snusmumriken
07.06.2016
16:02:02
чтоб ипв6 работал)
Сложна. Это надо высылать конкретно в kepler project, которые занимаются разработкой luasocket.
Слегка обидно что они заблокировали по умолчанию работу с serial port, можно было бы пилить, например, bluetooth-софтины.
А разбирать и перекомпилировать лень.
Alex Фэils?︙
07.06.2016
16:03:23
template <typename T>
struct list {
T val;
list *next;
}
// допустим, что в типе T есть функция bool remove_condition_is_true()
//
template<typename T>
void rm_elem_from_list(list<T> &l)
{
list *tmp = &l;
list *last = &l;
while(tmp->next != 0) {
if (tmp->val->remove_condition_is_true()) {
last->next = tmp->next;
} else {
last = tmp;
}
tmp = tmp->next;
}
Snusmumriken
07.06.2016
16:04:00
Молодец. Но сложна :3
Мерлин
07.06.2016
16:04:58
Snusmumriken
07.06.2016
16:07:41
Фактически, это аналог данного
Можно проще
Мерлин
07.06.2016
16:09:22
Я бы так делать не стал
Snusmumriken
07.06.2016
16:09:34
Почему?
Что бы ты стал делать?
Мерлин
07.06.2016
16:16:01
Потому что сложность table.remove( . ) - O(n)
То есть чтобы удалить первый элемент в таблице из тысячи записей, эта функция переберёт 999 элементов
Я бы сделал как-то так
local l = newlist {1, 2, 3, 4, 5, 6} --какая-нибудь релизация контейнера двунаправленного списка из миллиона существующих. Или написал бы сам урезаную версию в четыре строки
local curr
while curr do
if not isvalid(curr.val) then
curr.remove()
end
curr = curr.next()
end
Вот эта штука curr.remove() (удаление из списка) имеет сложность порядка O(1), то есть не зависит от длины списка
Snusmumriken
07.06.2016
16:19:45
Ок, тогда не
while i < #t
а
while i <= #t.
Переберём все элементы.
У тебя сложность чуть выше, потому что лишнее условие.
На деле, можно сделать еще проще, как для восприятия, так и по длине строк.
Просто чуть-чуть подумать.
Мерлин
07.06.2016
16:21:31
Snusmumriken
07.06.2016
16:21:31
Ответ:
for i = #t, 1, -1 do
if (valid) then table.remove(t, i) end
end
Мерлин
07.06.2016
16:21:52
Проще для понимания =/= правильно
Snusmumriken
07.06.2016
16:22:04
Ответ правильный.
Проверь.
Работает лучше всего.
Мерлин
07.06.2016
16:22:18
Это работает
Но работает фигово
Google
Мерлин
07.06.2016
16:22:34
Потому что удалять из массива воообще неправильно
За это на собеседованиях руки отрывают
И правильно делают
Это не демагогия, а факт
Ты ведь знаешь как работает table.remove ?
Она сдвигает ** каждый ** элемент выше удаляемого на одну позицию вниз
Неужели так сложно rtfm?
Snusmumriken
07.06.2016
16:24:39
Да, физически не сдвигает, если что.
Меняет порядок слабых связей в лишней табличке ответственной за порядок
The Dude
07.06.2016
16:25:35
А как, кстати, в луа сразу задать размер массива?
Понятное дело динамика, но чтобы сразу памяти отхапать.
Мерлин
07.06.2016
16:26:36
А те что ниже не трогает.
И что?
В среднем при равномерном распределении удаляемых элементов тебе придётся сдвинуть N/2 элементов
Snusmumriken
07.06.2016
16:27:30
The Dude
07.06.2016
16:27:45
Snusmumriken
07.06.2016
16:27:50
И скок это?
Делаешь пустой список на n элементов.
Байты зависят от длины. Пустая таблица 50000x30000 весит полтора гига.
The Dude
07.06.2016
16:28:16
Сколько пустая таблица байтов?
Мерлин
07.06.2016
16:28:44
Не физически же.
Ну двигет она указатели вместо флоатов и что?
Разница минимально, всё равно надо переназначить N/2 указателей
The Dude
07.06.2016
16:28:56
Ну тогда задачу можно решить просто чекрм.