Skip to content

Latest commit

 

History

History
48 lines (39 loc) · 4.46 KB

File metadata and controls

48 lines (39 loc) · 4.46 KB

Екселски таблици

Направете 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-ването му на едно място, или пък добавяне на ламбда функция в списък.
  • Прочетете тази тема от форума.