Първо предизвикателство

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

    Тема за бързи въпроси по първото предизвикателство.

    Нормален магически квадрат от ред n наричаме магически квадрат, който съдържа всички естествени числа от 1 до n**2. Статията за магически квадрати на Wolfram разглежда именно такива. В условието обаче се вижда, че ще се тества дали решението ни разпознава и магически квадрати от вида [[ 1, 1], [ 1, 1]], които очевидно не са.. нормални :grinning: (дори не съществува нормален магически квадрат от втори ред). Така че номерът с елегантното пресмятане на магическа константа няма да мине :unamused:.

  2. Аз само да вметна:

    Правилата за "не пишете глупости" важат. Ако нарушавате конвенции по глупав начин или правите map, в който има i += 1, няма да вземете точки за това. Само казвам :)

  3. И на мен не ми харесваше map-а, но и в момента не ми харесва. Няма ли по-елегантно решение от създай масив, натъпчи го, върни го ? Предполагам ще получа пълен отговор след края :)

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

  4. Имам няколко въпроса:

    1. Някакви skeptic ограничения ще има ли? Примерно 80/100 символа на ред.
    2. Да речем че имам код:

      return something if .... do ...
      end[.method...]
      

      По добре ли е да го напиша като нормален if с return в тялото му? Добре ли е да имаме няколко редово условие примерно с блок в него и на резултата след блока може да се вика някакъв друг метод? Според вас по-добре ли е да си разцепим условието във временни променливи и въобще някакви други смислени идеи?

    П.С. защо единичните нови редове не излизат, а по 2+ си излизат както трябва

  5. (булево условие1) \
    and (булево условие2) \
    and (булево условие3)
    

    Как може това да стане по - стилно? Не искам да е на един ред, защото редът става дълъг, а ако сложа по - кратки имена на променливите в условията ще трябва да ги именувам неконвенционално.

  6. @Нели Проблема ми не е в многото and или or оператори(в случая липсват).

    Проблема ми с постфиксния if е в това че има многоредов(или едноредов, но дълъг) блок в него (do..end) и към блока може да са навързани методи (do...end.method...). За мен лично изглежда леко странно, но все пак четимо. Мисля че ако краткия префиксен израз пред if-a се запише след него ще се загуби част от четимостта(нищо че условието е многоредово, и с блок и т.н.). Интересно ми беше да разбера другите какво мислят.

  7. @Гергана [] е едномерен списък без елементи. Какво е [[]] подлежи на тълкуване, но според условието говорим за матрици, представени като списък от списъци от числа - в този смисъл степента на влагане на скобите би трябвало да указва размерността на обекта, така че [[]] се получава точно празната матрица. Поне моето тълкуване е такова.

  8. Представянето на празната матрица (а и на всяка празна стойност, между другото) е въпрос на договорка. Можеше да се каже, че празната матрица ще бележим с [] или (Боже опази) nil, но това нямаше да внесе никакво подобрение. [[]] от друга страна има потенциала да не се обработва като специален случай (hint, hint). :smiley:

  9. Видях, че на няколко места за намиране на втория диагонал на матрицата се използва Array#transpose... На мен ли ми е зле алгебрата, или транспонирането на матрица не разменяше диагоналите? [1] pry(main)> a = [[1,2],[3,4]] => [[1, 2], [3, 4]] [2] pry(main)> a.each { |row| p row } [1, 2] [3, 4] => [[1, 2], [3, 4]] [3] pry(main)> a.transpose.each { |row| p row } [1, 3] [2, 4] => [[1, 3], [2, 4]] [4] pry(main)> a.reverse.each { |row| p row } [3, 4] [1, 2] => [[3, 4], [1, 2]] [5] pry(main)>

  10. Damn it! Прав си, исках да я обърна, не да я транспонирам там :( Предполагам и другите.. Whatever, не мисля, че това беше най-важното в задачата :)

    Да спомена нещо: Ако пишете някъде в метод return(особено в края му) се замислете дали наистина ви трябва, защото по подразбиране методите връщат последния оценен израз, т.е.

      ...
      requirment1 or requrment2 ...
    end
    

    е същото(по-добро) като:

      ...
      if requirment1
        return true
      if requirment2
        return true
      [return ]false
    end
    
  11. Just FYI, в изборния курс „Увод в теория на кодирането“ (категория математика), г-жа Великова дава за домашно задачи не особено различни от тази (може би малко по-сложни) и дава бонуси, когато някой ѝ ги предаде решени в програмен вид.

    Освен това, задачите от курса са страхотно упражнение по TDD:

    1. Научавате теорията и пишете specs по нея.
    2. Решавате задачите на ръка и пишете specs по тях.
    3. Имплементирате решенията на Ruby :)
    4. Имате 6 на домашно.

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