gnkoshelev / universal-converter

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Universal Converter

Свершилось! Мы не одни во Вселенной! Представители огромного числа внеземных цивилизаций разом вышли на контакт! Нас интересует, как далеко они продвинулись в точных науках. Однако, обменявшись базами научных статей и энциклопедий, мы столкнулись с проблемой, что используется невообразимо большое количество систем единиц измерений даже в пределах одной цивилизации!

Теперь нам предстоит понять, сколько Бетельгейзских мйюдов в одном Земном метре или сколько Земных литров вмещает один РасАльгетский йидом.

Предлагается помочь нашим друзьям-учёным и написать HTTP-сервис конвертации для всех единиц измерения.

Правила конвертации

Учёные смогли частично составить правила конвертации между инопланетными единицами измерений и предоставили его нам в формате CSV:

S,T,value

Здесь, S и T — единицы измерения, а value соответствует количеству T в одном S.

Пример файла:

м,см,100
мм,м,0.001
км,м,1000
час,мин,60
мин,с,60

В данном примере заданы 5 правил преобразования:

  • 1 м = 100 см
  • 1 мм = 0.001 м
  • 1 км = 1000 м
  • 1 час = 60 мин
  • 1 мин = 60 с

Путь до файла должен передаваться через аргументы при запуске HTTP-сервиса.

Выражения для преобразования

Выражения записываются с использованием заданных в файле обозначений для единиц измерений, используя только знаки умножения * и деления /. При этом знак деления может использоваться не более одного раза и служит для записи обыкновенной дроби.

Примечание. Пробельные символы не учитываются.

Пример "безразмерная величина":

(пустая строка)

Пример "метр":

м

Пример "герц":

1 / с

Пример "метр в секунду":

м / с

Пример "ньютон"

кг * м / с * с

Здесь кг * м - числитель, а c * c - знаменатель.

API

Сервис должен предоставлять один метод POST /convert с JSON в теле запроса:

{
 "from": "<выражение в исходных единицах измерения>",
 "to": "<выражение в единицах измерения, которые необходимо получить>"
}

Возможные варианты ответа:

  • Код 400 Bad Request, если в выражениях используются неизвестные единицы измерения (т.е. отсутствуют в предоставленном файле с правилами конвертации).
  • Код 404 Not Found, если невозможно осуществить такое преобразование (например, нельзя перевести метры в килограммы).
  • Код 200 OK, если преобразование возможно, а в теле ответа передать коэффициент преобразования в виде десятичной дроби с 15 значащими цифрами.

Пример тела запроса:

{
 "from": "м / с",
 "to":  "км / час"
}

И соответствующее тело ответа (предполагается, что CSV-файл взят из примера выше):

3.6

Таким образом, сервис подтвердит возможность преобразования по следующей формуле:

1 м / с = 3.6 км / час

Примеры преобразований

В приведённых примерах используется следующий файл преобразований:

м,см,100
мм,м,0.001
км,м,1000
час,мин,60
мин,с,60

Сервис должен успешно осуществлять преобразования, соответствующие формулам:

1 м = 3.6 км * с / час
1 км / м = 1000

Требования к оформлению решения

  • Компиляция кода и его исполнение c использованием Java 11.
  • Сборка сервиса при помощи Apache Maven командой mvn package.
  • Сервис должен собираться в fat jar, т.е. все зависимости должны быть упакованы внутрь одного jar.
  • Запуск сервиса осуществляется командой java -jar universal-converter-1.0.0.jar /path/to/file.csv, где /path/to/file.csv – путь до файла с правилами конвертации.
  • Сервис должен принимать HTTP-запросы на стандартном порту (80).
  • Исходный код соответствует Java Code Conventions и Google Java Style Guide.

Информация по тестированию

В файле с правилами конвертаций будет не более 1 000 000 различных правил конвертации, а уникальных единиц измерения не более 200 000.

About

License:MIT License