Задание

Необходимо написать программу, которая:

  1. Запрашивает у серверной части входные данные для тестов.
  2. Выполняет тесты. В каждом тесте должен быть вычислен прямоугольник с минимальной площадью, который включает в себя все заданные круги. Стороны искомых прямоугольников должны быть параллельны осям координат.
  3. Отправляет на сервер результаты и выводит итоговое сообщение об успешности прохождения тестов.

Пример прямоугольника с минимальной площадью содержащий заданные круги

Входные данные - заданы два круга:

  1. Координаты центра: -6, 8, радиус: 2
  2. Координаты центра: 10, 2, радиус: 4

Challenge 2017.07. 02
Искомым решением будет прямоугольник, который можно описать двумя точками:

Описание API серверной части

Запрос

Общение с сервером происходит POST запросами по следующему url-у: http://contest.elecard.ru/api.

В теле запроса должен находиться json следующего вида:


{
  "key":API_KEY_STRING,
  "method":METHOD_NAME,
  "params":METHOD_PARAMS_OBJECT
}
      

Ответ

Метод GetTasks

Метод не требует параметров. Пример запроса:


{
  "key":"QwH213254532341236GB3423423423423LB8A==",
  "method":"GetTasks",
  "params":null
}
      

METHOD_RESULT_OBJECT в ответе представляет из себя массив с параметрами для тестов.
Параметры для индивидуального теста - это еще один вложенный массив (список) объектов, описывающих круги:


{
  "x": 4,
  "y": 6,
  "radius": 2
}
      

Пример ответа:


{
  "result": [
    [ //Test #1 circles
      {
        "x": 0,
        "y": 0,
        "radius": 0
      }
    ],[ //Test #2 circles
      {
        "x": -0.4,
        "y": 2.2,
        "radius": 15
      }
    ],[ //Test #3 circles
      {
        "x": 1.6,
        "y": 2.1,
        "radius": 98
      },
      {
        "x": 1.6,
        "y": -0.8,
        "radius": 78
      }
    ],[ //Test #4 circles
      {
        "x": -3151.5,
        "y": 408.7,
        "radius": 739
      },{
        "x": -712.9,
        "y": -1439.4,
        "radius": 788
      },{
        "x": 2990.7,
        "y": -2141.1,
        "radius": 461
      }
    ]
  ]
}
      
В данном примере показаны параметры для четырех тестов. В реальности их будет 9.

Метод CheckResults

METHOD_PARAMS_OBJECT должен представлять из себя массив с результатами для каждого теста. Результаты должны идти в том же порядке, в котором сервер выдал параметры для тестов.
Результат для отдельного теста выглядит следующим образом:


{
  "left_bottom":{"x":X2_COORDINATE,"y":Y2_COORDINATE},
  "right_top":{"x":X1_COORDINATE,"y":Y1_COORDINATE}
}
      
Пример запроса (для двух тестов):

{
  "key":"QwH213254532341236GB3423423423423LB8A==",
  "method":"CheckResults",
  "params":[
    {
      "left_bottom":{"x":0,"y":0},
      "right_top":{"x":1,"y":0}
    },{
      "left_bottom":{"x":-15.4,"y":-12.8},
      "right_top":{"x":14.6,"y":17.2}
    }
  ]
}
      

METHOD_RESULT_OBJECT представляет из себя массив со статусами проверки результатов (true - тест пройден, false - тест не пройден). Пример ответа:


{
  "result": [
    false,
    true,
  ]
}
      

Требования

Язык программирования: Ruby|GoLang|PHP.

Крайний срок выполнения задания - 1 неделя с момента получения задания.

После успешного прохождения всех тестов, высылайте свой проект. Github приветствуется.

На заметку

Update #1:

Сервер при проверке результатов оперирует точными значениями, без округления. Т.е. сервер не зачтёт результат правильным если: Такие проблемы могут возникнут в тестах №8 и №9. Если на решение данной проблемы у Вас уходит слишком много времени (более 2-х часов), то оставляйте как есть - я зачту решение.

Update #2:

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

Контакты

По поводу ошибок, за дополнительной информацией и прочее пишите письма: Anton.Sergeev@elecard.ru.