July 21, 2021

Как мы в ICFP Programming Contest 2021 участвовали

Небольшое intro

ICFP Programming Contest - это ежегодный контест, который проходит в предверии международной конференции по функциональному программированию. Контест проходит три дня, в течении которых предлагается решить задачу.

Задача

В этом году предлагалось решить следующую задачу: на вход приходят координаты вершин некой фигуры и список ребер в виде указания идентификаторов точек, которые ребро соединяет. Координаты точек всегда целочисленные. Также на вход передаются координаты дыры и ε, задающая на сколько можно сжимать или растягивать ребро. Требуется путём перемещения точек впихнуть фигуру в дырку, при этом расстояние от вершин дыры до вершин фигуры должно быть как можно меньше. Задача вдохновлена японскими шоу.

В этом году предлагалось решить следующую задачу: на вход приходят координаты вершин некой фигуры и список ребер в виде указания идентификаторов точек, которые ребро соединяет. Координаты точек всегда целочисленные. Также на вход передаются координаты дыры и ε, задающая на сколько можно сжимать или растягивать ребро. Требуется путём перемещения точек впихнуть фигуру в дырку, при этом расстояние от вершин дыры до вершин фигуры должно быть как можно меньше. Задача вдохновлена японскими шоу.

Как решали

Использовали язык C++ и для отображения gnuplot. Gravechapa занимался визуализацией, я солвером.

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

Как итог 133 место. Исходный код можно посмотреть тут: https://github.com/Gravechapa/icfp2021