
Aragaer
17.12.2016
06:30:56
наверно будет быстрее
каждому состоянию соответствует число, каждому числу состояние. Один к одному
и на тему распространения волны - в моем случае проходит 57 итераций волны, на 30-40-х волнах каждая итерация это по 150-200 тысяч состояний
новых

Google

Aragaer
17.12.2016
06:34:11
а, ну да, вместо массива размером 2^30 можно взять например хэш, который будет расти по мере необходимости. Но на С это написать сложнее, чем маллоком выделить гиг 8)

Maxim robox
17.12.2016
06:35:48
У меня почему-то на третьей волне всё стопорится. Кончаются ходы. Не могу понять, почему.

Aragaer
17.12.2016
06:36:01
хм. Вообще да, выделять по байту на каждое состояние это перебор, достаточно выделять по биту, но тогда надо как-то сохранять фронт
в 11-й?

Maxim robox
17.12.2016
06:36:33

Aragaer
17.12.2016
06:36:45
попробуй на том примере, который приведен. Он точно решается и его можно отлаживать

Maxim robox
17.12.2016
06:36:57
На нём и делаю.

Amaro
17.12.2016
06:37:09
Сделал.

Maxim robox
17.12.2016
06:37:43
Чувствую, что где-то какая-то мелкая ошибка в коде. Но не могу её найти.

Aragaer
17.12.2016
06:38:06
показывай код, поищем 8)
гипотеза - ты не спускаешься вниз

Amaro
17.12.2016
06:39:41
В 11 задаче прикол такой: если делать все возможный состояния, то их для первой части 250000 с плюсом. Если сделать матрицу возможных переходов - то не хватит памяти (62 500 000 000), а если проверять их на лету тупо на каждой волне - то очень долго. Поэтому не надо делать все возможные состояния =) И на каждой волне надо тупо проверять все доступные ходы, тогда считается за приемлемое время.
Ну и состояния надо хранить в целых числах, по два бита на номер этажа, иначе списки/туплы/словари тоже очень добавляют времени.

Google

Aragaer
17.12.2016
06:42:18
мм. Не, у меня нет никакой матрицы переходов

Artem
17.12.2016
06:42:33
* но и туплы с булами нормально заходят, на самом деле

Aragaer
17.12.2016
06:42:53
просто я могу из одного любого состояния (то есть числа от 0 до 2^30) сгенерить все остальные состояния, в которые можно перейти.
и это я делаю в рантайме

Maxim robox
17.12.2016
06:43:51
Ну у меня пока что set это этаж, а tuple — весь завод. Но я пока что не в это упираюсь.

Aragaer
17.12.2016
06:44:22
код покажи 8)
кстати да, количество состояний можно уменьшить засчет того, что пары на самом деле взаимозаменяемы

Maxim robox
17.12.2016
06:46:24
Положительное число — генератор. Отрицательное — чип.

Aragaer
17.12.2016
06:51:04
у тебя элементы сетов - списки

Maxim robox
17.12.2016
06:51:20

Aragaer
17.12.2016
06:51:52
принт печатает
set([])
вот такое вот

Maxim robox
17.12.2016
06:54:12

Aragaer
17.12.2016
06:55:19
$ python santa11.py
(0, 7, (set([]), set([]), set([-2]), set([1, 2, -1])))
(1, 21, (set([]), set([-2]), set([]), set([1, 2, -1])))
(2, 43, (set([-2]), set([]), set([]), set([1, 2, -1])))
(3, 43, (set([-2]), set([]), set([]), set([1, 2, -1])))
просто запустил
на старте у тебя лифт на 3-м этаже, на финише - на нулевом
а, ты с конца ищешь

Maxim robox
17.12.2016
06:58:40
set([])
Походу, это обозначение пустого сета у тебя.
Хотя у меня оно set(). Python 3

Google

Aragaer
17.12.2016
06:59:31
а, сейчас третьим попробую
угу
field не включает положение лифта
а, field это объект класса Facility
чот _str_ не работает
во
ты действительно не уезжаешь на лифте обратно

Maxim robox
17.12.2016
07:05:33

Aragaer
17.12.2016
07:08:02
да
вот короче чо
вот я распечатываю все мувы

Aragaer
17.12.2016
07:08:23
и вот начало
-1: (set(), set(), set(), {1, 2, -1, -2}) [3]
go down from 3
0 7 0: (set(), set(), set(), {1, 2, -1, -2}) [3],-1: (set(), set(), {1, 2}, {-2, -1}) [2],-1: (set(), set(), {1, -1}, {2, -2}) [2],-1: (set(), set(), {2, -2}, {1, -1}) [2],-1: (set(), set(), {-1, -2}, {1, 2}) [2],-1: (set(), set(), {-1}, {1, 2, -2}) [2],-1: (set(), set(), {-2}, {1, 2, -1}) [2]
-1: (set(), set(), {1, 2}, {-2, -1}) [2]
go up from 2
go down from 2
-1: (set(), set(), {1, -1}, {2, -2}) [2]
go up from 2
go down from 2
то есть go down генерит новые мувы, а go up нет

Maxim robox
17.12.2016
07:09:44

Aragaer
17.12.2016
07:10:59
мхмм...
не, чот не то
стоп
все верно, он генерит мувы

Google

Aragaer
17.12.2016
07:11:18
но такие уже были
если мы от финиша будем придумывать новые мувы, то они конечно всегда будут повторяться - ты не учитываешь положение лифта
... ща
Already seen move -1: (set(), set(), {-1}, {1, 2, -2}) [3]
это на втором шаге и это ложь - такого мува раньше невозможно было увидеть
ага, вижу непонятную штуку
на втором шаге почему-то среди possible moves есть мувы с переездом на третий этаж

Maxim robox
17.12.2016
07:17:33
И остальные добавляю.

Aragaer
17.12.2016
07:19:12
да, теперь понял

Admin
ERROR: S client not available

Maxim robox
17.12.2016
07:19:23

Aragaer
17.12.2016
07:20:36
вот ... по-моему это лишнее
в каждой волне должны быть только шаги этой волны
вон как я сегодняшнюю задачу делал

Maxim robox
17.12.2016
07:20:58
Я сегодняшнюю не читал.
Или я не уловил идею.

Aragaer
17.12.2016
07:21:49
я чуть выше кидал ссылку на решение. opaths это список всех состояний предыдущей волны, paths - список состояний этой волны. Каждая итерация - opaths = paths; paths = []
ну .. в сегодняшней задаче повторения есть

Google

Maxim robox
17.12.2016
07:22:17
Я, кажется, догадываюсь, где ошибка.
Я правильно понимаю следующее? В fields теоретически не должно быть одинаковых состояний элементов + лифта?
Но может быть такое, что состояние элементов одинаковое, а лифт на другом этаже?

Aragaer
17.12.2016
07:24:24
да

Maxim robox
17.12.2016
07:24:42
У меня вот эта проверка на существование этого состояния никак не проверяет лифт. Проверяет только элементы.

Aragaer
17.12.2016
07:24:48
поэтому у меня 30 бит - 2 бита на лифт, 28 бит это 7*2*2

Maxim robox
17.12.2016
07:25:12
И, соотстветственно, отбрасывает потенциально хорошее состояние.

Aragaer
17.12.2016
07:25:46
именно
я поэтому и не вижу варианта "отвез 1 штуку на 3-й этаж и вернулся на 4-й" в списке мувов
New possible move -1: (set(), set(), {-1}, {1, 2, -2}) [0] 3
это есть
но на следующей итерации этого мува нет
ну да, у тебя происходит сравнение объектов как сравнение туплов, то есть туплы и сеты
а лифт не является частью тупла

Maxim robox
17.12.2016
07:28:09
Сейчас на «пятый» этаж запихаю индекс лифта тогда.

Aragaer
17.12.2016
07:28:58
вот, победа
не, метод _eq_ пропиши

Maxim robox
17.12.2016
07:29:14
А, точно.

Aragaer
17.12.2016
07:29:17
def __eq__(self, other):
return super(Facility, self).__eq__(other) \
and self.elevator_position == other.elevator_position

Maxim robox
17.12.2016
07:35:19
Запустил считать puzzle_input.
Чувствую, что сейчас упрётся во что-нибудь.
Хотя не. Там же в пямять ничто не упирается. Только CPU
@aragaer ответ на первую часть где-то в районе 30-40 же?

Aragaer
17.12.2016
07:37:42
Your puzzle answer was 33.
кстати у тебя оно делает лишние ходы похоже