Skip to content

Instantly share code, notes, and snippets.

@bagart
Created September 12, 2022 11:39
Show Gist options
  • Save bagart/a2370ebd5370dc48627b139dd2ff9b10 to your computer and use it in GitHub Desktop.
Save bagart/a2370ebd5370dc48627b139dd2ff9b10 to your computer and use it in GitHub Desktop.
example_delivery_notes

Задача

Кодирующие обезьяны использовали все свои бананы, поэтому они заказали 400-килограммовый ящик бананов, которые были доставлены из Бразилии в Лондон.

Чтобы сэкономить деньги, банановый ящик перевозили разными транспортными компаниями, каждая из которых проходила свой путь из Бразилии в Лондон.

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

Ваша задача заключается в следующем:

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

Детали задания

Транспортные накладные это JSON объект соответствующий схеме:

{
    "type": "object",
    "properties": {
        "startLocation":   {"type": "string"},
        "endLocation":     {"type": "string"},
        "transportMethod": {"type": "string"},
        "deliveryCompany": {"type": "string"},
    }
}

Пример транспортной накладной:

{
    "startLocation": "Fazenda São Francisco Citros, Brazil",
    "endLocation": "São Paulo–Guarulhos International Airport, Brazil",
    "transportMethod": "Truck",
    "deliveryCompany": "Correios"
}

Пример упорядоченного списка транспортных накладных:

[
    {
        "startLocation": "Fazenda São Francisco Citros, Brazil",
        "endLocation": "São Paulo–Guarulhos International Airport, Brazil",
        "transportMethod": "Truck",
        "deliveryCompany": "Correios"
    },
    {
        "startLocation": "São Paulo–Guarulhos International Airport, Brazil",
        "endLocation": "Porto International Airport, Portugal",
        "transportMethod": "Flight",
        "deliveryCompany": "LATAM"
    },
    {
        "startLocation": "Porto International Airport, Portugal",
        "endLocation": "Adolfo Suárez Madrid–Barajas Airport, Spain",
        "transportMethod": "Van",
        "deliveryCompany": "AnyVan"
    },
    {
        "startLocation": "Adolfo Suárez Madrid–Barajas Airport, Spain",
        "endLocation": "London Heathrow, UK",
        "transportMethod": "Flight",
        "deliveryCompany": "DHL"
    },
    {
         "startLocation": "London Heathrow, UK",
         "endLocation": "Loft Digital, London, UK",
         "transportMethod": "Van",
         "deliveryCompany": "City Sprint"
     }
]

Написать класс, который будет принимать транспортные накладные в JSON и возвращать готовый сортированный список всех посесещенных пунктов в JSON формате.

Пример формата возвращаемого списока:

[
    "From START_LOCATION_1 to END_LOCATION_1 by TRANSPORT_METHOD (DELIVERY_COMPANY)",
    "From START_LOCATION_2 to END_LOCATION_2 by TRANSPORT_METHOD (DELIVERY_COMPANY)",
    ...
]

Требования

  • Реализация вашего алгоритма сортировки должна работать с любым набором накладных. Можно предположить, что между всеми этапами поездки всегда будет неразрывная цепь.
  • Не допускаются сторонние фреймворки, кроме тех, которые требуются для тестирования. Запустите весь код с нуля.
  • Вы можете использовать Composer, чтобы подключить библиотеку для тестирования и автозагрузчик PSR-4.
  • Используйте Git для контроля изменений кода.
  • Предоставьте файл README.md, содержащий четкие, простые инструкции о том, как выполнить код и тесты.
  • Алгоритм должен иметь минимально возможный порядок сложности, которым вы можете управлять - т.е. это не должно занимать неоправданно долгое время или неоправданно большое кол-во ресурсов для завершения.
  • Если что-то нуждается в разъяснении, которое не детализировано в инструкции, не паникуйте; просто сделайте предположение и запишите это в файле README.md

Что мы ожидаем увидеть

Эта задача призвана дать нам представление о:

  • Вашей способности найти подходящее простое решение для данной проблемы.
  • Как вы структурируете свой код.
  • Ваше понимание ООП.
  • Ваше понимание UNIT-тестирования и/или TDD.
  • Ваша способность использовать системы контроля версий(VCS).
  • Эффективность алгоритма сортировки, который вы реализуете.

Что мы не ожидаем увидеть

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

Work

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment