Свершилось! Мы не одни во Вселенной! Представители огромного числа внеземных цивилизаций разом вышли на контакт! Нас интересует, как далеко они продвинулись в точных науках. Однако, обменявшись базами научных статей и энциклопедий, мы столкнулись с проблемой, что используется невообразимо большое количество систем единиц измерений даже в пределах одной цивилизации!
Теперь нам предстоит понять, сколько Бетельгейзских мйюдов в одном Земном метре или сколько Земных литров вмещает один РасАльгетский йидом.
Предлагается помочь нашим друзьям-учёным и написать 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
- знаменатель.
Сервис должен предоставлять один метод 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
.