Направете gem за Ruby, който да чете, пресмята и записва файлове, съдържащи таблици с формули.
-
Четене и записване на поне два формата - например,
csv,json,ymlили ваш custom такъв. -
Възможност за пресмятане на формули. Вземете за пример следния входен CSV файл:
1,2,3,=MAX(A1:C1),"=SUM(A1:C1)"
Да се пресметне означава да се оценят всички формули. В примера, резултатът ще е
1,2,3,3,6. -
Изпълнима команда към gem-a, която да отваря файл с таблица, да оцени формулите в него и да го запише като нов файл. Пътят към двата файла и форматът на записания файл да се предават като параметри на командата.
-
Библиотеката да може да се
require-ва и използва програматично за:- Четене на таблица от всички поддържани формати
- Промяна на клетки в заредената таблица
- Оценяване на формули за съответната таблица
- Записване на променената таблица в нов файл
- Функциите, които се поддържат във формулите, трябва да са подмножество на тези от ексел. Тоест, синтаксисът трябва да е подобен.
- Да се поддържат като минимум поне по три от всеки от следните видове формули:
- Инфиксни операции - например
A1 + 1,B2 * 5и т.н. - Функции с няколко аргумента - например
ROUND(3.123, 2)иIF - Функции, приемащи range от клетки - например
SUM(A1:C4)
- Инфиксни операции - например
- Функциите трябва да могат да имат за аргументи извиквания на други функции - например
= MUL(SUM(A1, B1), 4). - Програмата не трябва да гърми, ако има грешна клетка, а да се запише грешка само в съответната клетка.
Тоест, неща като
= SUM(A1не трябва да крашват библиотеката. Проучете Excel или Google Spreadsheets какво правят в такъв случай. - Оценяването на клетки трябва да става според връзките им. Ако в
A1има= ROUND(B1), а вB1има= 1 + 3.5, то трябва да се пресметне първоB1.
evalе забранена функция, както и всички други, които директно изпълняват Ruby код от низ.- Забранено е използването на външни библиотеки, които директно оценяват формули в този вид.
- Можете да използвате помощни gem-ове, стига да не имплементират директно функционалността, която се очаква да напишете.
- Очакваме да се постараете с програматичния интерфейс на библиотеката си, така че да бъде удобна за използване от други хора, както и да я покриете с тестове.
- Добавянето на нова функция трябва да става лесно и да се налага промяна в минимален брой файлове.
Например, добавяне на нов клас за функцията и
require-ването му на едно място, или пък добавяне на ламбда функция в списък. - Прочетете тази тема от форума.