Трета задача

  1. "Ако два елемента на списъка със спецификацията имат еднаква стойност за 'sequence', то те реферират към един и същи генератор, от който продължаваме „да взимаме“ стойности по-късно."

    Какво се случва ако се подаде два пъти 'sequence': 'alphabet' с две различни 'letters'(примерно)? Два различни генератора?

  2. @Николай, това са букви от руската азбука, в българския език не се ползват. В БДС разположението са включени най-вероятно по политически причини :)

    @Янислав, една и съща стойност за sequence означава една и съща инстанция на генератора. Ако при второ срещане има keyword аргументи, ги игнорирайте. (hint: за омешване на няколко азбуки може да се възползвате от generator_definitions)

  3. @Eвгени , ок явно или аз не разбирам какво ми казваш или говорим за различни неща ама по-скоро е първото затова ще пробвам с пример:

    a = [{'sequence': 'alphabet', 'letters': 'bggfdghjhj', 'length': 2},
     {'sequence': 'alphabet', 'letters': 'сдкйбггс', 'length': 2},
     {'sequence': 'alphabet', 'code': 'bg', 'length': 2},
     {'sequence': 'alphabet', 'code': 'lat', 'length': 2},
     ]
    
     print(list(intertwined_sequences(a)))
    

    Какво се очаква да се изведе на екрана?

    ['b','g','с','д','a','б','a','b'] ?
    
  4. Можем ли да използваме помощни функции като например за проверка дали число е просто(понеже не намерих вградена, която да използваме) и ако да, има ли значение дали е глобално дефинирана или да я сложим в тялото на съответната функция, за която е помощна?

  5. @Илиян, името на keyword only аргумента може да е каквото и да било, всъщност е в реда на нещата да има повече от един. Съответствието между дефиницията на генератора и подаденото нещо в списъка с дефиниции е грижа на хората, които ще ползват intertwined_sequences. Имплементацията ти трябва да не се интересува как се казват аргументите, а просто да предава всичко различно от 'sequence' и 'length' към генератра определен в generator_definitions.

  6. Един въпрос от мен: Аз съм със Sublime Text Build 3083. Python 3.4.3 Когато се опитам да принтирам буква от българската азбука не ми принтира нищо. Как това може да се оправи? (така че да е portable, т.е. ако се отвори на друг sublime без допълнителни настойки да работи?)

  7. @Мартин , за да бъде portable , не мисля , че може , тък като проблема не е в кода ти(най-вероятно) ,а е в самият encoding на Sublime build системата ти(поне до колкото знам е така). За да оправиш този проблем , си направи нова билд система или просто добави реда при текущата ти.

    "env": {"LANG": "en_US.UTF-8", "PYTHONIOENCODING": "UTF-8"}

    ако все пак не знаеш за какво говоря все още следвай инструкциите надолу :)

    Tools -> Build System -> New Build System

    Това ще ти отвори нов файл , който е именуван untitled.sublime-build - супер.В него би трябвало да има :

    {
    "shell_cmd": "make"
    }
    

    Ако работиш на UNIX базирана операционна система трябва да го промениш на:

    {
       "shell_cmd": "python -u \"$file\"",
       "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
       "selector": "source.python",
       "env": {"LANG": "en_US.UTF-8", "PYTHONIOENCODING": "UTF-8"}
    }
    

    Aко си на Windows трябва да го промениш на:

    {
        "cmd": ["c:/Python34/python.exe", "-u", "$file"],   #обикновенно това е пътя към Python , ако твоят е друг просто смени този("c:/Python34/python.exe") с твоят.
        "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
        "selector": "source.python",
        "env": {"LANG": "en_US.UTF-8", "PYTHONIOENCODING": "UTF-  8"}
    }
    

    Запазваш файла(съветвам те името да ти подсказва за какъв език е build системата(примерно python3) ). И после трябва да избереш да билдваш файловете си с нея.Ако И това не работи пии една студена вода и ако ме видиш по време на лекция ела ще го оправим ;)

    Интересни работи, който да забележим от поста: Всички sublime-settings/build-settings трябва да бъдат валиден JSON , което означава , че всички стрингове в тях трябва ДА бъдат С "" , а не с '' въпреки , че и двете са валидни стрингове в python.

    Ако все пак нещо не си разбрал драсни един коментар ще видим какво ще направим по въпроса :D

  8. Малък side note:

    Имаше лека неточност в условието, която е поправена(можете да видите точно каква е промяната тук и тук). Повечето предадени до тук решения изискват много малка промяна, за да се съобразят с това.

  9. @Георги, усещам какво имаш предвид и не. :)

    Написах го вече в един коментар, да го кажа и тук в прав текст:

    Извикване на eval в решение автоматично води до нула точки, без значение колко теста минават. :)

  10. Ако имаме две извиквания с един и същ стринг letters продължаваме от където сме стигнали или започваме отново? В този случай:

     a = [{'sequence': 'alphabet', 'letters': 'абвгд', 'length': 1},
         {'sequence': 'primes', 'length': 1},
         {'sequence': 'alphabet', 'letters': 'абвгд', 'length': 1},
         {'sequence': 'primes', 'length': 1},
     ] 

    print(list(intertwined_sequences(a))) кое от двете трябва да върне? Това: [а, 2, а, 3] ли това: [а, 2, б, 3]

  11. По-скоро второто- [а, 2, б, 3]. Като се има предвид един от отговорите на @Евгени:

    @Янислав, една и съща стойност за sequence означава една и съща инстанция на генератора. Ако при второ срещане има keyword аргументи, ги игнорирайте. (hint: за омешване на няколко азбуки може да се възползвате от generator_definitions)

    А и щом това:

    a = [{'sequence': 'alphabet', 'letters': 'bggfdghjhj', 'length': 2},
         {'sequence': 'alphabet', 'letters': 'сдкйбггс', 'length': 2},
         {'sequence': 'alphabet', 'code': 'bg', 'length': 2},
         {'sequence': 'alphabet', 'code': 'lat', 'length': 2},
        ]
    
    print(list(intertwined_sequences(a)))
    

    извежда това: ['b', 'g', 'g', 'f', 'd', 'g', 'h', 'j'] би трябвало при твоя пример да е второто.

  12. @Милка, от условието:

    Ако генератор в generator_definitions се нуждае от аргументи, то те задължително ще имат зададена стойност в първото срещане на генератора в списъка дефиниращ поредността.

    Тоест при първото срещане на генератора ще имаш задължително всички нужни аргументи, а при следващи срешания може и да липсват някои/всички.

  13. @Янислав Василев:
    Аз това с build системата го бях оправил.
    Въпросът ми беше дали тези редове по някакъв начин могат да се сложат в .py файла и да повлияят на build системата(т.е. решението да е portable).
    И благодаря за изчерпателния отговор. :)
    И още нещо:
    Тези настройки след като съм ги направил и предам решението, тестовете при тях ще минават ли при проверката?

  14. @Янислав, според мен са правилни. Като разгледаме този:

    >>> list(intertwined_sequences([
    ...     {'sequence': 'up_to_ten', 'length': 6},
    ...     {'sequence': 'down_from_ten', 'length': 3},
    ...     {'sequence': 'up_to_ten', 'length': 4},
    ...     {'sequence': 'down_from_ten', 'length': 7},
    ... ], generator_definitions={
    ...     'up_to_ten': lambda: range(1, 11),
    ...     'down_from_ten': lambda: range(10, 0, -1)
    ... }))
    

    При първото срещане на up_to_ten и down_from_ten очевидно трябва да върне числата от 1 до 6 и от 10 до 8(вкл.). При следващите извиквания те трябва да продължат да генерират от там, откъдето са спрели, т.е. up_to_ten ще трябва да генерира [7, 8, 9, 10], а down_from_ten ще трябва да генерира от 7 до 1. Получава се точно това, което е дадено за отговор.

    За този:

        intertwined_sequences(
        [
            {'sequence': 'multiples_of', 'length': 5, 'num': 12},
            {'sequence': 'ones', 'length': 3},
            {'sequence': 'multiples_of', 'length': 3}
        ],
        generator_definitions={
            'multiples_of': multiples_of,
            'ones': ones
        }
    )
    

    При първото срещане на multiples_of ще трябва да върне [12, 24, 36, 48, 60] , после [1, 1, 1] и след това пак като срещне multiples_of ще трябва да продължи от там, от където е спряло, т.е. ще трябва да генерира [72, 84, 96].

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

    П.С. Упсс, докато го напиша са го отговорили

  15. "Аргумента подаден на intertwined_sequences може да бъде безкраен генератор"

    ...

    "Приемете, че intertwined_sequences никога няма да бъде извикан с невалидни аргументи, т.е. нещо различно то списък в дефинирания формат за първи аргумент и опционално dict за generator_definitions. "

    Тук има малко противоречие и искам да помоля за малко повече разяснение за този безкраен генератор.Получаваме аргумент, който е или списък [+ речник], или безкраен генератор. Не виждам смисъл в това да получим готов генератор, върху който да не правим нищо.Или искате да кажете, че primes и fibonacci трябва да е възможно да бъдат безкрайни генератори?

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