Краткая постановка задачи.
Каждая команда может послать на сервер по 72 машинки. Машинки видны всем. Все могут пытаться делать топливо для чужих машинок. За каждое подошедшее топливо капают баллы.
Фишка в том, что про машинку известно только лишь то, что это структурка
List<Tuple<bool, List<int>, List<int>>> (с некоторыми дополнительными ограничениями), и что записывается она как-то в виде строки из 0, 1 и 2. Как именно — не известно! :)
Ещё дан пример корректной машинки:
2210220000220101122010100220011220111102
Можете попробовать минут 5 погадать, как из этого сделать
List<Tuple<bool, List<int>, List<int>>> . У меня на это ушла вся ночь с субботы на воскресенье, плюс у меня была возможность тестировать свои версии машинок на сервере, плюс у меня была подсказка помощь зала. :-)Топливо для машинки - это список матриц натуральных чисел. Он тоже как-то кодируется с помощью 0 1 2. Как - тоже не известно! И даже примера нет! :-о
Более того посылать на сервер нужно не топливо, а фабрику его производящую. Фабрика - это сеть с одним входом и одним выходом, состоящая из гейтов с двумя входами и двумя выходами. Гейты упорядочены. Дуги, соединяющие гейты от младшего к старшему передают сигнал мгновенно. Дуги в обратную сторону дают задержку в один такт. Фабрике на вход подается какая-то строка из 0 1 2, а на выходе должен быть секретный префикс, за которым следует описание топлива.
Так вот. Как кодировать фабрику, по какому принципу работают гейты, что подается на вход сети и какой секретный префикс — не известно! =:-O
Все эти "догадайтесь сами" офигенно выбивают почву из-под ног. Просто огромное количество неопределенностей. По всей видимости условие оттолкнуло очень многих участников, а зря! На самом деле все, до чего надо было догадаться было устроено самым простым и логичным образом, до которого действительно не сложно догадаться.
Теперь к самому интересному. Что надо было делать, чтобы набрать много-много баллов?
По порядку:
1. Разобраться с кодированием фабрик. Это тривиально, но мы тупили около часа.
2. Как-то догадаться до принципа работы гейта. На это у нас ушло в общей сложности часов 7. За это время мы вручную построили 18 специальных фабрик, которые при запуске на сервере дали нам данные для двух заветных табличек. Это было тяжко, но мы справились. Некоторые команды как-то автоматизировали этот процесс брутфорсиком. Ну, молодцы. :)
3. Реализовать выполнятор фабрик. Когда известно, как работает гейт — дело техники.
4. Найти секретный ключевой префикс, с которого должно начинаться любое топливо.
5. Вычислить строку, которая подается сервером на вход фабрике. Я это делал брутфорсиком, а потом ещё одним перебором с участием сервера. Впрочем в зависимости от реализации п.5, этот пункт может быть лишним. :)
6. Придумать (2 часа), реализовать (ещё полтора часа) и отладить (ещё почти час) алгоритм построения фабрики для любого заданного бензина. Мы собирали фабрику из последовательных блоков. Один блок имеет один вход и один выход и обладает такими двумя свойствами: (1) на первом ходе выдает фиксированное заданное число, при условии, что на вход придет 0 (в входом будет обратная дуга, так что придет первым всегда 0); (2) выводом на (i+1)-ом ходе этого блока можно управлять подавая нужные сигналы на вход на i-ом шаге.
Всего таких блоков было три вида:
0L: X0R0#X0R: 0L 1L: 0L1R0#0L1R, X0R0#X0R: 1L 2L: 0L2R0#0L1R, 1R0R0#2R1L, X1L0#X0R: 2L
Размер фабрики получался O(длина_топлива).
В целом все это базируется на динпрожике, который определяет, из каких блоков строить фабрику, и на хитром алгоритме стыковки входов и выходов этих блоков. Последний доставил нам особенно много радости при отладке.
Для работы этого алгоритма нужно знать, что сервер нам будет подавать на вход.
Как альтернатива, можно было изобрести "обнуляющий блок", который затирал бы то, что подается на вход. Но на этот подвиг нас не хватило. Против этого подхода было ещё и соображение оптимальности фабрики — без обнулятеля фабрика будет короче.
7. Закоммитить, наконец, топливо для нулевой машинки! Мы это сделали лишь через 27 часов после начала контеста.
8. Разобраться в синтаксисе Ternary Streams. На это у нас ушло охрененно много времени и без подсказки (см выше) я, может быть и не справился бы. Короче, спасибо донору.
9. Написать автоматический сабмитер топлива на сервер и автоматический скачивальщик списка машинок с сервера. Сделать какой-то учет того, что и с каким результатом посылалось. Нормальный учет у нас появился лишь вечером воскресенья. А логиниться мы своих роботов так и не научили (мы просто жестко ступили - перепутали адрес по которому нужно пароль с логином постить), поэтому приходилось при каждом перезапуске сервера заново логиниться вручную, вытаскивать из куки JSESSIONID и подправлять его у всех роботов. Ей богу, как лохи последние! :)
10. Начать отправлять для всех машинок разные простые виды топлива. Так решалось около трети всех машинок. После этого вы уже довольно круты.
11. Написать валидатор, который проверяет подходит ли топливо к машинке без сабмита топлива на сервер. Можно прикрутить его к п.10, чтобы откровенную лажу даже не пытаться отправлять. Осознать, что внутри валидатор будет оперировать большими числами и прикрутить длинную арифметику. Этого мы так и не сделали до конца контеста. В результате на выходе нашего валидатора на самом деле было три значения: "подходит", "не подходит" и "не знаю". :)
12. Придумать алгоритм подбора топлива к машинке и начать массово подбирать топлива к еще нерешенным машинкам. Мой тупой брутфорсик давал результаты не лучше, чем алгоритм из п.10. Придумывать и писать что-то умнее уже не было ни времени, ни силы духа.
13. Где-то параллельно с этим всем, придумать генератор хоть сколько нибудь нетривиальных машинок и засабмитить, наконец, свои 72 машинки. Мы это сделали лишь за 3 часа до конца. Да и то, наши машинки были довольно тривиальными. По хорошему надо было их сабмитить хотя бы за сутки до конца, но мы надеялись придумать нетривиальные схемы машинок.
14. Параллельно с этим можно было искать на code.google.com, github.org и в других подобных местах репозитории других команд и зырить! Назыренное методично отправлять на сервер в качестве решений. Можно даже часть этой работы автоматизировать. И даже не говорите мне, что я читер! :-D
Следуя (даже не очень строго) этому алгоритму можно было набрать более 1000 баллов. Проверено! :)
June 21 2010, 20:20:44 UTC 1 year ago
Готово.
Anonymous
June 21 2010, 21:12:10 UTC 1 year ago
June 22 2010, 11:06:04 UTC 1 year ago
June 22 2010, 02:05:25 UTC 1 year ago
June 22 2010, 03:10:09 UTC 1 year ago
June 22 2010, 09:18:14 UTC 1 year ago
Как-то примерно так :)
В коде тут: http://code.google.com/p/hack-the-l
June 22 2010, 11:07:18 UTC 1 year ago
1 year ago
1 year ago
June 22 2010, 11:53:38 UTC 1 year ago
Anonymous
June 21 2010, 21:07:25 UTC 1 year ago
насчет гейтов: моя команда решила обнулять весь входящий поток, и создать генераторы для выходящих последовательностей.
в итоге, у нас были гигантские фабрики )) кстати, насчет обнуляющей - у нас получилось ее сделать из 6-ти гейтов, ее кода я не помню, а вот из 9-ти (первая версия):
1R:
8R0L0#0R1L,
0RX0#2L2R,
1L1R0#X3R,
5L2R0#7R5L,
5R4L0#4R5R,
3R4R0#3L4L,
8L6L0#6R7L,
6R3L0#8L8R,
7L7R0#6L0L:
2L
June 22 2010, 03:05:07 UTC 1 year ago
June 22 2010, 03:16:55 UTC 1 year ago Edited: June 22 2010, 03:17:18 UTC
В какой-то момент я нагуглил 5 чужих репозиториев. Два из них были в итоге выше нас: TBD и thiscodeismade. От обоих я, в частности, знаю пароли. :)
June 22 2010, 05:46:15 UTC 1 year ago
Хотя вы не единственные, кто так делал, _adept_ тоже признался.
Вот тут кое-какой фидбэк от TBD, thiscodeismade и SzM:
http://www.forumlocal.ru/showflat.php?B
June 23 2010, 03:33:13 UTC 1 year ago
June 23 2010, 06:25:32 UTC 1 year ago
http://code.google.com/p/hack-the-l
Ваши простые решения мы итак находили сами, а ваши хитрые решения использовали длинную арифметику, которую мы так и не прикрутили за воскресенье (а в понельник уже работали и не играли). Поэтому из бензина не могли сделать собственно фабрику. А сами фабрики вы не коммитили.
June 22 2010, 04:07:32 UTC 1 year ago
Хотя в начала игры и было сказано, что - Связность это сложно и надо думать, а нормализовать мы всегда сможем, на деле всё оказалось наоборот. Ибо проверить связность машины, и сделать произвольную машину связной, без изменения принимаемого множества топлив было тривиально.
В защиту наших машинок, могу сказать, что хоть они и были тривиальны, но такой, принципиальный, класс машинок был мало представлен на игре и, на самом деле, не много команд умели их автоматически решать. Хотя машинки не сложно брутфорсились.
June 22 2010, 08:42:30 UTC 1 year ago
June 22 2010, 09:23:33 UTC 1 year ago
По правилам метрика "у кого длиннее" задана четко - количество очков. А ты вот изобрел какую-то другую метрику, и утверждаешь, что в ней длиннее у тебя. Это как минимум.... э-э-э... странно. :-D
Я несколько раз переставал думать над идеей машинок, просто потому что понимал, что правильные роботы-перебиральщики тупо приносят больше очков, чем могут принести такие гипотетические чудо-машинки.
June 22 2010, 10:44:55 UTC 1 year ago
Количество очков непосредственно из этого следует - если ты изобрел 72 машины, топливо к которым знаешь только ты, то тебе с них идет полный профит. Конечно это не отменяет необходимости подбирать топливо к чужим машинам, но прибавка к пенсии неплохая :)
June 22 2010, 13:17:15 UTC 1 year ago
June 23 2010, 07:48:21 UTC 1 year ago
1 year ago
1 year ago
June 22 2010, 09:24:23 UTC 1 year ago
June 24 2010, 18:05:50 UTC 1 year ago
June 25 2010, 05:28:38 UTC 1 year ago
У меня почему-то сработал рефлекс "перебор всех фабрик — это сложно. запутаемся", и перебора мы даже не думали писать. После окончания контеста, почитав чужих отчетов, я подумал как бы можно было написать такой перебор и понял, что пишется он тривиально. Ну, вот, да, ложное срабатывание рефлекса.
Anonymous
July 15 2011, 08:19:36 UTC 10 months ago
generic cialis super active
When it [url=http://www.archive.org/details/EddyIn other words, what works to keep people healthy? What's affordable, [url=http://www.archive.org/details/Shar
Those answers aren't difficult. They're found, in fact, [url=http://www.archive.org/details/Chan
Instead of asking, "What works?" we have health care reform lobbyists [url=http://www.archive.org/details/Rett
The entire [url=http://www.archive.org/details/IanA
But what if we [url=http://www.archive.org/details/ChiF
[url=http://www.archive.org/details/Mich
Anonymous
November 2 2011, 11:17:44 UTC 6 months ago
кредит руский стандарт
http://google.com/