Осма задача

  1. Здравейте,

    В условието като пример е дадено следното:

    sheet = Spreadsheet.new '
      cell1  cell2
      cell3  cell4
    '
    sheet.cell_at("A1") # => "cell1"
    sheet.cell_at("B2") # => "cell4"
    

    В началото, обаче, пише:

    В рамките на един ред, отделните клетки, формиращи колони, могат да са раздеелни по два начина:
    • Със символа "\t" (tab).
    • С два или повече последователни интервала.

    и в примера би трябвало редът ' cell1 cell2' да се раздели на 3 клетки "", "cell1" и "cell2" (разделени с по 2 интервала). И оттук

    sheet.cell_at("A1") # => ""
    sheet.cell_at("B2") # => "cell3"
    

    Аз ли съм в грешка?

    Поздрави

  2. Здравейте,

    Само при формулите ли може да се предизвика изключение или изключение със съобщение "Invalid expression 'израз'" може да се предизвика и при другите възможности за изрази?

    Например какво се случва при изразите:

    "=13abc"
    "=FUNC1, 2, 3)"
    

    Ако изключения се предизвикват само при формулите, то как разбираме, че нещо е формула, за да установим след това, че синтаксиса му е грешен?

    Или приемаме, че числата и референциите към клетка са винаги в правилен формат и ако не е число или референция, то винаги е формула?

  3. @Теодор, разбирам какво поражда объркването. Пише При конструиране на таблица от низ, whitespace-ът около всяка клетка трябва да бъде премахнат., но твоята интерпретация не се опровергава изрично от това изречение.

    Поведението трябва да е както в примерите.

    @Здравко, Една клетка се счита за формула, ако започва със символ за равенство. Ако клетка започва с =, но няма синтаксис на формула, трябва да се предизвика изключение.

    И двете неща вече са доизяснени изрично в условието.

  4. С този интерфейс не можеш да създадеш таблица с празна клетка. Както и клетка, съдържаща две празни места едно след друго, или празно място в началото си.
    Не се грижи за тези случаи. Таблиците, които подаваме, няма да имат празни клетки.

    Ако трябваше да се поддържат и празни клетки, щеше да се наложи да се направи по-строг форматът на низа. Например, да се имплементира някакъв механизъм за escape-ване.
    Това не е нещо трудно, но фокуса на задачата не е върху парсването на строг формат, а върху механизма за изчисление на формули.

  5. @Георги Киряков, не, записът в примерния тест е правилен. Символът = е само в началото на клетка, когато имаме формула/израз. Просто след равното трябва да може да е директно име на клетка.

    @Алекс, логично първо би трябвало да е синтактичната грешка, но няма да има такива тестове.

  6. @Теодор, след прилагане на правилата за разделяне на редове и колони, описани в условието, низът:

    "\t\t=ADD(\t\t1   ,   3,  18   )"
    

    Ще бъде разделен по следния начин:

    | "=ADD(" | "" | "1" | "," | "3," | "18" | ")" |

    Следователно:

    1. s['A1'] няма да счете формулата за валидна.
    2. s.cell_at 'A1' ще върне низа =ADD(.
    3. to_s трябва да гръмне.

    В условието не е указано, че разделителите за колони могат да бъдат escape-вани по някакъв начин, или че вътре във формула не важат.

  7. Здрасти :)

    В ограниченията има "Изисква да ползвате само комбинации валидни английски думи за именуване, със следните изключения:" но не следват изключенията. Това значи ли, че няма изключения?

    Поздрави

  8. Въпрос № 1:
    Ако имаме следната таблица

    1    2.2    3
    =ADD(B1, C2)    4    5
    

    #to_s какво трябва да върне

    1    2.2    3
    6.20    4    5
    or
    1    2.20    3
    6.20    4    5
    

    Въпрос № 2:
    Правилно ли разбирам: "След символа = и преди началото на израза може да има нула или повече интервала."

     1    2    =   ADD(3, 4)
    

    Таблицата е валидна и не трябва да се интерпретира като: |1|2|=|ADD(3, 4)|

    И е изключение от: "В рамките на един ред, отделните клетки, формиращи колони, могат да са разделени по два начина: Със символа "\t" (tab). С два или повече последователни интервала."

  9. @Георги Стефанов, каскадните референции би трябвало да работят. Няма да тестваме случаи, в които има циклични референции.

    @Веселин, да, няма изключения. Ако смяташ, че има нужда да добавим нещо смислено, кажи, но имай предвид, че има възможност да се напише решение и без изключения.

    @Георги Киряков, на въпрос 1), трябва да върне вариант едно – клетката B1 не трябва да е променена.

    На въпрос 2) - не, не е такава интерпретацията, не е изключение от правилото за разделяне на ред на клетки. Таб или два или повече интервала винаги разделят ред на клетки. Приемете, че първо се прилага правилото за разделяне на ред на клетки и чак след това – останалите правила за премахване на whitespace.

  10. *Във връзка с последния въпрос и отговор.

    Тогава условието би трябвало да бъде модифицирано леко от:

    Параметрите на формулите са разделени със запетая, като преди и след запетаята може да има нула или повече whitespace символа.

    на:

    Параметрите на формулите са разделени със запетая, като преди и след запетаята може да има нула или един whitespace символа.

  11. Благодаря!

    Извинявам се, че повторих въпроса.

    Друг въпрос: Празната таблица означава ли, че нищо не е подадено на конструктора ?

    По условие празни клетки няма да се подават, но може ли да се подаде таблица

        "       "
    

    например?

  12. Да, можеше условието да е по-ясно в тази част, признавам :)

    @Георги, да, може да се подаде такава таблица. Това, като се приложат правилата, описани в условието, в реда, в който са описани, ще доведе до празна таблица.

  13. Имаме в дадена клетка "=FOO(1,2,)". Каква грешка би излязла : Невалиден синтаксис , заради запетаята без нищо след нея, или непозната функция "FOO"?

    Друг въпрос: Това валиден синтаксис ли е FOO (1,2,3) - тоест между името на формулата и параметрите да има 1 интервал?

    Трети въпрос: Подобен на първия : "=FOO(1,bar)" - Тук изразът съдържа "формула", но в аргументите има нещо различно от число или индекс на клетка. Формулата също е с непознато име. Каква грешка би изляза в случая - невалиден израз или непозната формула?

  14. Здравейте,

    В някои от описаните примери за индекси на клетки сте ползвали символа 'А' от кирилица и сте върнали валидна клетка. Например:

    BА42" – 53-тата клетка на 42-рия ред.

    Това ли е очакваното поведение, когато видим символ от кирилица, или трябва да връщаме грешка?

  15. Методът "[]" върху клетка със стойност "=42.234" би трябвало да върне "42.23". Ако клетката съдържа само число без знак за равенство, не се счита за израз и тогава се връща същият низ, който е записан в клетката като са премахнати whitespace-овете в началото и в края на клетката. Това е интерпретацията ми на условието: така ли трябва да е?

    Благодаря предварително!

  16. @Георги Стефанов, да, интерпретацията ти е правилна.

    Колкото до по-ранния ти въпрос за =FOO(1,bar) – няма да има тест с подобна "двойна" грешка – привидно валиден израз, но невалидна функция и невалиден аргумент. Това е недефинирано в условието поведение и затова няма да го тестваме. Направете го както искате.

Трябва да сте влезли в системата, за да може да отговаряте на теми.