Pavel Egorov ([info]xoposhiy) wrote,

ICFPC-2010 howto step-by-step by hack-the-loop team

Что за команда и какие результаты читаем тут: http://xoposhiy.livejournal.com/106201.html

Краткая постановка задачи.
Каждая команда может послать на сервер по 72 машинки. Машинки видны всем. Все могут пытаться делать топливо для чужих машинок. За каждое подошедшее топливо капают баллы.

Фишка в том, что про машинку известно только лишь то, что это структурка
List<Tuple<bool, List<int>, List<int>>> 
(с некоторыми дополнительными ограничениями), и что записывается она как-то в виде строки из 0, 1 и 2. Как именно  — не известно! :)
Ещё дан пример корректной машинки:

221022000022010112201010022001122011110220010

Можете попробовать минут 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 баллов. Проверено! :)
Tags: contest

  • Post a new comment

    Error

  • 29 comments

[info]murkt

June 21 2010, 20:20:44 UTC 1 year ago

> 5. Вычислить строку, которая подается сервером на вход фабрике.
X:
:
X

Готово.

Anonymous

June 21 2010, 21:12:10 UTC 1 year ago

скорее X::X - так смысл двоеточия более очевиден

[info]murkt

June 22 2010, 11:06:04 UTC 1 year ago

Хмм... Действительно :) Я о таком смысле даже не задумался.

[info]xoposhiy

June 22 2010, 02:05:25 UTC 1 year ago

Да, с этим я протупил. Но все равно эта штука дает только первые 17 символов. Так что второй перебор, увеличивающий длину известного префикса все же нужен.

[info]thedeemon

June 22 2010, 03:10:09 UTC 1 year ago

Т.е. можно узнать входные символы после 17-го? Как?

[info]xoposhiy

June 22 2010, 09:18:14 UTC 1 year ago

идея основывается на том, что, если на сервере после keyPrefix встретилась первая двойка, а вторая не двойка, то он выдаст сообщение "ожидалась двойка". Перебирая хвосты, мы находим такой, на котором сообщение выдается. Значит на выходе была двойка. Значит можно восстановить, что подавалось на вход.

Как-то примерно так :)
В коде тут: http://code.google.com/p/hack-the-loop/source/browse/trunk/CircuitCalc/PeCalc/ServerInputFinder.cs

[info]murkt

June 22 2010, 11:07:18 UTC 1 year ago

А вы могли бы выложить входные символы дальше 17-го? Просто интересно.

[info]xoposhiy

1 year ago

[info]murkt

1 year ago

[info]thedeemon

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

[info]thedeemon

June 22 2010, 03:05:07 UTC 1 year ago

А донор был в курсе? Или просто молча нашли и позаимствовали?

[info]xoposhiy

June 22 2010, 03:16:55 UTC 1 year ago Edited:  June 22 2010, 03:17:18 UTC

Естественно не был! Я же написал - соревнование по промышленному шпионажу. :)

В какой-то момент я нагуглил 5 чужих репозиториев. Два из них были в итоге выше нас: TBD и thiscodeismade. От обоих я, в частности, знаю пароли. :)

[info]thedeemon

June 22 2010, 05:46:15 UTC 1 year ago

Ай-яй-яй! :)
Хотя вы не единственные, кто так делал, _adept_ тоже признался.

Вот тут кое-какой фидбэк от TBD, thiscodeismade и SzM:
http://www.forumlocal.ru/showflat.php?Board=prog&Number=9571897&fullview=&src=&o=&tistart=20&vc=1&showlite=

[info]olegg_lieangel

June 23 2010, 03:33:13 UTC 1 year ago

Наш (codingmonkeys) в том числе? :)

[info]xoposhiy

June 23 2010, 06:25:32 UTC 1 year ago

Да, но на ваших решениях мы заработали очень-очень мало :)

http://code.google.com/p/hack-the-loop/source/browse/trunk/CircuitCalc/WebClient/SendSpywork_Test.cs

Ваши простые решения мы итак находили сами, а ваши хитрые решения использовали длинную арифметику, которую мы так и не прикрутили за воскресенье (а в понельник уже работали и не играли). Поэтому из бензина не могли сделать собственно фабрику. А сами фабрики вы не коммитили.

[info]last_g

June 22 2010, 04:07:32 UTC 1 year ago

Я придумал несколько схем нетривиальных машинок, к сожалению, я так и не смог пробить Нормализацию в общем случае =(
Хотя в начала игры и было сказано, что - Связность это сложно и надо думать, а нормализовать мы всегда сможем, на деле всё оказалось наоборот. Ибо проверить связность машины, и сделать произвольную машину связной, без изменения принимаемого множества топлив было тривиально.

В защиту наших машинок, могу сказать, что хоть они и были тривиальны, но такой, принципиальный, класс машинок был мало представлен на игре и, на самом деле, не много команд умели их автоматически решать. Хотя машинки не сложно брутфорсились.

[info]an_ger

June 22 2010, 08:42:30 UTC 1 year ago

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

[info]xoposhiy

June 22 2010, 09:23:33 UTC 1 year ago

Да, круто, но...

По правилам метрика "у кого длиннее" задана четко - количество очков. А ты вот изобрел какую-то другую метрику, и утверждаешь, что в ней длиннее у тебя. Это как минимум.... э-э-э... странно. :-D

Я несколько раз переставал думать над идеей машинок, просто потому что понимал, что правильные роботы-перебиральщики тупо приносят больше очков, чем могут принести такие гипотетические чудо-машинки.

[info]an_ger

June 22 2010, 10:44:55 UTC 1 year ago

Не, это я не про себя, к сожалению.
Количество очков непосредственно из этого следует - если ты изобрел 72 машины, топливо к которым знаешь только ты, то тебе с них идет полный профит. Конечно это не отменяет необходимости подбирать топливо к чужим машинам, но прибавка к пенсии неплохая :)

[info]xoposhiy

June 22 2010, 13:17:15 UTC 1 year ago

Я слышал, что Екатеринбуржские Яндексоиды тоже участвовали. ural_nerds - это вы? :)

[info]an_ger

June 23 2010, 07:48:21 UTC 1 year ago

Ага, только из Яндекса я там один был.

[info]an_ger

1 year ago

[info]xoposhiy

1 year ago

[info]xoposhiy

June 22 2010, 09:24:23 UTC 1 year ago

хотя через сутки после начала мы технически не могли придумывать машинки, потому что не умели их даже читать. :)

[info]hackbnw

June 24 2010, 18:05:50 UTC 1 year ago

у вас блоки не оптимальны были.. можно сделать 1 трит - из одного блока и два других из двух..

[info]xoposhiy

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/EddyTworek]iui clomid[/url] comes to affordable, effective [url=http://www.archive.org/details/OthaBorom]neurontin lawyer[/url] health care reform in America, there's only one [url=http://www.archive.org/details/RemediosCajas]generic cialis super active[/url] question that really needs to be asked right [url=http://www.archive.org/details/MindiHemon]levitra 10 mg[/url] now: What works?
In other words, what works to keep people healthy? What's affordable, [url=http://www.archive.org/details/SharondaObert]amoxicillin 500 mg capsules[/url] safe and supports the long-term health of the [url=http://www.archive.org/details/DarcelPorowski]generic cialis super active[/url] population? What's available right [url=http://www.archive.org/details/CathieZamborsky]furosemide 4 mg[/url] now that can help people get healthy and remain healthy?
Those answers aren't difficult. They're found, in fact, [url=http://www.archive.org/details/ChangMollica]celebrex pricing[/url] in the [url=http://www.archive.org/details/BrandaCrutchley]generic cialis super active[/url] fresh produce section of every grocery store in America, and even more answers are found in the dietary supplement sections [url=http://www.archive.org/details/RoseannePinnell]order prednisone without a prescription[/url] of health food stores. In America today, we don't have a lack of good answers to [url=http://www.archive.org/details/JesusHaist]alternative thyroid treatment[/url] the current health care crisis; what we have is too many people asking the wrong questions!
Instead of asking, "What works?" we have health care reform lobbyists [url=http://www.archive.org/details/RettaMerati]levitra generico[/url] and pharmaceutical pushers [url=http://www.archive.org/details/LashayOgata]generic cialis[/url] putting their efforts into a completely different [url=http://www.archive.org/details/DelSagrera]generic cialis super active[/url] question: "What's profitable?"
The entire [url=http://www.archive.org/details/IanArrambide]side effects medicine[/url] health care reform conversation taking place today is based around that question: What's profitable? [url=http://www.archive.org/details/SandyDaponte]buy wellbutrin sr[/url] How can we make the most money by [url=http://www.archive.org/details/ChanSilberg]generic cialis super active[/url] requiring the most people to participate in our [url=http://www.archive.org/details/GalinaMalacara]priligy generico[/url] profit-making system? That's the real reason behind [url=http://www.archive.org/details/BilliHyrkas]discount renova[/url] mandatory health insurance [url=http://www.archive.org/details/CollettePoncio]generic cialis super active[/url] requirements, by the way.
But what if we [url=http://www.archive.org/details/ChiFiddler]generic cialis super active[/url] threw out everything we [url=http://www.archive.org/details/TodTeixeria]purchase strattera[/url] think we know about health care right [url=http://www.archive.org/details/StevieSandland]kamagra dosage[/url] now [url=http://www.archive.org/details/TeresiaKirscht]kamagra[/url] and [url=http://www.archive.org/details/GwendaWaldoch]singulair medication[/url] started from scratch? Toss [url=http://www.archive.org/details/EmeraldCanel]order cytotec[/url] out the current complex system of [url=http://www.archive.org/details/CherylBalcitis]generic viagra soft[/url] failed treatments, failed insurance plans and the monopolistic practices that dominate western today. What [url=http://www.archive.org/details/GregoryCarbonneau]levitra prix[/url] if we started with a blank slate?
[url=http://www.archive.org/details/MichelUttley]furosemide or lasix[/url]

Anonymous

November 2 2011, 11:17:44 UTC 6 months ago

кредит руский стандарт

http://google.com/
Create an Account
Forgot your login or password?
Facebook Twitter More login options
English • Español • Deutsch • Русский…