Skip to content

Drlionardo/universal-converter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Описание

Решение тестового задани СКБ Контур на летнюю стажировку по направлению Java Backend в 2021 году.
Автор решения Ягупец Данила.
Оригинальный репозиторий с тестовым заданием

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

HTTP RPC converter service

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages